day 33 udp协议,socketserver模块

udp协议

# 基础版本
sever:

import socket
server=socket.socket(type=socket.SOCK_DGRAM)

server.bind(('127.0.0.1', 8003))
# udp不要建立连接,直接发
#不需要监听
# data=server.recvfrom(1024)
data,addr=server.recvfrom(1024)
#data 是个元组,第一个参数是数据不部分,第二个参数是客户端地址
server.sendto(data.upper(),addr)

client:
import socket

client=socket.socket(type=socket.SOCK_DGRAM)
#直接发
client.sendto(b'lqz',('127.0.0.1', 8003))
data=client.recvfrom(1024)
print(data)


#加入通信循环
server:
import socket
server=socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8003))

while True:
data,addr=server.recvfrom(1024)
server.sendto(data.upper(),addr)

client:
import socket
client=socket.socket(type=socket.SOCK_DGRAM)
while True:
  msg=input('>>:')
    #直接发
client.sendto(msg.encode('utf-8'),('127.0.0.1', 8003))
data=client.recvfrom(1024)


#udp是否粘包
udp特点:
-可以发空(数据报协议,自带头)
-客户端和服务端可以有一方没在线(因为不需要建立连接)
udp 协议没有粘包问题(udp协议又叫数据报协议),可以发空,tcp不行


socketserver模块
用socketsever模块来写服务端

#tcp协议

client
import socket
soc=socket.socket()
soc.connect(('127.0.0.1',8009))
while True:
soc.send('xxxx'.encode('utf-8'))
print(soc.recv(1024))

server
import socketserver
#自己定义一个类,必须继承BaseRequestHandler
class MyTcp(socketserver.BaseRequestHandler):
#必须重写handle方法
def handle(self):
try:
while True : #通信循环
# print(self)
#给客户端回消息
#conn对象就是request
#接收数据
print(self.client_address)
data=self.request.recv(1024)
print(data)
if len(data)==0:
return
#发送数据
self.request.send(data.upper())
except Exception:
pass
if __name__ == '__main__':
#实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
#第一个参数是绑定的地址,第二个参数传一个类
server=socketserver.ThreadingTCPServer(('127.0.0.1',8009),MyTcp)
#一直在监听
#这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
server.serve_forever()
#udp协议
client
import socket
client=socket.socket(type=socket.SOCK_DGRAM)
client.sendto('lqz'.encode('utf-8'),('127.0.0.1', 8009))
# client.sendto('hello'.encode('utf-8'),('127.0.0.1', 8009))
# client.sendto('world'.encode('utf-8'),('127.0.0.1', 8009))
# client.sendto(''.encode('utf-8'),('127.0.0.1', 8009))
data=client.recvfrom(1024)
print(data)

server
import socketserver

#自己定义一个类,必须继承BaseRequestHandler
class MyTcp(socketserver.BaseRequestHandler):
#必须重写handle方法
def handle(self):
print(self)
#数据
print(self.request[0])
print(self.request[1])
print(type(self.request[1]))
self.request[1].sendto('xxxx'.encode('utf-8'),self.client_address)
# try:
# while True : #通信循环
# data=self.request.recvfrom(1024)
# print(data)
# except Exception:
# pass


if __name__ == '__main__':
#实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
#第一个参数是绑定的地址,第二个参数传一个类
server=socketserver.ThreadingUDPServer(('127.0.0.1',8009),MyTcp)
#一直在监听
server.serve_forever()
 
 
 
原文地址:https://www.cnblogs.com/wwei4332/p/11493968.html