Python socket 基础(Client) - Foundations of Python Socket
Python socket 基础- Foundations of Python Socket
建立socket - establish socket
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# s = 通信类型(type) + 协议家族(protocol)
# AF_INET = IPV4 ; AF_INET6 = IPV6
# SOCK_STREAM = TCP ; SOCK_DGRAM UDP s.connect(("www.zzyzz.top",80))
# s.connect((IP,PORT))
# python 中 socket 对象的 connect()方法会利用 DNS 把域名解析成 IP 寻找端口号 - detect the port
port = socket.getservbyname('http','TCP')
# 查询系统特定服务的端口号, 小于1024 由 IANA(Internet Assigned Numbers Authority)分配.
# socket.getservbyname( protocol name, port name) 从 socket 获取信息 - get info. from socket
sname = s.getsockname()
# 返回一个 tuple (client IP, client port), 对于客户端, 端口号由操作系统分配
pname = s.getpeername()
# 得到一个 tuple (sever IP, server port) socket 通信 - communication via socket
python 提供了 2 种通信方式:socket 对象 和 文件类对象
socket 对象的方法,
send()
sendto()
recv()
recvfrom() 文件类对象对应的方法,
read()
write()
readline() 异常处理 - process exceptions
python 的 socket 模块定义了 4 种可能出现的异常,
socket.error , 与 I/O 和 通信 有关的异常
socket.gaierror , 与 查询地址信息有关的异常
socket.herror , 与其他地址错误相关的异常
socket.timeout , 超时有关的异常(在一个 socket 对象上调用 settimeout()) 例子,
try:
s.connect(("www.zzyzz.top", 80))
except socket.gaierror as e:
print("Address related error : %s" % e)
except socket.error as e:
print("Connection error : %s" % e) output,
#1 Address related error : [Errno 11001] getaddrinfo failed -> socket.gaierror
#2 Connection error : [WinError 10060] A connection attempt -> socket.error
failed because the connected party did not properly respond
after a period of time, or established connection failed
because connected host has failed to respond
socket 模块可以把域名转换成IP地址(DNS), 有可能看到两中错误,
一种是域名错误,会得到 socket.gaierror , 另一种是链接远程 server 的 socket.error. 完整的 socket 建立的例子,
socket 对象类通信示例,
import socket try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error as e:
print("Error at creating socket : %s" % e) try:
s.connect(("www.zzyzz.top", 80))
except socket.gaierror as e:
print("Address related error : %s" % e)
except socket.error as e:
print("Connection error : %s" % e) try:
s.send("HELLO THERE!".encode())
except socket.error as e:
print("Error at sending data : %s" % e) try:
s.shutdown(1)
except socket.error as e:
print("Error at sending data(shutdown) : %s" % e) #数据只有在调用了 shutdown() 方法后才能确保被发送. while 1:
try:
recv = s.recv(1024)
except socket.error as e:
print("Error at receiving data : %s" % e)
if not len(recv):
print("Data received")
break 文件类对象通信示例,
可以通过 makefile() 方法从 socket 对象得到一个文件类对象,实际上这个文件类对象调用的还是 socket,
所以由文件类对象产生的异常和 socket 对象的 send() 和 recv() 方法是一样的.
import socket
try:
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except socket.error as e:
print("Error at creating socket : %s" % e) try:
s.connect(("www.zzyzz.top", 80))
except socket.gaierror as e:
print("Address related error : %s" % e)
except socket.error as e:
print("Connection error : %s" % e) FH = s.makefile('rwb',0) # 第一参数是 模式:读,写,读写; 第二个参数是 buffer size
try:
FH.write("HELLO THERE!".encode())
except socket.error as e:
print("Error at sending data : %s" % e) try:
FH.flush() # 由于在 makefile() 方法指定了 buffer size 是 0,
# 所以这例的 flush() 方法的调用时非必须地
except socket.error as e:
print("Error at sending data(flush) : %s" % e) try:
s.shutdown(1) # 即使调用 makefile(), 也要保存 socket 对象.
# makefile() 返回的文件类对象并不提供对 shutdown() 的调用
# 所以要保存原始 socket 对象, 并在其上调用 shutdown()
# 数据只有在调用了 shutdown() 方法后才能确保被发送.
s.close()
except socket.error as e:
print("Error at sending data(shutdown) : %s" % e) while 1:
try:
recv = FH.read(1024)
except socket.error as e:
print("Error at receiving data : %s" % e)
if not len(recv):
print("Data received")
break
Summarize,
对于客户端来说,建立一个 TCP 链接的过程分两步,
1, 建立 socket 对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2, 调用 connect() 方法, 建立跟服务断(server)的链接.
s.connect(("www.zzyzz.top", 80))
Python socket 基础(Client) - Foundations of Python Socket的更多相关文章
- Python socket 基础(Server) - Foundations of Python Socket
Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- Python零基础学习系列之三--Python编辑器选择
上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...
- Python零基础学习系列之四--Python程序设计思想
前面我们把Python环境安装成功,同时也选择了自己合适的IDE工具来开启自己的编程之旅. 那么今天来说说怎么编程,程序设计需要什么步骤,我们应该怎么做才能编写自己的程序. 1-1.程序设计方法: I ...
- 【python语法基础-经典练习题】python语法基础练习题01---商场打折
# 1.一家商场在降价促销.如果购买金额50-100元(包含50元和100元)之间,会给10%的折扣(打九折),# 如果购买金额大于100元会给20%折扣.编写一程序,询问购买价格,再显示出折扣(%1 ...
- 大牛整理最全Python零基础入门学习资料
大牛整理最全Python零基础入门学习资料 发布时间:『 2017-11-12 11:56 』 帖子类别:『人工智能』 阅读次数:3504 (本文『大牛整理最全Python零基础入门学习资料 ...
- php Socket基础
◆ Socket 基础PHP使用Berkley的socket库来创建它的连接.socket只不过是一个数据结构.你使用这个socket数据结构去开始一个客户端和服务器之间的会话.这个服务器是一直在监听 ...
- 【Python】-NO.96.Note.2.Python -【Python 基础】
1.0.0 Summary Tittle:[Python]-NO.95.Note.1.Python -[Python 老男孩 基础]- Style:Python Series:Python Since ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
随机推荐
- 【原创】Android adb错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件。”处理方法
才刚刚接触Android没多久,现在使用adb命令的时候出现错误“'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件.”,如下图所示: 这个问题一般有两种可能: 1.就是没有配置环境变量, ...
- python 作用域,global与nonlocal的区别
在Python中并不是所有的语句块中都会产生作用域.只有当变量在Module(模块).Class(类).def(函数)中定义的时候,才会有作用域的概念. 如果在函数中要对全局变量做改变可以使用glob ...
- 【 Tomcat 】tomcat8.0 基本参数调优配置-----(1)
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证文件 ...
- javascript DOM练习
一.定时器 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...
- AVL练习题——宠物收养所
题目描述 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特殊的公式,得出 ...
- Math.Atan2 方法
返回正切值为两个指定数字的商的角度. public static double Atan2 ( double y, double x ) 参数 y 点的 y 坐标. x 点的 x 坐标. 返回值 角 ...
- Java 8 Stream流编程学习
本文是自己学习菜鸟教程中总结的笔记,用于快速找代码,完整的文档见菜鸟教程:Java 8 Stream Stream 使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达 ...
- Quantitative Trading with R(一):两个简单的策略
下面是两个使用R中的Quantstrat包进行策略构建的例子,都是对600550.ss.600192.ss.600152.ss.600644.ss.600885.ss.600151.ss六只股票进行投 ...
- SpringBoot任务篇Ⅴ --- 异步任务、定时任务、邮件任务
Java的任务在项目中需要用到的地方很多,比如,每月月末的财务报表给财务部门,定时给领导发个邮件短信等等.这时候我们就需要用到任务了,任务调度本身涉及到多线程并发.运行时间规则制定和解析.场景保持与恢 ...
- springcloud Eureka设置服务下线上线事件通知
最近由于微服务会莫名其妙挂掉,导致一些服务宕机: 固所以寻找解决办法,莫名宕机暂时还未查明原因,先人肉解决办法 Eureka的server端会发出5个事件通知,分别是: EurekaInstanceC ...