Python网络编程基础 ❷ 基于upd的socket服务 TCP黏包现象
一、TCP的长连接
tcp模拟qq:
1、server端
1 import socket 2 3 # 聊天多人版 4 5 sk = socket.socket() 6 sk.bind(('127.0.0.1', 9099)) 7 sk.listen() 8 9 while 1: 10 conn, addr = sk.accept() 11 while 1: 12 msg = conn.recv(1024).decode('utf-8') 13 if msg == 'bye': 14 conn.send(b'bye') 15 break 16 print(addr) 17 print(msg) 18 ipt = input('>>>').encode('utf-8') 19 conn.send(ipt) 20 conn.close() 21 22 sk.close()
2、client端们
1 import socket 2 # 客户端之一 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 9099)) 5 while 1: 6 ipt = input('>>>').encode('utf-8') 7 sk.send(ipt) 8 9 msg = sk.recv(1024).decode('utf-8') 10 if msg == 'bye': 11 sk.send(b'bye') 12 break 13 print(msg) 14 sk.close()
1 import socket 2 # 客户端之二 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 9099)) 5 while 1: 6 ipt = input('>>>').encode('utf-8') 7 sk.send(ipt) 8 9 msg = sk.recv(1024).decode('utf-8') 10 if msg == 'bye': 11 sk.send(b'bye') 12 break 13 print(msg) 14 sk.close()
二、基于upd的socket服务
1、服务器端的代码
1 import socket 2 3 sk = socket.socket(type=socket.SOCK_DGRAM) 4 sk.bind(('127.0.0.1', 8088)) 5 6 msg, addr = sk.recvfrom(1024) 7 print(msg.decode('utf-8')) 8 sk.sendto(b'hi', addr) 9 10 sk.sendto('hello client'.encode('utf-8'), addr) 11 12 sk.close()
2、客户端的代码
1 import socket 2 3 sk = socket.socket(type=socket.SOCK_DGRAM) 4 ip_port = ('127.0.0.1', 8088) 5 sk.connect(ip_port) 6 7 sk.sendto('你好啊?'.encode('utf-8'), ip_port) 8 9 msg,addr = sk.recvfrom(1024) 10 print(msg.decode('utf-8')) 11 print(msg.decode('utf-8')) 12 13 sk.sendto(b'hi', addr) 14 15 sk.close()
3、使用udp模拟qq聊天
(1)、服务器端的代码
1 import socket 2 3 sk = socket.socket(type=socket.SOCK_DGRAM) 4 sk.bind(('127.0.0.1', 9199)) 5 6 while 1: 7 msg, addr = sk.recvfrom(1024) 8 msg = msg.decode('utf-8') 9 print(addr,msg) 10 if msg == 'bye': 11 sk.sendto(b'bye', addr) 12 break 13 ipt = input('>>>').encode('utf-8') 14 sk.sendto(ipt, addr) 15 16 sk.close()
(2)、客户端代码
1 import socket 2 # 客户端1 3 sk = socket.socket(type=socket.SOCK_DGRAM) 4 ip_port = ('127.0.0.1', 9199) 5 6 while 1: 7 ipt = input('>>>').encode('utf-8') 8 sk.sendto(ipt, ip_port) 9 msg, addr = sk.recvfrom(1024) 10 msg = msg.decode('utf-8') 11 print(addr,msg) 12 if msg == 'bye': 13 sk.sendto(b'bye', addr) 14 break 15 16 sk.close()
1 import socket 2 #客户端二 3 sk = socket.socket(type=socket.SOCK_DGRAM) 4 ip_port = ('127.0.0.1', 9199) 5 6 while 1: 7 ipt = input('>>>').encode('utf-8') 8 sk.sendto(ipt, ip_port) 9 msg, addr = sk.recvfrom(1024) 10 msg = msg.decode('utf-8') 11 print(addr,msg) 12 if msg == 'bye': 13 sk.sendto(b'bye', addr) 14 break 15 16 sk.close()
TCP黏包现象
使用例子来解释黏包,在服务器端输入命令,客户端执行,如:dir、cd、ipconfig等
会发现,如果返回结果过多,一次会显示不了,再输另外一个命令时才出来。
1、服务器端
1 import socket 2 3 sk = socket.socket() 4 sk.bind(('127.0.0.1', 8080)) 5 sk.listen() 6 7 conn, addr = sk.accept() 8 9 while 1: 10 ipt = input('>>>').encode('gbk') 11 conn.send(ipt) 12 msg = conn.recv(1024).decode('gbk') 13 print(msg) 14 15 conn.close() 16 17 sk.close()
2、客户端
1 import socket, subprocess 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 8080)) 5 6 while 1: 7 msg = sk.recv(1024).decode('utf-8') 8 print(msg) 9 sp = subprocess.Popen(msg, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 10 sk.send(sp.stdout.read()) 11 sk.send(sp.stderr.read()) 12 13 sk.close()

浙公网安备 33010602011771号