简述
使用socket模块, 大致模拟TCP服务端的以下流程:
- 创建TCP套接字( socket.socket(socket.AF_INET, socket.SOCK_STREAM) )
- 绑定端口(bind)
- 设置成监听状态(listen)
- 接受客户端的连接(accept)
- 接收(recv)/发送(send) 给客户端数据
- 关闭客户端的连接(close)
- 关闭服务端的socket
运行效果
代码
# TCP服务端
import socket
class TcpServer(object):
"""TCP服务端"""
def __init__(self, ip="127.0.0.1", port=8080):
# TCP服务端套接字
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务端地址和端口
self.server_address = (ip, port)
# 绑定
self.tcp_server_socket.bind(self.server_address)
# 监听套接字
self.tcp_server_socket.listen(128)
def accept(self):
"""接受客户端的连接"""
# 默认会堵塞
self.new_client_socket, self.client_address = self.tcp_server_socket.accept()
def recv_message(self, code="utf-8"):
"""接收客户端发过来的信息, 并解码"""
# 接收客户端数据
recv_data = self.new_client_socket.recv(1024)
if recv_data:
# 解码
message = recv_data.decode(code)
return message
# 客户端断开连接, 收到空数据
else:
return None
def send_message(self, message="This message is send from TCP server", code="utf-8"):
"""信息经过编码后, 发送消息"""
# 编码
send_data = message.encode(code)
# 向客户端发送数据
self.new_client_socket.send(send_data)
def close_client_socket(self):
"""关闭单个客户端连接"""
self.new_client_socket.close()
def close_tcp_server_socket(self):
"""关闭TCP服务端套接字"""
self.tcp_server_socket.close()
def run(self, times=5):
"""控制TCP服务端的运行"""
while True:
print("【{}】等待接受客户端的连接......".format(self.server_address))
# 接受客户端的连接
self.accept()
print("客户端【{}】已建立连接".format(self.client_address))
# 接收客户端的消息
message = self.recv_message(code="gbk")
if message:
print("服务端接收到客户端发送的信息【{}】".format(message))
# 服务端发送的信息
info = message + " repeat again"
# 发送数据给客户端
self.send_message(info, code="gbk")
print("服务端发信息【{}】给客户端".format(info))
# 关闭这个客户端的连接
self.close_client_socket()
print("服务端已关闭与客户端【{}】的连接".format(self.client_address))
# recv()没有收到任何数据时:
else:
print("客户端【{}】主动断开与服务端的连接".format(self.client_address))
print("-" * 100)
# 循环次数-1
times -= 1
if times == 0:
# 关闭TCP服务端的socket连接
self.tcp_server_socket.close()
break
if __name__ == '__main__':
TcpServer().run()
Wireshark查看TCP通信过程中的数据包
- TCP客户端使用
网络调试助手
模拟 - TCP服务端使用我们写的Python代码进行模拟