我正在實現一個簡單的聊天應用程序,您可以在客戶端之間發送消息。它工作正常,如果客戶端在同一個網絡上,但我想知道如何讓它工作,如果客戶端不在同一個網絡上。需要額外的步驟是什麼?郵件不通過網絡發送(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()
試圖說服跨網絡,當我收到的錯誤是:
Traceback (most recent call last):
File "chatApp.pyw", line 74, in slotMsgSend
File "C:\Users\me\documents\chatApp\source\msginterface.pyw", line 61, in sendMsg
self.sock.connect((IP, self.mainprocess.port))
OSError: [WinError 10051] A socket operation was attempted to an unreachable network
當它們不在同一個子網上時它有什麼問題? – stark
@stark我已經加入了回溯到後 – petehallw