介绍一下 TCP方式程序的通讯,服务器机与客户机
TCP通信方式:服务器与客户机通信详解
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。下面我将详细介绍TCP方式下服务器与客户机的通信过程。
基本概念
-
TCP特点:
- 面向连接:通信前需建立连接
- 可靠传输:通过确认、重传等机制保证数据正确到达
- 有序传输:数据按发送顺序到达
- 流量控制:防止发送方过快导致接收方无法处理
- 拥塞控制:防止网络过载
-
通信角色:
- 服务器:被动等待连接的一方,通常有固定IP和端口
- 客户机:主动发起连接的一方
通信流程
服务器端流程
-
创建套接字(Socket)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
绑定IP和端口(Bind)
server_socket.bind(('0.0.0.0', 8888)) # 绑定所有可用IP,端口8888
-
监听连接(Listen)
server_socket.listen(5) # 设置最大等待连接数
-
接受连接(Accept)
client_socket, client_address = server_socket.accept() # 阻塞等待客户端连接
-
接收/发送数据
data = client_socket.recv(1024) # 接收数据 client_socket.send(b"Response") # 发送数据
-
关闭连接
client_socket.close() server_socket.close()
客户端流程
-
创建套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
连接服务器(Connect)
client_socket.connect(('server_ip', 8888)) # 连接服务器IP和端口
-
发送/接收数据
client_socket.send(b"Hello Server") # 发送数据 data = client_socket.recv(1024) # 接收数据
-
关闭连接
client_socket.close()
TCP三次握手与四次挥手
建立连接(三次握手)
- 客户端发送SYN=1, seq=x
- 服务器回复SYN=1, ACK=1, seq=y, ack=x+1
- 客户端发送ACK=1, seq=x+1, ack=y+1
断开连接(四次挥手)
- 主动方发送FIN=1, seq=u
- 被动方回复ACK=1, ack=u+1
- 被动方发送FIN=1, seq=v
- 主动方回复ACK=1, ack=v+1
编程示例
Python简单实现
服务器端代码:
import socketwith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.bind(('0.0.0.0', 8888))s.listen()conn, addr = s.accept()with conn:print(f"Connected by {addr}")while True:data = conn.recv(1024)if not data:breakconn.sendall(data)
客户端代码:
import socketwith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.connect(('127.0.0.1', 8888))s.sendall(b"Hello, server")data = s.recv(1024)print(f"Received {data!r}")
实际应用中的注意事项
-
多客户端处理:
- 使用多线程或多进程处理并发连接
- 或使用I/O多路复用(select/poll/epoll)
-
粘包问题:
- TCP是字节流协议,没有消息边界
- 解决方案:固定长度、分隔符、长度前缀
-
异常处理:
- 网络中断、连接重置等异常需要妥善处理
-
超时设置:
- 设置适当的超时时间防止长时间阻塞
-
缓冲区大小:
- 根据应用场景调整发送和接收缓冲区大小
TCP通信是网络编程的基础,理解其原理和实现方式对于开发网络应用程序至关重要。