基于udp协议和tcp协议的支持并发的套接字通信

基于udp协议的套接字通信
1、tcp协议是可靠协议:
对方必须回复-ack确认信息,才会将自己这端的数据从内存中删除
udp协议是不可靠协议:
发送一条消息就会立即删除,不管对方是否接受到
2、有无链接
tcp由链接,udp无链接
3、传输数据的效率
udp更高
4、粘包问题
udp协议称之为数据报协议,每次发送都是一个完整数据报,一个发送唯一对应一个接受,所以udp协议没有粘包问题
先启动客户端是否可以 可以
服务端是否需要listen 不需要,因为没有建立链接
udp协议应用场景 用于聊天设备

#========基于udp套接字通信=========
#服务端
from socket import *
import time
server = socket(AF_INET,SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
while True:
    data,client_addr = server.recvfrom(1024)
    time.sleep(10)
    server.sendto(data.upper(),client_addr)
#客户端
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
while True:
    msg = input('>> ').strip()
    client.sendto(msg.encode(),('127.0.0.1',8080))
    data,serve_addr = client.recvfrom(1024)
    print(data.decode())

基于udp协议和tcp协议的支持并发的套接字通信

#并发udp服务端
import socketserver
class MyRequestHandler(socketserver.BaseRequestHandler):
    def handle(self)
        data,server = self.request
        server.sendto(data.upper(),self.client_address)
if __name__ == '__main__':
    s = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyRequestHandler,bind_and_activate=True)
#客户端
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
while True:
    msg = input('>> ').strip()
    client.sendto(msg.encode(),('127.0.0.1',8080))
    data,server_addr = client.recvfrom(1024)
    print(data.decode())
#并发tcp服务端
import socketserver
class MyRequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.client_address)
        while True:
            try:
                data = self.request.recv(1024)
                if len(data) == 0:break
                self.request.send(data.upper())
            except Exception:
                break
        self.request.close()
if __name__ == '__main__':
    s = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyRequestHandler,bind_and_activate=True)
    s.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())
    data = client.recv(1024)
    print(data.decode())

你可能感兴趣的:(基于udp协议和tcp协议的支持并发的套接字通信)