测试聊天python p2p程序无法正常发送消息

问题描述 投票:0回答:0

我还是 Python 的新手,我在尝试编写的 PoC p2p 代码中遇到了问题。这是一个在设备之间发送消息的简单程序

问题是虽然它有点工作,但有些设备无法发送消息或检测到新设备。我的电脑可以发送消息(我不知道接收,因为我没能测试它)并在发现其他设备时接收消息。问题在于,当我尝试在其他地方运行它时(在 VM、我的笔记本电脑甚至我的手机中尝试过)我根本无法发送消息。除了我的电脑之外的设备之间根本没有任何作用。他们都接收得很好,但无法发送或收到有关其他设备的通知。难道只是一些网络设置?

import socket
import threading
import random
import time

class Peer:
    def __init__(self):
        self.peer_id = str(random.randint(1000, 9999))
        self.peers = {}  # Store peer id and their address
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        self.sock.bind(('', 12345))
        self.sock.settimeout(1)  # Set a timeout on the socket
        self.running = True

    def start_broadcast(self):
        while self.running:
            self.sock.sendto(self.peer_id.encode(), ('<broadcast>', 12345))
            time.sleep(1)

    def listen_broadcast(self):
        while self.running:
            try:
                data, addr = self.sock.recvfrom(1024)
                message = data.decode()
                if message.isdigit() and len(message) == 4:  # Check if it's a peer ID
                    peer_id = message
                    if peer_id != self.peer_id and peer_id not in self.peers:
                        self.peers[peer_id] = addr
                        print(f'New peer discovered: {peer_id} at {addr}')
                else:
                    print(f'Received: {message}')
            except socket.timeout:
                pass  # Ignore timeout errors

    def send(self, peer_id, message):
        if peer_id in self.peers:
            self.sock.sendto(message.encode(), self.peers[peer_id])
        else:
            print('Peer not found')

def main():
    peer = Peer()
    print(f'Your peer ID is {peer.peer_id}')

    broadcast_thread = threading.Thread(target=peer.start_broadcast)
    broadcast_thread.start()

    listen_thread = threading.Thread(target=peer.listen_broadcast)
    listen_thread.start()

    while True:
        message = input('Enter message (format: peer_id message) or "exit" to quit: ')
        if message == 'exit':
            peer.running = False
            break
        elif ' ' in message:
            peer_id, message = message.split(' ', 1)
            peer.send(peer_id, message)

    # Wait for all threads to finish
    broadcast_thread.join()
    listen_thread.join()

    print('Exited')

if __name__ == '__main__':
    main()

不好意思,欢迎大家反馈

我试过将广播和接收消息的套接字分开,但还是不行

python sockets network-programming
© www.soinside.com 2019 - 2024. All rights reserved.