我一直在处理基于UDP的本地网络客户端/服务器聊天,您可以在本主题Using one socket in UDP chat using threading中看到。工作代码被标记为我的问题的答案,我现在正在使用它来构建我想要的应用程序。
我创建了两个不同的文件,这些文件仅在host
和port
值不同,因为我需要在本地网络中使用此聊天 - 在两台计算机之间。我已经为这两台PC设置了IP地址#1 192.168.0.1
,第二台是192.168.0.2
。
这是我现在的主要功能:
if __name__ == '__main__':
rec = Receiving('', 8000)
send = Sending('username', "192.168.0.2" , 8888, 8888)
rec.run()
send.run()
if __name__ == '__main__':
rec = Receiving('', 8888)
send = Sending('username2', '192.168.0.1' , 8000, 8000)
rec.run()
send.run()
我的防火墙已关闭,我可以毫无问题地从两台计算机上ping每个IP地址。每当我尝试发送消息时,我都会收到错误。
Traceback (most recent call last):
File "C:\Users\...\workspace\Chat\server.py", line 61, in <module>
send = Sending('...', '192.168.0.1' , 8888, 8888)
File "C:\Users\febeks\workspace\Chat\server.py", line 14, in __init__
self.sock = self.create_socket()
File "C:\Users\...\workspace\Chat\server.py", line 19, in create_socket
sock.bind((self.host, self.port))
OSError: [WinError 10049] The requested address is not valid in its context
我还发现,如果我在Sending
中设置了计算机#1的IP地址自己的IP地址,那么它就不会给我错误,但是它错了,因为我想设置Sending
中的IP到目标计算机,我想与之聊天。对我来说根本没有意义。
我试图在互联网上搜索答案,但没有一个答案解决了我的问题。
关于评论,我将除了main
之外的完整代码(每台计算机都有所不同)放入本主题,以便更清晰,更完整。
class Sending():
def __init__(self, name, tHost, tPort, target):
self.name = name
self.host = tHost
self.port = tPort
self.target_port = target
self.sock = self.create_socket()
def create_socket(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.host, self.port))
return sock
def set_name(self, name):
self.name = name
def send_loop(self):
name = input('Name:')
while True:
message = input('Enter message: ')
data = bytearray()
data.extend(name.encode('utf-8') + message.encode('utf-8'))
self.sock.sendto(bytearray(data), (self.host, self.target_port))
def run(self):
th2 = threading.Thread(name='send', target=self.send_loop)
th2.start()
class Receiving():
def __init__(self, host, port):
self.host = host
self.port = port
def create_socket(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.host, self.port))
while True:
data, addr = sock.recvfrom(1500)
print('\nReceived: ' + data.decode('utf-8') + str((addr)))
def run(self):
th1 = threading.Thread(name='rec', target=self.create_socket)
th1.setDaemon(True)
th1.start()
return