我正在实现一个简单的聊天应用程序,你可以在客户端之间发送消息。如果客户机在同一个网络上,它工作得很好,但我想知道如果客户机不在同一个网络上,如何让它工作。需要额外的步骤是什么?在
我在下面提供了我的代码,它适用于相同的网络通信。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}$
更新
您在问题中添加了回溯,表明远程网络无法访问。在这种情况下,您的代码是作为客户机,所以我最初的答案不是直接解决您的问题,但是,一般原则是相同的,即无法联系远程主机,因为没有到主机正在侦听的网络的路由。在
我不需要用你的网络来解决这个问题。您可能需要设置到远程网络的路由。。。我不是Windows用户,但您可以查看^{} 命令,this answer可能会有所帮助。在
原始答案
是什么让你认为它在不同网络上的客户端之间不起作用?你能测试来自不同网络的连接吗?在
在网络之间路由消息通常不是在应用层代码中完成的,而是通过网络设备(如路由器)的组合来执行的,这些设备是应用程序外部的。在
因为代码将套接字绑定到主机名
''
,所以应用程序正在侦听运行它的主机上的所有可用接口。如果有从客户机到服务器的路由,那么它对客户机连接的来源服务器没有任何影响。在你会问“额外的步骤是什么?”。就你的代码而言,不应该有任何代码。但是,您可能需要在客户端和/或服务器上配置路由表,打开防火墙端口以允许客户端和服务器之间的双向通信,或者配置路由器来引导网络之间的通信。关于如何做到这一点的细节不在SO的范围之内。在
相关问题 更多 >
编程相关推荐