我正在创建一个带有套接字和线程的聊天室程序,其中一个客户端旨在将消息发送到服务器。然后假定服务器将该消息发送回每个客户端。
问题似乎出在server.py中,当客户端发送消息时,reciever()似乎没有收到任何消息。
我试过调试,似乎如果我在Listening()函数中删除了while循环,则reciever()再次起作用,但是listen()却坏了。有任何想法吗?
server.py
import socket, sys, os
from threading import Thread
listOfUsers = []
IP = '192.168.1.128'
listeningPort = 5000
recievingPort = 5001
sendingPort = 5002
listeningSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recievingSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sendingSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
listeningSocket.bind((IP, listeningPort))
recievingSocket.bind((IP, recievingPort))
def listening():
'''Waits for the a client to send its data( the IP address)
which is added to listOfUsers'''
global listOfUsers
while True:
print('sdfg')
data, addr = listeningSocket.recvfrom(4096)
data = data.decode('utf-8')
if data not in listOfUsers:
listOfUsers.append(data)
else:
pass
def reciever():
'''Waits to recieve incoming messages. Once a message is recieved, this
function sends the message to every IP address in listOfUsers'''
while True:
data, addr = recievingSocket.recvfrom(4096)
data = data.decode('utf-8')
with open('E:\\log.txt', 'a') as file:
file.write(data)
print(data)
print(listOfUsers)
data = data.encode()
for ip in listOfUsers:
sendingSocket.sendto(data, (ip, sendingPort))
def main():
t1 = Thread(target= listening(), args=())
t2 = Thread(target= reciever(), args=())
t1.start()
t2.start()
if __name__ == '__main__':
print('Starting server... \n')
main()
client.py
import socket, sys, os, datetime
from threading import Thread
name = os.getlogin()
ServerIP = '192.168.1.128'
hostIP = socket.gethostbyname(socket.gethostname())
initialisationPort = 5000
sendingPort = 5001
recievingPort = 5002
initialisationSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sendingSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recievingSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recievingSocket.bind((hostIP, recievingPort))
def initialisation():
'''Function runs once. Sends this machine's IP address to the server'''
hostIPCopy = hostIP.encode('utf-8')
initialisationSocket.sendto(hostIPCopy, (ServerIP, initialisationPort))
def sender():
'''Waits for input from the user. Once an input is recieved, it creates
a message to send to the server'''
while True:
message = input()
if message == "end":
sendingSocket.close()
recievingSocket.close()
sys.exit()
time = datetime.datetime.now().strftime("%m-%d-%Y | %H:%M")
message = '{0} - {1}: {2}' .format(time, name, message)
sendingSocket.sendto(message.encode('utf-8'), (ServerIP, sendingPort))
def reciever():
'''Waits for any incoming message from the server'''
while True:
data, addr = recievingSocket.recvfrom(4096)
data = data.decode('utf-8')
print(data)
def main():
initialisation()
t1 = Thread(target=sender, args=())
t2 = Thread(target=reciever, args =())
t1.start()
t2.start()
if __name__ == '__main__':
print('Enter anything to send to chatroom. Enter "end" to quit.')
main()
您的代码中有几个问题。
您的服务器代码首先失败:
def main():
t1 = Thread(target= listening(), args=())
t2 = Thread(target= reciever(), args=())
您需要更改它并删除括号。现在发生的事情是在创建t1时在其中调用侦听功能。您的程序站在那儿等待您的收听功能,永不返回。它甚至从不创建接收器。始终,如果您需要函数名称作为参数,请使用function
,而不要使用function()
。
def main():
t1 = Thread(target= listening, args=())
t2 = Thread(target= reciever, args=())
将为您解决此问题。
客户端和服务器中的下一个问题是,您仅启动线程,然后退出主程序。它们可能会挂在套接字超时上,但不要依赖于此。而是让主程序也等待:
t1 = Thread(target=sender, args=())
t2 = Thread(target=reciever, args =())
t1.daemon = True
t2.daemon = True
t1.start()
t2.start()
while True:
sleep(60)
我添加了一个虚拟睡眠。在客户端和服务器上都执行此操作。我也建议添加daemon = True
。它不是必需的,但是如果您中断程序,线程也会运行,并且您没有挂起的程序并且需要手动终止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句