基于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在TCP的客户端socket中,我的recv方法想当然的接受了两个参数,导致错误。 这显示是因为没有区分好TCP和UDP的Socket的不同点。
由于TCP是面向连接的,每次在读写的socket对象,不必填入目标主机的地址,只需要直接读写数据即可,因此只能接受一个参数(data)。 而UDP是无连接,每次需要在发送数据需要时填入目标主机的地址,接受时始终也是两个参数: data和address。