网络编程基础知识总结:Socket与TCP通信
目录
1. 基本概念
2. 操作方法
2.1 服务端操作流程
2.2客户端操作流程
2.3使用说明
3.注意事项
1. 基本概念
- Socket:网络通信的端点,是应用层与TCP/IP协议族通信的中间抽象层。它提供了统一的接口供应用程序进行网络通信。
- TCP(传输控制协议):面向连接的协议,保证数据传输的可靠性,数据有序且无丢失。
- TCP Socket:基于TCP协议的网络通信套接字,用于实现可靠的面向连接的数据传输。
2. 操作方法
2.1 服务端操作流程
1.创建套接字:
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
family(地址族)
socket.AF_INET
:IPv4,最常用socket.AF_INET6
:IPv6socket.AF_UNIX
:Unix域套接字(仅限Unix/Linux)
type(套接字类型)
socket.SOCK_STREAM
:面向连接的TCP协议socket.SOCK_DGRAM
:无连接的UDP协议- proto:协议编号,通常为0自动选择
- fileno:文件描述符,通常不使用
2.绑定地址和端口
bind((host, port))
3.监听连接
listen(backlog)
- backlog:最大等待连接数,决定操作系统为该套接字排队的最大连接数
4.接收连接
conn, addr = accept()
- 返回一个新的套接字
conn
用于和客户端通信 addr
是客户端地址(IP和端口)
5.接收数据
data = conn.recv(bufsize)
- 接收二进制数据,需要用
decode()
转换为字符串
6.发送数据
conn.send(data)
- 发送数据前需用
encode()
编码成二进制 - 回声发送:收到客户端消息后,再发回给客户端(echo)
7.关闭连接
conn.close()
- 关闭和客户端的通信连接
8.服务端总体代码(server.py)
import socketdef start_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('127.0.0.1', 8888)) server_socket.listen(5)print("服务器启动,等待客户端连接...")while True:conn, addr = server_socket.accept()print(f"客户端{addr}已连接")try:data = conn.recv(1024)if not data:print("客户端关闭连接")conn.close()continueprint(f"收到客户端消息: {data.decode()}")response = "服务器已收到消息"conn.send(response.encode())except Exception as e:print(f"通信异常: {e}")finally:conn.close()print(f"与客户端{addr}的连接已关闭")if __name__ == "__main__":start_server()
2.2客户端操作流程
1.创建套接字
socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
- family:地址族,常用参数
socket.AF_INET
:IPv4(最常用)socket.AF_INET6
:IPv6
- type:套接字类型
socket.SOCK_STREAM
:面向连接的TCP协议socket.SOCK_DGRAM
:无连接的UDP协议
2.连接服务器
connect((host, port))
- host:服务器IP地址或域名,例如
'127.0.0.1'
或'www.example.com'
- port:服务器监听的端口号,整数类型,如
12345
3.发生数据
send(data)
- data:要发送的字节数据,必须是
bytes
类型 - 如果发送字符串,需要先用
encode()
转换为字节流 - 例如:
client_socket.send("hello".encode())
4.接收数据
recv(bufsize)
- bufsize:每次接收的最大字节数,整数,如
1024
、2048
- 返回值是
bytes
类型,需要用decode()
转换为字符串 - 示例:
data = client_socket.recv(1024)
5.关闭连接
close()
6.客户端总体代码(client.py)
import socketdef start_client():client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_ip = '127.0.0.1' # 服务端IP,若服务端在远程机器,改成对应IPserver_port = 8888try:client_socket.connect((server_ip, server_port))message = "你好,服务器!"client_socket.send(message.encode())data = client_socket.recv(1024)print(f"收到服务器回复: {data.decode()}")except Exception as e:print(f"连接或通信异常: {e}")finally:client_socket.close()print("客户端连接关闭")if __name__ == "__main__":start_client()
2.3使用说明
- 先运行服务端脚本
python server.py
,服务端开始监听。 - 再运行客户端脚本
python client.py
,客户端连接服务端并发送消息。 - 服务端收到消息后打印并回复,客户端接收回复并打印。
- 双方通信完成后关闭连接。
3.注意事项
-
数据格式转换
- 发送和接收的数据是二进制流,字符串需要
encode()
和decode()
- 复杂Python对象(如字典、列表等)需要序列化(转换为字节流)
- 推荐使用
json
模块(跨语言,文本格式) - 或
pickle
模块(Python专用,二进制格式)
- 推荐使用
- 发送和接收的数据是二进制流,字符串需要
-
多客户端处理
- 服务端通常通过循环调用
accept()
接收多个客户端连接 - 也可以使用多线程、多进程或异步IO来同时处理多个连接
- 服务端通常通过循环调用
-
异常处理
- 网络通信容易出错,需要捕获异常(如连接中断、超时等)保证程序健壮
-
关闭顺序
- 先关闭客户端连接套接字
conn
,服务器监听套接字server_socket
一般在程序结束时关闭
- 先关闭客户端连接套接字