带套接字的python聊天室无法正常工作

红香蕉

我正在创建一个带有套接字和线程的聊天室程序,其中一个客户端旨在将消息发送到服务器。然后假定服务器将该消息发送回每个客户端。

问题似乎出在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

套接字聊天室-python 3.7

使用基于Twisted的套接字限制聊天室中的用户数量

使用帶有 select() 的套接字編程的聊天室 - winsock - C

订阅聊天室

如何使用套接字IO检查有多少参与者连接到我的聊天室

无法使用asmack获得已加入的聊天室

聊天室成员列表

Kotlin TCP套接字客户端无法正常工作的Python服务器

Python:与 Arduino MKR1000 的套接字通信无法正常工作

套接字:点对点聊天如何工作?

在调用套接字之前,Printf无法正常工作

Java套接字中的并行处理无法正常工作

通过套接字的iOS连接无法正常工作

连接到套接字时似乎无法正常工作

php套接字无法正常工作(CentOS 7)

为什么我的Unix域套接字无法正常工作

通过套接字接收信息无法正常工作

使用套接字的C#委托无法正常工作

Lync UCWA是否支持聊天室?

聊天室按地区分组

发送/接收Python聊天室不起作用(已更新)

Python套接字,高级聊天框

无法在具有特定IP和端口的Linux机器上使用Python使原始UDP套接字正常工作

会议室数据库加载聊天室时获取最后的聊天室消息

无法在聊天室的左侧和右侧显示消息列表,始终在左侧(接收方)显示所有消息

无法在android中创建聊天室,并且未从服务器(tigase服务器)获得响应

指望聊天无法正常工作QuickBlox

如何通过Rest API在ejabberd中创建聊天室?

如何配置需要身份验证的聊天室