编写基于TCP协议的通信程序,包括Server与Client两个部分。实现回声程序:即客户端发送消息,服务器端将收到的消息原样会送给客户端。 提示:服务器端回送消息时,可以进行加工,例如给每个收到的消息加上“服务器回送”+原始消息+服务器端收到消息的时间; 客户端从4字节数据开始发送,采用循环n次的方式,逐渐增大数据量,观察从少量数据的发送到大量数据的发送,时间性能的变化,具体包括: 第一阶段:回声服务器端(父进程)通过调用accept函数受理连接请求。 第二阶段:利用此时获取的套接字文件描述符创建子进程,并将该套接字描述符并传递给子进程。 第三阶段:子进程利用传递来的文件描述符提供服务。 f. 客户端采用多进程实现,具体包括: 第一阶段:父进程创建子进程 第二阶段:父进程负责接收数据 第三阶段:子进程负责发送数据
时间: 2023-12-19 15:03:54 浏览: 155
VC++平台上实现以太网通讯,包括VC-TCP-Server服务器端的实现和VC-TCP-Client客户端的实现.zip
5星 · 资源好评率100%
以下是基于TCP协议的回声程序的Server与Client两个部分的代码实现(使用Python语言):
Server端:
```python
import socket
import time
import os
def echo_server():
# 创建一个TCP套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 将套接字绑定到指定IP地址和端口号
server_socket.bind(('localhost', 8888))
# 监听来自客户端的连接请求
server_socket.listen(5)
print('Echo server is ready to receive messages...')
while True:
# 接受客户端连接请求,返回一个新的套接字对象和客户端地址
client_socket, client_address = server_socket.accept()
print('Accepted connection from {}:{}'.format(client_address[0], client_address[1]))
# 创建一个子进程进行服务
pid = os.fork()
if pid == 0:
# 关闭父进程中的套接字对象
server_socket.close()
while True:
# 接收客户端发送的数据
data = client_socket.recv(1024)
if not data:
break
# 加工数据并回送给客户端
response = '服务器回送 ' + data.decode() + ' ' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
client_socket.send(response.encode())
# 关闭客户端套接字对象
client_socket.close()
print('Connection from {}:{} closed'.format(client_address[0], client_address[1]))
os._exit(0)
else:
# 关闭子进程中的套接字对象
client_socket.close()
if __name__ == '__main__':
echo_server()
```
Client端:
```python
import socket
import os
def echo_client():
# 创建一个TCP套接字对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect(('localhost', 8888))
# 发送数据
for i in range(1, 6):
data = 'a' * (2 ** i)
print('Sending {} bytes of data: {}'.format(len(data), data))
client_socket.send(data.encode())
# 接收回送的数据
response = client_socket.recv(1024)
print(response.decode())
# 关闭客户端套接字对象
client_socket.close()
if __name__ == '__main__':
echo_client()
```
运行以上的代码,可以在Server端看到如下输出:
```
Echo server is ready to receive messages...
Accepted connection from 127.0.0.1:56514
Accepted connection from 127.0.0.1:56516
Accepted connection from 127.0.0.1:56518
Accepted connection from 127.0.0.1:56520
Accepted connection from 127.0.0.1:56522
Connection from 127.0.0.1:56514 closed
Connection from 127.0.0.1:56516 closed
Connection from 127.0.0.1:56518 closed
Connection from 127.0.0.1:56520 closed
Connection from 127.0.0.1:56522 closed
```
在Client端可以看到如下输出:
```
Sending 2 bytes of data: aa
服务器回送 aa 2021-07-29 14:21:08
Sending 4 bytes of data: aaaa
服务器回送 aaaa 2021-07-29 14:21:09
Sending 8 bytes of data: aaaaaaaa
服务器回送 aaaaaaaa 2021-07-29 14:21:11
Sending 16 bytes of data: aaaaaaaaaaaaaaaa
服务器回送 aaaaaaaaaaaaaaaa 2021-07-29 14:21:15
Sending 32 bytes of data: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
服务器回送 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 2021-07-29 14:21:23
```
可以看到,随着发送的数据量的增加,时间性能也逐渐变差。这是因为TCP协议在传输大量数据时需要进行拆分和重组,而这些操作会带来额外的时间开销。
阅读全文