1.Socket通信
1.Socket原理
Socket是一种网络通信的抽象接口,用于在不同计算机之间进行进程间通信或网络通信。
Socket通常基于TCP/IP协议栈,通过网络套接字(socket)在网络中传输数据。它允许不同计算机之间的进程通过网络进行数据交换。
Socket原理涉及两个主要概念:客户端和服务器。
-
服务器端:服务器端进程监听指定的端口,等待客户端连接请求。一旦有客户端连接请求到达,服务器端接受连接,并创建一个新的套接字,用于与该客户端进行通信。服务器端通过该套接字接收客户端发送的数据,并可以发送响应数据给客户端。
-
客户端:客户端进程需要主动与服务器端建立连接。客户端创建一个套接字,并指定服务器的IP地址和端口号。然后客户端发起连接请求,如果服务器端接受请求,双方建立连接,客户端可以向服务器发送数据,并接收服务器端的响应数据。
Socket通信基于网络协议,通过套接字提供了一组系统调用和库函数,使程序能够进行网络通信。程序可以使用Socket API在套接字之间传递数据,包括TCP和UDP协议。
2.TCP协议
TCP(传输控制协议)提供可靠的、面向连接的数据传输,适用于对数据可靠性要求较高的场景;
3.UDP协议
UDP(用户数据报协议)提供无连接的数据传输,具有较高的传输效率,适用于对传输延迟要求较高的场景。
2.Socket的实现
本文章是基于TCP的通信,使用python实现服务器监听
实现的步骤:
1.导入所需的模块:
2.创建一个Socket对象:
3.绑定服务器的地址和端口:
4.开始监听连接请求:
5.接受客户端连接请求,建立连接:
6.与客户端通信:
7.关闭连接:
代码如下:
import socket
import threading
# 处理客户端请求任务
def handle_client_request(ip_port, new_client):
print("ip和端口号为:", ip_port)
while True:
recv_data = new_client.recv(1024) # 接收最大字节为1024
if recv_data:
# 对二进制数据进行解码
recv_content = recv_data.decode("gbk")
print("接收客户端数据为:", recv_content, ip_port)
send_content = "收到了"
# 对字符串进程编码成为二进制数据
send_data = send_content.encode("gbk")
# 6.发送到客户端
new_client.send(send_data)
else:
print("客户端下线了:", ip_port)
break
# 关闭新的套接字,表示与客户端终止通信
new_client.close()
if __name__ == '__main__':
# 1.创建tcp服务端套接字
# socket.AF_INET: ipv4地址类型
# socket.SOCK_STREAM: tcp传输协议类型
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口号复用,表示服务端程序退出端口号立即释放
# 1。SOL_SOCKET:表示当前端口号
# 2.SO_REUSEADDR:表示端口号的选项
# 3.True:确定复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2.绑定端口号
# 第一个参数表示ip地址,不指定表示本机的任何一个IP地址
# 第二个参数表示端口号
tcp_server_socket.bind(("", 9090))
# 3.设置监听
# 128:表示等待建立连接的最大个数
tcp_server_socket.listen(128)
# 4.等待接收客户端的连接请求
# 注意点:每次连接都会返回一个新的套接字
# tcp_server_socket只负责等待接收连接请求,收发消息使用新的套接字
while (1):
new_client, ip_port = tcp_server_socket.accept() # 与客服端进行连接
# 连接成功,创建子线程,进行收发
sub_thread = threading.Thread(target=handle_client_request, args=(ip_port, new_client))
# 设置守护主线程,主线程退出,子线程直接销毁
sub_thread.setDaemon(True)
# 启动子线程对应的任务
sub_thread.start()
# 7.关闭服务器套接字,表示不再等待客户端的连接请求
tcp_server_socket.close()
现提供一个网络串口调试助手:
链接:https://pan.baidu.com/s/1XPjpUWdDAaVONVwWP18WeQ
提取码:dd11
打开网络调试助手,将协议类型设置为TCP Client客户端模式,主机地址设置为自己的主机地址,端口号为自己程序中设置的端口。
自己的主机地址打开cmd命令提示符,输入ipconfig查询即可。