TCP 套接字基本使用示例
import socket
# 创建TCP套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
server_socket.bind(server_address)
server_socket.listen(1)
print('等待连接...')
connection, client_address = server_socket.accept()
try:
print('连接来自', client_address)
while True:
data = connection.recv(1024)
if data:
print('接收到:', data.decode())
connection.sendall(data)
else:
break
finally:
connection.close()
server_socket.close()
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
client_socket.connect(server_address)
try:
message = 'Hello, Server!'
client_socket.sendall(message.encode())
data = client_socket.recv(1024)
print('接收到:', data.decode())
finally:
client_socket.close()
UDP 套接字基本使用示例
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 9999)
server_socket.bind(server_address)
print('等待接收数据...')
while True:
data, client_address = server_socket.recvfrom(1024)
print('接收到来自{}的消息: {}'.format(client_address, data.decode()))
server_socket.sendto(data, client_address)
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DUDP)
server_address = ('localhost', 9999)
message = 'Hello, Server!'
client_socket.sendto(message.encode(), server_address)
data, server = client_socket.recvfrom(1024)
print('接收到:', data.decode())
client_socket.close()
主要差异
- 代码实现步骤:
- TCP:
- 服务器端需要先创建套接字,绑定地址,然后调用
listen
进入监听状态,之后通过 accept
接受客户端连接。
- 客户端创建套接字后,调用
connect
连接到服务器。
- UDP:
- 服务器端和客户端都只需创建套接字并绑定地址(客户端也可不绑定,由系统自动分配)。没有监听和连接步骤,直接可以发送和接收数据。
- 函数调用:
- TCP:
- 使用
sendall
发送数据,它会尝试将数据完整发送,如果发送缓冲区已满,会阻塞直到数据可以发送。
- 使用
recv
接收数据,会阻塞等待数据到达,接收到的数据长度可能小于请求的长度,需要循环接收直到接收完所有数据。
- UDP:
- 使用
sendto
发送数据,它将数据发送到指定地址,不管对方是否接收。
- 使用
recvfrom
接收数据,会阻塞等待数据到达,接收时会返回数据和发送方的地址。