zoukankan      html  css  js  c++  java
  • day 33 udp协议,socketserver模块

    udp协议

    # 基础版本
    sever:

    import socket
    server=socket.socket(type=socket.SOCK_DGRAM)

    server.bind(('127.0.0.1', 8003))
    # udp不要建立连接,直接发
    #不需要监听
    # data=server.recvfrom(1024)
    data,addr=server.recvfrom(1024)
    #data 是个元组,第一个参数是数据不部分,第二个参数是客户端地址
    server.sendto(data.upper(),addr)

    client:
    import socket

    client=socket.socket(type=socket.SOCK_DGRAM)
    #直接发
    client.sendto(b'lqz',('127.0.0.1', 8003))
    data=client.recvfrom(1024)
    print(data)


    #加入通信循环
    server:
    import socket
    server=socket.socket(type=socket.SOCK_DGRAM)
    server.bind(('127.0.0.1', 8003))

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

    client:
    import socket
    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)


    #udp是否粘包
    udp特点:
    -可以发空(数据报协议,自带头)
    -客户端和服务端可以有一方没在线(因为不需要建立连接)
    udp 协议没有粘包问题(udp协议又叫数据报协议),可以发空,tcp不行


    socketserver模块
    用socketsever模块来写服务端

    #tcp协议

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

    server
    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()
    #udp协议
    client
    import socket
    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)

    server
    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()
     
     
     
  • 相关阅读:
    mybatis技术总结
    eclipse与idea部署项目的区别
    jQuery基础总结
    html页面加载顺序
    JavaScript高级技术总结
    JavaScript基础技术总结
    Node.js 从零开发 web server博客项目[数据存储]
    Node.js 从零开发 web server博客项目[koa2重构博客项目]
    Node.js 从零开发 web server博客项目[安全]
    Node.js 从零开发 web server博客项目[日志]
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11493968.html
Copyright © 2011-2022 走看看