对 Python Socket 编程的初探 学习资料.docx
文本预览下载声明
socket编程步骤
服务端创建一个socket,绑定地址和端口,然后监听端口上传入的连接,一旦有连接进来,就通过accept函数接收传入的连接。
客户端也是创建一个socket。绑定远程地址和端口,然后建立连接,发送数据。
服务端socket
下面通过一段实例代码来详细说明
服务端 socker_server.py
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
importsocket
importsys
?
HOST=??????????????
PORT=10000??????????????
s=None
forres insocket.getaddrinfo(HOST,PORT,socket.AF_UNSPEC,
??????????????????????????????socket.SOCK_STREAM,0,socket.AI_PASSIVE):
????af,socktype,proto,canonname,sa=res
????try:
????????s=socket.socket(af,socktype,proto)
????exceptsocket.error asmsg:
????????s=None
????????continue
????try:
????????s.bind(sa)
????????s.listen(5)
????exceptsocket.error asmsg:
????????s.close()
????????s=None
????????continue
????break
ifsisNone:
????printcould not open socket
????sys.exit(1)
conn,addr=s.accept()
printConnected by,addr
while1:
????data=conn.recv(1024)
????ifnotdata:break
????conn.send(data)
conn.close()
首先我们通过socket.getaddrinnfo函数将host/port转换成一个包含5元组的序列。这个5元组包含我们创建一个socket连接所需要的所有必要参数。返回的5元组分别是 (family, sockettype, proto, canonname, sockaddr)
family 地址簇,用与socket()函数的第一个参数。主要有以下几个 qq1900526093
socket.AF_UNIX 用与单一机器下的进程通信
socket.AF_INET 用与服务器之间相互通信,通常都用这个。
socket.AF_INET6 支持IPv6
sockettype socket类型,用与socket()函数的第二个参数,常用的有
socket.SOCK_STREAM 默认,用于TCP协议
socket.SOCK_DGRAM 用于UDP协议
proto 协议,用于socket()函数的第三个参数。 getaddrinnfo函数会根据地址格式和socket类型,返回合适的协议
canonname 一个规范化的host name。
sockaddr 描述了一个socket address .是一个二元组,主要用于bind()和connect()函数
接下来创建一个socket对象,传入getaddrinnfo函数返回的af,sockettype,proto。
Python
1
s=socket.socket(af,socktype,proto)
然后绑定socket address
Python
1
s.bind(sa)
开启监听模式
Python
1
s.listen(5)
listen函数会监听连接到socket上的连接,参数表示在拒绝连接之前系统可以挂起的最大连接队列数量为5。这些连接还没有被accept处理。数量不能无限大,通常指定5。
一旦我们监听到了连接,就会调用accept函数接收连接
Python
1
conn,addr=s.accept()
accept函数返回一个二元组,conn是一个新的socket对象,用来接收和发送数据。addr表示另一端的socket地址。
接下来我们就可以用conn对象发送和接收数据了
Python
1
2
data=conn.recv(1024)# 接收数据, 这里指定一次最多接收的字符数量为1024
conn.send(data)# 发送数据
这里我们接收到一个连接socket就会停止运行,所以如果要循环连接的话,将accept函数放
显示全部