【零基础】【含源码】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 *
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断开连接。

  • 7
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
实现多用户登录和多人聊天的过程中,需要用到socket编程以及多线程编程。以下是一个简单的示例,包客户服务码。 服务代码: ```python import socket import threading # 服务器IP和口号 HOST = 'localhost' PORT = 8888 # 存储客户连接信息的字典 clients = {} # 处理客户消息 def handle_client(conn, addr, name): while True: try: msg = conn.recv(1024).decode('utf-8') # 如果客户发送“quit”,则退出聊天室 if msg == 'quit': conn.send('quit'.encode('utf-8')) conn.close() del clients[name] print('{}已退出聊天室'.format(name)) break # 向所有客户发送消息 for key, value in clients.items(): value.send('{}: {}'.format(name, msg).encode('utf-8')) except: del clients[name] print('{}已断开连接'.format(name)) break # 监听客户连接 def accept_client(server_socket): while True: conn, addr = server_socket.accept() name = conn.recv(1024).decode('utf-8') clients[name] = conn print('{}已连接'.format(name)) # 向客户发送欢迎消息 conn.send('欢迎来到聊天室!'.encode('utf-8')) # 创建新线程处理客户消息 t = threading.Thread(target=handle_client, args=(conn, addr, name)) t.start() if __name__ == '__main__': # 创建套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP和口号 server_socket.bind((HOST, PORT)) # 监听连接 server_socket.listen(5) print('聊天室已启动,等待连接...') # 接受连接并处理消息 accept_client(server_socket) ``` 客户代码: ```python import socket import threading # 服务器IP和口号 HOST = 'localhost' PORT = 8888 # 处理接收消息 def recv_msg(client_socket): while True: try: msg = client_socket.recv(1024).decode('utf-8') print(msg) except: print('连接已断开') client_socket.close() break # 处理发送消息 def send_msg(client_socket, name): while True: try: msg = input() client_socket.send(msg.encode('utf-8')) # 如果发送“quit”,则退出聊天室 if msg == 'quit': client_socket.close() break except: print('连接已断开') client_socket.close() break if __name__ == '__main__': # 创建套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect((HOST, PORT)) # 输入用户名 name = input('请输入用户名:') client_socket.send(name.encode('utf-8')) # 创建新线程接收消息 t1 = threading.Thread(target=recv_msg, args=(client_socket,)) t1.start() # 创建新线程发送消息 t2 = threading.Thread(target=send_msg, args=(client_socket, name)) t2.start() ``` 注:以上代码仅为示例,可能存在一些问题和不足。在实际应用中,需要考虑更多的异常情况和安全性问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎亿香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值