udp协议以及socketserver

udb协议

udb协议也是一种协议,它和tcp相比既有缺点也有优点

udb协议所发送的数据可以理解为自带报头,所以他不会出现粘包的情况。但是udp数据只管发送而不管接收,也就是说udp会出现丢包的情况,当客户端的数据服务端没有收到时,客户端并不知道还会继续发数据

img

udp协议简单实例

# 服务器
import socket
#udp
server=socket.socket(type=socket.SOCK_DGRAM)

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

while True:
    data,addr=server.recvfrom(1024)
    print(data)
    server.sendto(data.upper(),addr)
# 客户端
import socket
#udp
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)
    print(data)

socketserver模块

socketserver主要是用来写服务端并且进行开发的

拿之前所展示的tcp协议来说,我们之前所用的scp协议是单对单的,换句话说,如果服务器已经和第一个客户端连接,那么第二个客户端就会找不到目标。而socketserver则实现了并发的功能。如果把服务器比作一个饭店的话,他就好像是一个前台的迎宾,当有客户进来的时候,他会叫一名服务员去招待,而如果不用的话,就相当于只有一名服务员,第二个客户进不来了。

下面将直接把socketserver用实例来进行展示

#使用socketserver写服务端
#导入模块
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()
# 客户端
import socket
import time
soc=socket.socket()

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

socketserver模块和udp

就是简单的将以上俩种相结合就完事了

img

#使用socketserver写服务端
#导入模块
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()
# 客户端1
import socket
import time
soc=socket.socket()

soc.connect(('127.0.0.1',8009))
while True:
    soc.send('yyy'.encode('utf-8'))
    print(soc.recv(1024))
# 客户端2
import socket
#udp
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)
posted @ 2019-09-16 15:30  極9527  阅读(691)  评论(0编辑  收藏  举报