一,基于tcp协议通信
服务端必须满足的至少三点:
1,绑定一个固定的Ip和port
2,一直对外提供服务,稳定运行
3,能够支持并发
import socketserver
# 自定义类用来处理通信循环
class MyTCPhanler(socketserver.DatagramRequestHandler):
def handle(self):
while True: # 通讯循环
try:
data = self.request.recv(1024)
if len(data) ==0:break # 针对linux系统
print('>>>>:收到客户端的消息:',data)
# self.request为服务端的地址
self.request.send(data.upper())
except ConnectionResetError:
break
self.request.close()
if __name__ == '__main__': # 用于判断是执行文件还是模块
server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTCPhanler)
server.serve_forever() #循环链接
客户端(sockeyserver模块不用改客户端的内容只在服务端加个通信循环的类即可)
from socket import *
client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))
# 通讯循环
while True:
msg = input('>>:').strip()
if not msg:continue
client.send(msg.encode('utf-8')) #client.send(b'')
data = client.recv(1024)
print(data)
client.close()
二,基于udp协议通信
服务端
import socketserver
class MyUdphandler(socketserver.BaseRequestHandler):
def handle(self):
# self对象调用内置的request方法得到一个元组,第一个值是数据,第二个是服务端的地址
data,sock = self.request
#发送端的地址. sendto(发送的数据,接收端到的地址)
sock.sendto(data.upper(),self.client_address)
if __name__ == '__main__': # 用于判断是执行文件还是模块
server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdphandler)
server.serve_forever()
客户端(sockeyserver模块不用改客户端的内容只在服务端加个通信循环的类即可)
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
while True:
msg = input('>>>:').strip()
if not msg:continue
client.sendto(msg,('127.0.0.1',8080))
data,server_addr = client.recvfrom(1024)
print(data)