UDP协议&socketserver模块

时间:2019-09-16
本文章向大家介绍UDP协议&socketserver模块,主要包括UDP协议&socketserver模块使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、UDP协议

1.1 UDP实现简单通信

服务器
-------------------------------------------------------------
import socket

soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #socket.SOCK_DGRAM是UDP协议

soc.bind(('127.0.0.1',8080))   #绑定地址和端口号

while True:  #通信循环
    data,addr = soc.recvfrom(1024)  #无需等待接收和监听
    print(data)
    soc.sendto(data.upper(),addr)  #将处理好的数据发送给客户端
客户端
------------------------------------------------------------
import socket

soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #实例化一个对象

while True: #通信循环
    msg= input('请输入数据>>>').strip()

    msg = msg.encode('utf8')  #将数据转化为bytes格式

    soc.sendto(msg,('127.0.0.1',8080))

    data = soc.recvfrom(1024)   #接收数据

    print(data[0]) #打印数

1.2 UDP的特点

  • 可以发空内容(数据报协议,有数据头)
  • 不需要建连接(所以他不可靠)
  • 不回粘包
  • 不可靠(客户端,服务端谁断开都不影响发送消息)

1.3 UDP与TCP的区别

TCPUDP
可靠连接 不可靠连接
基于数据流的传输 基于数据报的传输
粘包 不粘包
不丢包 丢包

二、socketserver模块


可以实现并发编程,让多个客户端同时访问,服务器同时处理多个客户端发来的数据

2.1 socketserver模块实现TCP简单通信

服务端
-----------------------------------------------------------------------------------
import socketserver   #导入模块

class MyTcp(socketserver.BaseRequestHandler):    #继承一个类,带有Base的都是基类
    def handle(self):  #必须重写handle方法
        try:
            while True:
                #request其实就是之前conn对象
                data = self.request.recv(1024)  #接收数据
                if len(data)== 0:  #如果数据发的是空
                    return   #直接结束
                self.request.send(data.upper())  #将数据变大写发送给客户端

        except Exception:
            pass

if __name__ == '__main__':
    #实例化一个socketserver对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
    soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)  #第一个参数是绑定的地址,第二个参数是自定义的类

    soc.serve_forever()  #只要来一个客户端,我们就给他一个线程做交互
客户端
-----------------------------------------------------------------------------
import socket  #客户端不需要用socketserver来实现
soc = socket.socket()
soc.connect(('127.0.0.1',8080))
while True:
    msg = input('请输入数据>>>').strip()
    msg = msg.encode('utf8')
    data= soc.send(msg)
    print(soc.recv(1024))

2.2 socketserver模块实现UDP简单通信

服务器
--------------------------------------------------------------------------------------
import socketserver

class MyUdp(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request[0])  #b'dfgh'
        #<socket.socket fd=544, family=AddressFamily.AF_INET, type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>
        print(self.request[1])
        print(type(self.request[1]))  #<class 'socket.socket'>
        data = self.request[0].decode('utf8')
        data = data.upper().encode('utf8')
        # self.request(tcp / udp是不一样的)
        self.request[1].sendto(data,self.client_address)  #self.client_address客户端地址

if __name__ == '__main__':
    soc = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUdp)
    soc.serve_forever()
客户端
---------------------------------------------------------------------------------------
import socket

soc = socket.socket(type = socket.SOCK_DGRAM)

while True:
    msg = input('请输入数据>>>').strip()
    msg = msg.encode('utf8')
    soc.sendto(msg,('127.0.0.1',8080))
    data = soc.recvfrom(1024)   #他是bytes形式
    print(data[0].decode('utf-8'))  #转为str格式
 

原文地址:https://www.cnblogs.com/lulingjie/p/11529045.html