不通过网络发送的消息(Python套接字)

2024-05-16 14:52:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个简单的聊天应用程序,你可以在客户端之间发送消息。如果客户机在同一个网络上,它工作得很好,但我想知道如果客户机不在同一个网络上,如何让它工作。需要额外的步骤是什么?在

我在下面提供了我的代码,它适用于相同的网络通信。serve()在它自己的线程中运行,并监听传入的消息(通过调用rcvMsg())。当用户想从mainprocess发送消息时,它调用sendMsg()。在

class CMsgGateway(QtCore.QThread):

    def __init__(self, mainprocess, parent = None):  

        QtCore.QThread.__init__(self, parent)
        self.exiting = False
        self.mainprocess= mainprocess
        self.msgRcvd = ""
        serveThread = Thread(target=self.serve).start()

    def serve(self):

        while 1:
            self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.sock.bind(("", self.mainprocess.port))
            self.sock.listen(1)   
            self.rcvMsg()

    def rcvMsg(self):
        serverSocket, info = self.sock.accept()
        while 1:
            try:            
                buf = bytearray(4000)
                view = memoryview(buf)
                bytes = serverSocket.recv_into(view, 4000)
                if bytes:
                    stx = view[0]
                    Size = view[1:3]
                    bSize = Size.tobytes()
                    nTuple = struct.unpack(">H", bSize)
                    nSize = nTuple[0]
                    message = view[0:3+nSize]
                    messageString = message.tobytes().decode("utf-8").strip()
                    self.mainprocess.msgs += "Friend: " + messageString
                    self.emit(Qt.SIGNAL("msgRcvd"))
                else:
                    break
            except socket.timeout:
                print("Socket timeout.")
                sys.stdout.flush()
                break

    def messageReceived(self):

        self.mainprocess.slotMsgRcvd(self.msgRcvd)

    def sendMsg(self, msgToSend, IP):

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 2)
        self.sock.connect((IP, self.mainprocess.port))
        self.sock.send(msgToSend.encode())
        self.sock.close()

尝试跨网络通话时收到的错误是:

^{2}$

Tags: self网络view消息客户机defsocketsock
1条回答
网友
1楼 · 发布于 2024-05-16 14:52:53

更新

您在问题中添加了回溯,表明远程网络无法访问。在这种情况下,您的代码是作为客户机,所以我最初的答案不是直接解决您的问题,但是,一般原则是相同的,即无法联系远程主机,因为没有到主机正在侦听的网络的路由。在

我不需要用你的网络来解决这个问题。您可能需要设置到远程网络的路由。。。我不是Windows用户,但您可以查看^{}命令,this answer可能会有所帮助。在


原始答案

是什么让你认为它在不同网络上的客户端之间不起作用?你能测试来自不同网络的连接吗?在

在网络之间路由消息通常不是在应用层代码中完成的,而是通过网络设备(如路由器)的组合来执行的,这些设备是应用程序外部的。在

因为代码将套接字绑定到主机名'',所以应用程序正在侦听运行它的主机上的所有可用接口。如果有从客户机到服务器的路由,那么它对客户机连接的来源服务器没有任何影响。在

你会问“额外的步骤是什么?”。就你的代码而言,不应该有任何代码。但是,您可能需要在客户端和/或服务器上配置路由表,打开防火墙端口以允许客户端和服务器之间的双向通信,或者配置路由器来引导网络之间的通信。关于如何做到这一点的细节不在SO的范围之内。在

相关问题 更多 >