【发布时间】:2015-09-06 10:48:54
【问题描述】:
我正在实现一个简单的聊天应用程序,您可以通过它在客户端之间发送消息。如果客户端在同一个网络上,它工作正常,但我想知道如果客户端不在同一个网络上,如何让它工作。需要哪些额外步骤?
我在下面提供了我的代码,它适用于同一网络通信。 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 我已将回溯添加到帖子中
标签: python sockets networking