插件窝 干货文章 Python Socket编程:客户端无需listen也能收发数据吗?

Python Socket编程:客户端无需listen也能收发数据吗?

Socket 连接 客户端 服务器 477    来源:    2025-03-11

在Python的Socket编程中,客户端和服务器端的角色是不同的。服务器端通常需要监听(listen)来自客户端的连接请求,而客户端则不需要监听,因为它主动发起连接。

客户端的工作流程:

  1. 创建Socket:客户端创建一个Socket对象。
  2. 连接服务器:客户端使用connect()方法连接到服务器的IP地址和端口。
  3. 发送和接收数据:连接成功后,客户端可以使用send()recv()方法与服务器进行数据交换。
  4. 关闭连接:通信结束后,客户端使用close()方法关闭连接。

服务器端的工作流程:

  1. 创建Socket:服务器端创建一个Socket对象。
  2. 绑定地址和端口:服务器使用bind()方法将Socket绑定到一个特定的IP地址和端口。
  3. 监听连接:服务器使用listen()方法开始监听来自客户端的连接请求。
  4. 接受连接:当有客户端连接时,服务器使用accept()方法接受连接,并返回一个新的Socket对象用于与客户端通信。
  5. 发送和接收数据:服务器使用send()recv()方法与客户端进行数据交换。
  6. 关闭连接:通信结束后,服务器关闭连接。

客户端无需listen的原因:

  • 客户端是主动发起连接的一方,它只需要知道服务器的地址和端口,然后通过connect()方法连接到服务器。
  • 一旦连接建立,客户端和服务器之间就可以通过send()recv()方法进行双向通信,而不需要客户端再进行监听。

示例代码:

客户端代码:

import socket

# 创建Socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('127.0.0.1', 12345)
client_socket.connect(server_address)

# 发送数据
client_socket.send(b"Hello, Server!")

# 接收数据
data = client_socket.recv(1024)
print(f"Received from server: {data.decode()}")

# 关闭连接
client_socket.close()

服务器端代码:

import socket

# 创建Socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('127.0.0.1', 12345)
server_socket.bind(server_address)

# 监听连接
server_socket.listen(5)
print("Server is listening...")

# 接受连接
client_socket, client_address = server_socket.accept()
print(f"Connection from {client_address}")

# 接收数据
data = client_socket.recv(1024)
print(f"Received from client: {data.decode()}")

# 发送数据
client_socket.send(b"Hello, Client!")

# 关闭连接
client_socket.close()
server_socket.close()

总结:

客户端不需要调用listen()方法,因为它不需要监听连接请求。客户端只需要通过connect()方法连接到服务器,然后就可以直接进行数据的发送和接收。