UDP

UDP

特色:多線程

  1. udp 不會管客戶端或者服務端是否收到,它只管發,因此不可靠.socket

  2. 能夠發空(數據報協議,自帶頭)tcp

  3. 客戶端和服務端能夠又一方沒在線(由於不須要創建鏈接)線程

  4. 而且因爲不須要創建鏈接因此會發生丟包,致使數據不全。code

一,簡單的udp

1.1簡單的udp

  1. server端server

    import socket
    server = socket.socket(type=socket.SOCK_DGRAM)
    server.bind(('127.0.0.1',8008))
    #udp是不須要創建鏈接的,能夠直接發送
    #udp不須要進行監聽
    #剩下的部分和tcp是同樣的
    data,addr= server.recvfrom(1024)
    #data 是指傳送過來的數據的部分,第二個參數addr是客戶地址
    print(data,addr)
    #發送數據的時候,必定要加上地址
    server.sendto(data.upper(),addr)
  2. client端對象

    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    #直接發送就行
    client.sendto(b'chen',('127.0.0.1',8008))
    data,addr = client.recvfrom(1024)
    print(data,addr)

1.2 簡單通訊循環

  1. server
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8008))
while True:
    data,addr = server.recvfrom(1024)
    print(data)
    server.sendto(data.upper(),addr)

2.client繼承

import socket
client = socket.socket(type=socket.SOCK_DGRAM)
while True:
    msg = input('>>:')
    client.sendto(msg.encode('utf-8'),('127.0.0.1',8008))
    data = client.recvfrom(1024)
    print(data)

2、udp是否粘包

udp協議沒有粘包問題(udp協議又叫數據報協議),能夠發空,tcp不行utf-8

  1. server

    #udp協議沒有粘包問題(udp協議又叫數據報協議),能夠發空,tcp不行
    import socket
    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)
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
  2. client

    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    client.sendto('chen'.encode('utf8'),('127.0.0.1',8003))
    client.sendto('hello'.encode('utf8'),('127.0.0.1',8003))
    client.sendto('world'.encode('utf8'),('127.0.0.1',8003))
    client.sendto(''.encode('utf8'),('127.0.0.1',8003))

3、socketserver多線程通訊

支持多線程,在udp中又多線程的狀況下會結束上一個線程

  1. server

    #使用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)
    
    if __name__ == '__main__':
        #實例化獲得一個tcp鏈接的對象,Threading意思是說,只要來了請求,
        # 它自動的開線程來處理鏈接跟交互數據
        #第一個參數是綁定的地址,第二個參數傳一個類
        server=socketserver.ThreadingUDPServer(('127.0.0.1',8008),MyTcp)
        #一直在監聽
        server.serve_forever()
  2. client1

    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    client.sendto('chen'.encode('utf8'),('127.0.0.1',8009))
    data = client.recvfrom(1024)
    print(data)
  3. client2

    import socket
    client = socket.socket(type=socket.SOCK_DGRAM)
    client.sendto('chen'.encode('utf8'),('127.0.0.1',8009))
    data = client.recvfrom(1024)
    print(data)
相關文章
相關標籤/搜索