一、 套接字概念
套接字分为面向连接的套接字和无连接的套接字
1、面向连接的套接字
又称为虚拟电路或流套接字,通信之前必须先建立连接。使用TCP、IP协议或者TCP、AF-LOCAL/AF-UNIX,都必须使用SOCK-STREAM作为套接字类型。
面向连接的通信提供序列化的、可靠的、不重复的数据交互,无记录边界,每条消息可以拆分为多个片段,到达目的地可以按顺序组合起来,降完整的信息传递给应用程序。
2、无连接套接字
数据报类型的套接字,使用UDP、IP协议,必须使用SOCK-DGRAM作为套接字类型,通信之前不需要建立连接。
必须整体发送,可能有重复的消息。
优点:成本低,性能高
二、 python 中的网络编程
1、主要模块
socket
安装:
pip install socket
2、创建套接字
语法: socket.socket(socket_family, socket_type, protocol=0)
解释参数:
socket_family: AF-UNIX或AF-INET;
socket_type: SOCK-DGRAM或SOCK-STREAM
protocol: 默认0,通常省略
import socket # 创建TCP/IP套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建UDP/IP套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
3、创建套接字服务端
import socket # 创建TCP/IP套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建UDP/IP套接字 # udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) HOST = "localhost" PORT = 33334 BUFSIZE = 1024 ADDR = (HOST, PORT) tcp_socket.bind(ADDR) # 绑定主机和端口到套接字上 tcp_socket.listen(5) # 启动监听,最大连接数为5 try: while True: print("等待客户端连接...") tcp_client_socket, addr = tcp_socket.accept() # 等待客户端连接,客户端连接后,返回独立的客户端套接字 print('连接来自:', addr) while True: data = tcp_client_socket.recv(BUFSIZE) # 接收tcp消息 if not data: break tcp_client_socket.send(data) # 发送tcp消息 tcp_client_socket.close() except Exception as e: print(e) finally: tcp_socket.close()
4、创建客户端
import socket HOST = "localhost" PORT = 33334 BUFSIZE = 1024 ADDR = (HOST, PORT) cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) cs.connect(ADDR) try: while True: data = input('请输入>') if not data: break cs.send(data.encode('utf-8')) res_data = cs.recv(BUFSIZE) if not res_data: break print(res_data.decode('utf-8')) except Exception as e: print(e) finally: cs.close()
5、运行顺序和结果
先运行服务端,再运行客户端
服务器结果:
等待客户端连接...
连接来自: ('127.0.0.1', 51551)
等待客户端连接...
连接来自: ('127.0.0.1', 51566)
客户端:
请输入>
请输入>