標籤:tran cep 服務 簡單 小結 一個 send 通訊端 內容
基於UDP/TCP的通訊端編程demo
UDP 用戶端/伺服器
一個簡單的基於UDP協議的用戶端和伺服器應用的進程通訊。
邏輯:
用戶端會給伺服器發送小寫英文字母,伺服器接受後,把它轉化成大寫再返回給用戶端,用戶端輸出這組數字。由於Python3已經明確區分了str類和bytes類,因此發送的是位元組。
UDP伺服器:
from socket import *udp_server_socket = socket(AF_INET, SOCK_DGRAM)udp_server_port = 9600name = gethostname()udp_server_socket.bind((‘‘, udp_server_port))while True: print(‘The Sever is ready to receive‘) # 這段代碼會一直處於阻塞狀態,除非收到了響應 message, client_address = udp_server_socket.recvfrom(2048) print(‘Client Address:‘, str(client_address), ‘Coming!‘) modified_message = message.upper() udp_server_socket.sendto(modified_message, client_address)
UDP用戶端
from socket import *server_ip = ‘127.0.0.1‘server_port = 9600udp_client_socket = socket(AF_INET, SOCK_DGRAM)message = b‘hello‘# 發送給伺服器udp_client_socket.sendto(message, (server_ip, server_port))# 接受伺服器的返回內容modified_message, sever_address = udp_client_socket.recvfrom(2048)print(modified_message)udp_client_socket.close()
TCP 用戶端/伺服器
一個簡單的基於TCP協議的用戶端和伺服器應用的進程通訊。
TCP伺服器
from socket import *tcp_server_socket = socket(AF_INET, SOCK_STREAM)tcp_server_port = 9700tcp_server_socket.bind((‘127.0.0.1‘, tcp_server_port))tcp_server_socket.listen(1)while True: # 等待串連 print(‘Waiting for connecting!‘) # 建立TCP串連 connection_socket, addr = tcp_server_socket.accept() print(‘Connected from:‘, addr) message = connection_socket.recv(2048) print(‘The Sever is ready to receive‘) upper_message = message.upper() print(upper_message) connection_socket.send(upper_message) connection_socket.close()
TCP用戶端
from socket import *server_ip = ‘127.0.0.1‘server_port = 9700tcp_client_socket = socket(AF_INET, SOCK_STREAM)tcp_client_socket.connect((server_ip, server_port))message = b‘hello‘# 發送給伺服器tcp_client_socket.send(message)# 接受伺服器的返回內容modified_message = tcp_client_socket.recv(2048)print(‘Modified Message:‘, modified_message)tcp_client_socket.close()
小結
在寫這個demo的時候,犯了幾個小錯誤:
在TCP的服務端socket中,我的recv方法不是在串連的connection_socket
上操作的,導致了一個錯誤:Transport endpoint is not connected
類似:https://stackoverflow.com/questions/35969714/error-transport-endpoint-is-not-connected-python-sockets
在TCP的用戶端socket中,我的recv方法想當然的接受了兩個參數,導致錯誤。 這顯示是因為沒有區分好TCP和UDP的Socket的不同點。
由於TCP是連線導向的,每次在讀寫的socket對象,不必填入目標主機的地址,只需要直接讀寫資料即可,因此只能接受一個參數(data)。
而UDP是無串連,每次需要在發送資料需要時填入目標主機的地址,接受時始終也是兩個參數: data和address。
Python Socket Programming 伺服器/用戶端