Python socket通信
1.socket服务端
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.bind(address) 5 sk.listen(3) 6 conn,add=sk.accept() 7 print(conn,add) 8 # conn.send(bytes('约吗','utf8')) 9 # print('发完了') 10 data=conn.recv(1024) 11 print('收到的数据为%s'%(str(data,'utf8'))) 12 13 #<socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 4000)> ('127.0.0.1', 4000) 14 #收到的数据为我是你哥
服务端主要的步骤为:
1.1socket建立socket套接字对象(TCP协议)
1.2bind绑定服务器的IP、Port到此套接字对象(传入参数为tuple)
1.3listen监听客户端请求,参数为监听最大等待数,正在连接通信的客户端不计算在内
1.4accept阻塞进程,直到客户端请求,返回值为服务器端的协议内容和客户端的地址端口
注意:服务器的接收和发送均使用conn对象,这是由于服务器端的socket套接字匹配多个客户端无法定位区分客户端,conn中包含客户端信息
1.5send,sendall函数为发送数据函数,PY3中要求必须为bytes类型数据,可以使用bytes(data,'utf8')来进行转换
1.6recv函数为接收数据函数,PY3接收的数据为bytes类型,可以使用str(data,'utf8')来进行转换
2.socket客户端
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.connect(address) 5 sk.send(bytes('我是你哥','utf8')) 6 print('发完了') 7 # data=sk.recv(1024) 8 # print('接收到的数据为%s'%(str(data,'utf8'))) 9 10 #发完了
2.1socket建立套接字对象
2.2connect建立到服务器地址端口的连接请求,阻塞进程直到服务器回复
注意:客户端的接收和发送均使用sk对象,这是由于客户端socket套接字匹配一个服务器,不会混乱
3.补充
3.1建立套接字参数 socket.socket()
AF_INET:服务器之间的通信ipv4
AF_INET6:服务器之间的通信ipv6
AF_UNIX:Unix不同进程间的通信
SOCK-STREAM :TCP
SOCK_DGRAM :UDP
4.实现服务器端与客户端不间断通信,可以多次回话,客户端可以断开连接二服务端断开与单个客户端的连接,仍然可以接受其他客户端的连接请求
服务器端
方案一:
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.bind(address) 5 sk.listen(3) 6 conn,add=sk.accept() 7 print(conn,add) 8 while True: 9 data=conn.recv(1024) 10 print('%s'%(str(data,'utf8'))) 11 if not data: 12 conn.close() 13 conn,add=sk.accept() 14 print(add) 15 continue 16 inp=input('>>>') 17 conn.send(bytes(inp,'utf8')) 18 sk.close()
方案二:
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.bind(address) 5 sk.listen(3) 6 while True: 7 conn,add=sk.accept() 8 print(conn,add) 9 while True: 10 data=conn.recv(1024) 11 print('%s'%(str(data,'utf8'))) 12 if not data: 13 conn.close() 14 conn,add=sk.accept() 15 print(add) 16 continue 17 inp=input('>>>') 18 conn.send(bytes(inp,'utf8')) 19 sk.close()
客户端:
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.connect(address) 5 while True: 6 inp=input('>>>') 7 if inp=='exit': 8 break 9 sk.send(bytes(inp,'utf8')) 10 data=sk.recv(1024) 11 print('%s'%(str(data,'utf8')))
客户端输入"exit"则断开与服务器端的连接
当客户端以非正常方式退出(强制退出程序)时,以上代码windows服务器端会抛异常,linux不会抛出异常
优化后为:不抛出异常,继续等待其他客户端的连接
1 import socket 2 sk=socket.socket() 3 address=('127.0.0.1',8080) 4 sk.bind(address) 5 sk.listen(3) 6 while True: 7 conn,add=sk.accept() 8 print(conn,add) 9 while True: 10 try: 11 data=conn.recv(1024) 12 except Exception: 13 break 14 15 print('%s'%(str(data,'utf8'))) 16 if not data: 17 conn.close() 18 conn,add=sk.accept() 19 print(add) 20 continue 21 inp=input('>>>') 22 conn.send(bytes(inp,'utf8')) 23 sk.close()
浙公网安备 33010602011771号