python实现两台不同主机(或虚拟机)之间进行通信(客户端和服务端)——Socket
准备
首先,打开命令行,输入ipconfig
,检查设备的IP地址和子网掩码,确保两台设备的IP地址在同一网段下(即IP地址
和子网掩码
与运算的结果相同)。
例:
设备A
IPv4地址:192.168.1.2
子网掩码:255.255.255.0
设备B
IPv4地址:192.168.1.3
子网掩码:255.255.255.0
设备C
IPv4地址:192.168.2.4
子网掩码:255.255.255.0
结论:设备A和B在同一网段,设备C在另一网段。
IP地址和子网掩码修改方法:
控制面板\网络和 Internet\网络连接 -> 找到使用的适配器 -> 右键属性 -> Internet 协议版本4 -> 属性 -> 使用下面的IP地址 -> 输入想用的IP地址和子网掩码(其他项可空)-> 确定。
如果使用虚拟机进行连接
将设备的防火墙关闭(控制面板\系统和安全\Windows Defender 防火墙 -> 启动或关闭 Windows Defender 防火墙),同时保证虚拟机的也在同一网段。
服务端
在作为服务端的设备上,新建server.py
,复制下面的代码,保存并运行。
from socket import *
import time
# 创建套接字
tcp_server = socket(AF_INET, SOCK_STREAM)
# 将192.168.1.2换为本机的IP,8000为使用的接口(保持8000即可,可根据需要修改)
address = ("192.168.1.2", 8000)
tcp_server.bind(address)
# 启动被动连接,设置多少个客户端可以连接
tcp_server.listen(128)
# 使用socket创建的套接字默认的属性是主动的
# 使用listen将其变为被动的,这样就可以接收别人的链接了
# 创建接收
# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
client_socket, clientAddr = tcp_server.accept()
# client_socket用来为这个客户端服务,相当于的tcp_server套接字的代理
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
# 这里clientAddr存放的就是连接服务器的客户端地址
from_client_msg=client_socket.recv(1024)
while(1):
#接收对方发送过来的数据
from_client_msg = client_socket.recv(1024) #接收1024给字节,这里recv接收的不再是元组,区别UDP
if(from_client_msg=="exit"): # 断开连接
break
print("接收的数据:",from_client_msg.decode("gbk"))
now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
#发送数据给客户端
send_data = client_socket.send((str(now_time)+" 已收到!").encode("gbk"))
client_socket.close()
#关闭套接字
#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了
#如果还需要服务,只能再次重新连
客户端
在作为客户端的设备上,新建client.py
,复制下面的代码,保存并运行(先运行服务端,再运行客户端)。
from socket import *
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 服务端的IP地址和使用的接口
serve_ip = "192.168.1.3"
serve_port = 8000
tcp_socket.connect((serve_ip,serve_port))
while(1):
send_data=input("Please input:") # 输入想发给服务端的信息
tcp_socket.send(send_data.encode("gbk"))
if send_data == "exit": # 断开连接
break
from_server_msg=tcp_socket.recv(1024) # 接收服务端的答复
print(from_server_msg.decode("gbk"))
tcp_socket.close()
运行结果
先运行server.py
,再client.py
,两个设备间便可持续通信,直到客户端发送exit
断开连接。