面试题答案
一键面试1. 实现TCP服务器
- 关键步骤:
- 导入
SocketServer
模块。 - 定义一个请求处理类,继承自
StreamRequestHandler
类,并重写handle
方法来处理客户端请求。 - 在
handle
方法中读取客户端发送的数据,将其反转后再发送回客户端。 - 创建
TCPServer
实例,绑定服务器地址和端口,并将定义的请求处理类传递给TCPServer
。 - 启动服务器,使其持续监听客户端连接。
- 导入
- 主要类与方法:
SocketServer.TCPServer
类:用于创建TCP服务器实例。构造函数接受服务器地址(IP地址和端口号)和请求处理类作为参数。SocketServer.StreamRequestHandler
类:处理来自客户端的流(stream)请求。需要继承此类并重写handle
方法来实现具体的请求处理逻辑。handle
方法:在继承自StreamRequestHandler
的类中重写此方法,在这个方法内处理客户端的请求,如读取数据、处理数据和发送响应。
以下是Python代码实现:
import SocketServer
class MyTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
data = self.rfile.readline().strip()
reversed_data = data[::-1]
self.wfile.write(reversed_data + b'\n')
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
2. 实现TCP客户端
- 关键步骤:
- 导入
socket
模块(虽然使用SocketServer
模块实现服务器,但客户端一般使用socket
模块直接操作)。 - 创建一个TCP套接字对象。
- 连接到服务器指定的地址和端口。
- 向服务器发送字符串数据。
- 接收服务器返回的数据,并打印出来。
- 关闭套接字连接。
- 导入
- 主要类与方法:
socket.socket
类:用于创建套接字对象。构造函数接受地址族(如AF_INET
表示IPv4)和套接字类型(如SOCK_STREAM
表示TCP)作为参数。connect
方法:套接字对象的方法,用于连接到指定的服务器地址和端口。sendall
方法:用于向服务器发送数据,确保数据全部发送成功。recv
方法:用于从服务器接收数据,参数指定接收数据的最大长度。close
方法:关闭套接字连接。
以下是Python代码实现:
import socket
HOST, PORT = "localhost", 9999
data = "Hello, World!"
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((HOST, PORT))
sock.sendall(bytes(data + "\n", "utf - 8"))
received = sock.recv(1024)
print("Sent: {}".format(data))
print("Received: {}".format(received.decode("utf - 8").strip()))