计算机如何通信(相同局域网下)

Socket通信工具

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

在下图中,它位于应用层与传输层之间,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

计算机网络结构

关于TCP、IP是什么:https://ivel-li.github.io/2024/11/29/计算机网络结构/

Python 通信代码

Socket通信,需要一个服务器端和客户端。

服务器端示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import socket

socket_server = socket.socket()
socket_server.bind(("127.0.0.1", 11451))
# 监听端口
socket_server.listen(1)
# 等待客户端连接,accept方法返回二元元组(连接对象, 客户端地址信息)

conn, address = socket_server.accept()
print(f"接收到了客户端的连接,客户端的信息:{address}}")

while True:
# 接收消息
data: str = conn.recv(1024).decode("UTF-8")
print(f"客户端发来消息:{data}")
# 回复消息
msg = input("已收到信息。")
if msg == 'exit':
break
conn.send(msg.encode("UTF-8")) # encode将字符串编码为字节数组对象

# 关闭连接
conn.close()
socket_server.close()

上述代码中,bind函数将服务器的ip和端口号与socket对象绑定,在局域网(同一路由器)下可直接使用内网ip(如192开头ip,127.0.0.1的本机环路ip)通信,端口号的选择注意不要与其他进程端口号冲突。

1
socket_server.bind('ip',端口号)

客户端实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务器
socket_client.connect(("127.0.0.1", 11451))

while True:
send_msg = input("要发送给服务端的消息:")
if send_msg == "exit":
break
# 发送消息
socket_client.send(send_msg.encode("UTF-8"))
# 接受消息
recv_data = socket_client.recv(1024).decode("UTF-8") # 1024是缓冲区大小,一般就填1024, recv是阻塞式
print(f"服务端回复的消息是:{recv_data}")

# 关闭连接
socket_client.close()

示例代码中使用环路ip 127.0.0.1 进行本机与本机通信,故可在同一台主机下分别运行这两个代码尝试完成通信。

服务器与客户端代码输出