1. 程式人生 > 實用技巧 >網路程式設計(套接字)之UDP協議通訊以及基於socketserver模組實現併發效果等相關內容-33

網路程式設計(套接字)之UDP協議通訊以及基於socketserver模組實現併發效果等相關內容-33

1.基於udp協議的套接字通訊

# server.py

# TCP VS UDP協議
# 1、可靠性
# tcp協議是可靠協議:
# 對方必須回覆一個ack確認資訊,才會將自己這端的資料從記憶體中刪除

# udp協議不可靠:
# 傳送一條訊息就會立即刪除,不管對方是否接收到

# 2、有無連結
# tcp有連結,udp無連結

# 3、傳輸資料的效率
# udp更高

# 4、粘包問題
# udp協議稱之為資料報協議,每次傳送都是一個完整的資料報,一個傳送唯一對應一個接收
# 所以udp協議沒有粘包問題
from socket import *
import time

server = socket(AF_INET, SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))

while True:
data, client_addr = server.recvfrom(1024)
time.sleep(10)
server.sendto(data.upper(), client_addr)


# client.py

from socket import *

client = socket(AF_INET, SOCK_DGRAM)

while True:
msg = input('>>: ').strip()
client.sendto(msg.encode("utf-8"), ('127.0.0.1', 8080))

data, server_addr = client.recvfrom(1024)
print(data.decode('utf-8'))

2.基於socketserver模組實現併發tcp

# server.py

# from socket import *
#
#
# server=socket(AF_INET,SOCK_STREAM)
# server.bind(('127.0.0.1',8080))
# server.listen(5)
#
# while True:
# conn,addr=server.accept()
# print(addr)
#
# while True:
# try:
# data=conn.recv(1024)
# if len(data) == 0:break
# conn.send(data.upper())
# except Exception:
# break
#
# conn.close()

# 支援併發版本
import socketserver


class MyRequestHandler(socketserver.BaseRequestHandler):
def handle(self): # 處理通訊
print(self.client_address)
while True:
try:
data = self.request.recv(1024) # self.request=>conn
if len(data) == 0: break
self.request.send(data.upper())
except Exception:
break
self.request.close()


if __name__ == '__main__':
s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyRequestHandler, bind_and_activate=True)
s.serve_forever()


# client.py

from socket import *

client=socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))

while True:
msg=input(">>: ").strip()
if len(msg) == 0:
continue

client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))

3.基於socketserver模組實現併發udp

# server.py

import socketserver


class MyRequestHandler(socketserver.BaseRequestHandler):
def handle(self): # 處理通訊
data,server=self.request
server.sendto(data.upper(),self.client_address)

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


# client.py

from socket import *

client = socket(AF_INET, SOCK_DGRAM)

while True:
msg = input('>>: ').strip()
client.sendto(msg.encode("utf-8"), ('127.0.0.1', 8080))

data, server_addr = client.recvfrom(1024)
print(data.decode('utf-8'))