漫天飞雪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

udp协议又称数据报协议。不像TCP那样的流式发送报文,所以没有粘包问题。
客户端发送一个数据报,服务端接收一个数据报。
udp通信不需要建立连接,随发随收,但是无保障是其一个缺点。

服务端:
from socket import *

server=socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080))

while True:
data,addr=server.recvfrom(1024)
print(data)
server.sendto(data.upper(),addr)
server.close()
客户端:
from socket import *
client=socket(AF_INET,SOCK_DGRAM)

while True:
msg=input('>>>>>:').strip()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,addr=client.recvfrom(1024)
print(data)

由于udp通信不需要建立连接,所以可以实现表面上的并发编程。其实当访问服务器人数过多时,就达不到并发效果了。所以引入了socketserver模块。

引入socketserver模块,需要修改的是服务器的程序,在服务端import socketserver
导入模块后,需要定义一个类,继承socketserver.BaseRequestHandler类。并重写父类的handle方法。在handle方法内,要进行的是循环通信。

class MyUdphandler(socketserver.BaseRequestHandler):
def handle(self):
data,sock=self.request
sock.sendto(data.upper(),self.client_address)
server=socketserver.ThreadingUDPServer(('127.0.0.1',8081),MyUdphandler)
server.serve_forever()
TCP中的socketserver
服务端:
import socketserver

class MyTcpHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
data=self.request.recv(1024)
if len(data)==0:break
print('收到客户端消息',data)
self.request.send(data.upper())
except ConnectionResetError:
break
self.request.close()

if __name__ == '__main__':
server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcpHandler)
server.serve_forever()

客户端:
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))

while True:
msg=input('>>>>:').strip()
if len(msg)==0:continue
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data)
client.close()


在UDP套接字编程中,实例化ThreadingUDPServer类,在TCP编程中,实例化ThreadingTCPServer类,参数为(IP地址和PORT的元组),以及(自定义的类)。
并使用server_forever()方法实现并发操作。

UDP中的sockserver

服务端:
import socketserver

class MyUdpHandler(socketserver.BaseRequestHandler):
def handle(self):
data,sock=self.request
print('来至客户端信息:%s'%data)
sock.sendto(data.upper(),self.client_address)

if __name__ == '__main__':
server=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdpHandler)
server.serve_forever()

客户端:
from socket import *

client=socket(AF_INET,SOCK_DGRAM)

while True:
msg=input('>>>>>:').strip()
if len(msg)==0:continue
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,addr=client.recvfrom(1024)
print('来至服务端信息:%s' % data)
posted on 2018-12-27 09:03  漫天飞雪世情难却  阅读(105)  评论(0编辑  收藏  举报