编写TCP单进程循环服务器程序与单进程客户端程序,实现以下主体功能:o客户端启动连接服务器之后,进入命令行交互模式。 。操作人员在命令行窗口输入一行字符并回车后,客户端进程立刻从命令行(本质即)读取数据,并stdin将该行信息发送给服务器。 。服务器收到该行信息后,会将该信息原封不动的返回给客户端,即所谓消息回声(Message Echo)。o客户端收到服务器返回的消息回声后,将其打印输出至屏幕(本质即stdout0。客户端在从命令行收到指令后退出。EXIT。在启动个客户端连接上服务器开展交互时,再启动另一个客户端连接服务器,观察体验是什么现象,并尝1试分析现象背后的底层逻辑。
时间: 2024-03-09 13:47:53 浏览: 29
下面是基于Python实现的TCP单进程循环服务器程序和单进程客户端程序,实现了上述主体功能。
服务器程序:
```python
import socket
# 创建TCP套接字并绑定到指定端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
# 监听连接请求
server_socket.listen()
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f'Client connected from {client_address}')
# 处理客户端请求
while True:
# 接收数据
data = client_socket.recv(1024)
if not data:
break
# 处理数据并发送响应
response = data
client_socket.send(response)
# 关闭客户端连接
client_socket.close()
```
客户端程序:
```python
import socket
# 创建TCP套接字并连接到服务器
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8080))
# 进入命令行交互模式
while True:
# 从命令行读取数据并发送给服务器
data = input('Enter message: ')
client_socket.send(data.encode())
# 接收服务器返回的消息回声并打印输出
response = client_socket.recv(1024)
print(f'Response: {response.decode()}')
# 如果收到退出指令则退出循环
if data == 'EXIT':
break
# 关闭客户端连接
client_socket.close()
```
当启动一个客户端连接上服务器时,可以正常进行交互。但当再启动另一个客户端连接服务器时,服务器将会交替地处理两个连接的请求,即每个连接将分别进行一次请求-响应循环,直到其中一个连接发送退出指令后,服务器才会继续处理另一个连接的请求。这是因为服务器采用单进程循环的方式处理连接请求,每个连接都会占用服务器进程的执行时间,因此如果同时有多个连接,则服务器将按照连接的先后顺序轮流处理它们的请求。