网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

基于UDP协议的套接字编程

UDP套接字简单示例

服务端

import scoket

server = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

server.bind(('127.0.0.1', 8080))

server.listen(5)

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

客户端

import socket

client = socket.socket(socket.AF_INET, scoket.SOCK_DGRAM)  # 数据报协议-->UDP

while True:
    
    msg = input('请输入mag>>>')
    
    client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
    
    data, server_addr = client.recvfrom(1024)
    
    print(data.decode('utf-8'), server_addr)
  • UDP是无链接的,先启动哪一端都不会报错

  • UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到

  • UPD协议一般不用于传输大数据。

  • UDP套接字虽然没有粘包问题,但是不能替代TCP套接字,因为UPD协议有一个缺陷:如果数据发送的途中,数据丢失,则数据就丢失了,而TCP协议则不会有这种缺陷,因此一般UPD套接字用户无关紧要的数据发送,例如qq聊天。

基于socketserver实现并发的socket

基于TCP协议

基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环

socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)

server类

request类

继承关系

服务端

import socketserver


class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        while True:
            data = self.request.recv(1024)
            if len(data) == 0: 
                break
            self.request.send(data.upper())


if __name__ == '__main__':
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyHandler, bind_and_activate=True)

    server.serve_forever()  # 代表连接循环
    # 循环建立连接,每建立一个连接就会启动一个线程(服务员)+调用Myhanlder类产生一个对象,调用该对象下的handle方法,专门与刚刚建立好的连接做通信循环

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口

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

phone.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))  # 指定服务端ip和端口

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

phone.close()

基于UDP协议

服务端

import socketserver


class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # 通信循环
        print(self.client_address)
        print(self.request)

        data = self.request[0]
        print('客户消息', data)
        self.request[1].sendto(data.upper(), self.client_address)


if __name__ == '__main__':
    s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyHandler)
    s.serve_forever()

客户端1

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

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

client.close()

客户端2

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 数据报协议-》udp

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

client.close()
原文地址:https://www.cnblogs.com/Hades123/p/11099748.html