如何使用Python(套接字)从客户端向客户端发送和接收消息?

you*_*izi 3 python sockets client server

我们正在使用 Python(socket)开发一个项目“ByZantine Generals Problem”,我们设法在服务器和两个客户端(client1、client2)之间创建成功的连接。但我们不知道如何在两个客户端之间创建连接,有什么帮助吗?

链接模型项目问题:https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/4generalestenientetraidor.svg/400px-4generalestenientetraidor.svg.png

服务器.py

import socket


host = '192.168.43.209'  # Standard loopback interface address 
(localhost)
port = 65432        # Port to listen on (non-privileged ports are > 1023)

serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serv.bind((host, port))
serv.listen(5)

while True:
    conn, addr = serv.accept()
    conn.send(b"Attack ")
    data = conn.recv(4096)
    if not data: break
    print (data)
Run Code Online (Sandbox Code Playgroud)

客户端1.py

import socket

host = '192.168.43.209'  # Standard loopback interface address         
(localhost)
port = 65432        # Port to listen on (non-privileged ports are > 1023)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))



from_server = client.recv(4096)
print (from_server)
client.send(b"I am client 1 :  ")
Run Code Online (Sandbox Code Playgroud)

客户端2.py

import socket

host = '192.168.43.209'  # Standard loopback interface address 
(localhost)
port = 65432        # Port to listen on (non-privileged ports are > 1023)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))



from_server = client.recv(4096)
print (from_server)
client.send(b"I am client 2 :  ")
Run Code Online (Sandbox Code Playgroud)

小智 5

有两种方法可以使客户端 1 和客户端 2 一起通信。

  1. 让他们通过服务器进行通信
  • 这意味着它们只需连接到服务器即可进行通信。服务器将在它们之间转发消息。
  • 要实现此功能,您需要创建一个函数,并在连接时将套接字对象传递给该函数。在该函数中,您将只接收来自客户端的数据。每次收到数据时,您都会将其广播给所有其他客户端。

提示:您可以将每个客户端的套接字对象添加到列表中,以便您可以轻松地将消息广播到网络中的每个客户端。

  1. 点对点沟通
  • 要以 p2p 进行通信,它们不需要连接到服务器。他们只会直接相互沟通。p2p 通信的首选协议是UDP 协议

如果客户端交换安全数据(例如服务器不应访问它),p2p 是最好的方法。因为他们通信的时候没有服务器的干扰。