【零基础】【含源码】python实现两台不同主机(或虚拟机)之间进行通信(客户端和服务端)——Socket

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 *
# 创建套接字
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断开连接。

你可能感兴趣的:(python,网络,tcp/ip,虚拟机)