MST
星途 面试题库

面试题:Python中如何使用socket模块创建一个简单的TCP服务器并处理客户端连接

请使用Python的socket模块编写代码,创建一个能够监听特定端口的TCP服务器,当有客户端连接时,服务器能够接收客户端发送的消息,并回显一条简单的响应消息。说明代码中各个部分的作用,例如socket的创建、绑定、监听以及接收和发送数据的函数。
37.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import socket

# 创建socket对象,AF_INET表示使用IPv4协议,SOCK_STREAM表示使用TCP协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()
port = 12345  # 监听的端口号

# 绑定地址(主机名、端口号)到socket
server_socket.bind((host, port))

# 开始监听,参数5表示允许的最大连接数
server_socket.listen(5)
print(f"Server is listening on {host}:{port}")

while True:
    # 接受客户端连接,返回一个新的socket对象和客户端地址
    client_socket, addr = server_socket.accept()
    print(f"Got a connection from {addr}")

    # 接收客户端发送的数据,1024表示缓冲区大小
    data = client_socket.recv(1024)
    print(f"Received message: {data.decode('utf-8')}")

    # 回显响应消息给客户端
    response = "Message received successfully"
    client_socket.send(response.encode('utf-8'))

    # 关闭客户端socket连接
    client_socket.close()
  1. 创建socket对象
    • server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM):使用socket.socket()函数创建一个socket对象。AF_INET指定使用IPv4地址族,SOCK_STREAM指定使用TCP协议。这一步初始化了服务器用于网络通信的基本对象。
  2. 获取主机名和定义端口号
    • host = socket.gethostname():获取本地主机名,用于后续绑定地址。
    • port = 12345:定义服务器要监听的端口号。端口号是TCP/IP协议中用于区分不同应用程序的标识。
  3. 绑定地址到socket
    • server_socket.bind((host, port)):将服务器的socket绑定到指定的主机名和端口号。这一步使得服务器能够在指定的地址上接收来自客户端的连接请求。
  4. 开始监听
    • server_socket.listen(5):让服务器开始监听传入的连接请求。参数5表示在拒绝新的连接请求之前,操作系统可以挂起的最大连接数。
  5. 接受客户端连接
    • client_socket, addr = server_socket.accept():在while True循环中,server_socket.accept()函数会阻塞,直到有客户端连接到服务器。当有连接时,它返回一个新的socket对象(client_socket)用于与该客户端进行通信,以及客户端的地址(addr)。
  6. 接收和发送数据
    • data = client_socket.recv(1024):使用recv方法从客户端接收数据,1024是缓冲区大小,它指定了一次最多接收多少字节的数据。接收到的数据是字节类型,需要使用decode('utf - 8')方法解码为字符串。
    • response = "Message received successfully":定义要回显给客户端的响应消息。
    • client_socket.send(response.encode('utf-8')):使用send方法将响应消息发送回客户端。在发送之前,需要将字符串编码为字节类型。
  7. 关闭客户端socket连接
    • client_socket.close():完成与客户端的通信后,关闭客户端的socket连接,释放资源。