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()
View Code

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()
View Code
 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()
View Code

 二、基于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()
View Code

(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()
View Code
 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()
View Code

 

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()
View Code

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()
View Code
posted @ 2019-12-18 22:27  四方游览  阅读(181)  评论(0)    收藏  举报