Python上的聊天客户端/服务器问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python上的聊天客户端/服务器问题相关的知识,希望对你有一定的参考价值。

我和我的一个朋友正在用python做聊天室,基本上他正在做服务器部分我正在做GUI和客户端部分,我不知道为什么应用程序停止工作而没有任何理由显示Windows消息“Python没有响应”

这是服务器代码:

#max name length=9999
#max message types=100
#max groupmsg recipients = 9999
#max msg length =8191 characters

import socket
import threading
import sys

def find_users(): #Continously Searches For New Clients
   while True:
      user, client_address = connector.accept()
      threading.Thread(target=new_user, args=(user,)).start()

def new_user(identity):
    while True:
       print(identity)
       name_length=identity.recv(4).decode() #max user name length =9999
       username=identity.recv(int(name_length)).decode()
       password=identity.recv(8192).decode()
       if username in user_details and password == user_details[username]: #correct credentials
          client_details[usename]=identity
          identity.sendall('y'.encode())
          break

       elif username in user_details: #incorrect password
          print('Please Re-enter The User Details')
          identity.sendall('n'.encode())

       else: #New user
            user_details[username]=password
            client_details[username]=identity
            identity.sendall('y'.encode())
            break

    pubmsg(username+' has connected')
    active_users.append(username)
    identity.settimeout(5)

    try:
       while True: #waits for incoming messages
           msgtype= identity.recv(2).decode() #identifies message type, max types =100

           if msgtype == '01': #public message
              communication = identity.recv(8192).decode()
              pubmsg(str(username + ' >>> ' + communication))

           elif msgtype == '02': #private message
              direction=[]
              recipno=identitiy.recv(4) #defines max group msg recipients
              for y in range(0,recipno): #repeats once per recipient
                 recip_name_length=identity.recv(4).decode()
                 recip_name=identity.recv(recip_name_length).decode()
                 direction.append(recip_name)

              gmsg=identity.recv(8192).decode()
              groupmsg(gmsg,direction)

    except Exception as e:
       active_users.remove(username)
       del client_details[username]
       pubmsg(username+' disconnected')
       identity.close()
       sys.exit()

def pubmsg(Group_message):
   print(Group_message)
   for person in client_details:
      client_details[person].sendall(Group_message.encode())

def groupmsg(Direct_message,recipients,sender):
    gmsg=sender +' (to '
    for person in recipients: #repeats once per recipient
        gmsg+=person+', '

    gmsg=gmsg.rstrip(', ')
    gmsg=gmsg + ')' + ' >>> ' + Direct_message

    for person in recipients:
        client_details[person].sendall(gmsg)

user_details={}
client_details={}
active_users=[]

connector = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Launching Server')
connector.bind(('localhost', 5000)) #Links socket to server address

connector.listen(10)
threading.Thread(target=find_users).start()

对于客户端和GUI,我只在这里放置GUI的“连接”按钮调用的函数(创建问题的那个),GUI使用QT库

这是按钮调用的代码:

def client_connect(self):
        ip_address = str(self.ipText.toPlainText())
        port = int(self.portText.toPlainText())
        nickname = self.nameText.toPlainText()
        password = 'hello'

        connect = threading.Thread(target = connection_thread, args = (ip_address, port, nickname, password))
        connect.start()

这是线程函数:

def connection_thread(address, port, nickname, password):
        nickname = nickname.encode()
        password = password.encode()
        while True:
                try:
                        c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        c.connect((address, port))
                        c.sendall('{0:0=4d}'.format(len(nickname)).encode())
                        c.sendall(nickname)
                        c.sendall(password)
                        answr = c.recv(2).decode()
                        if answr == 'y':
                                msg_box("CONNECTED", "Now you are connected to the server.")
                                while True:
                                        time.sleep(2)
                                        c.sendall('03'.encode())
                                        message_received =c.recv(8192).decode()
                                        self.chatList.addItem(message_received)
                except Exception as e:
                        msg_box("CONNECTION FAILED", "Connection to server failed, try again.")
                        break

从服务器代码到我的客户端的连接到达但是,客户端停止工作而没有显示说明我们已连接的msg_box。

答案

当你说connect.join()你等待线程connect完成,但它是在一个无限循环,所以它不会完成,直到连接关闭。

以上是关于Python上的聊天客户端/服务器问题的主要内容,如果未能解决你的问题,请参考以下文章

Python聊天室

在Python中使用select()方法进行客户端/服务器聊天

python中的聊天服务器/客户端

一个python程序——聊天

Python 多人聊天工具 ( 多线程 )

Python实现多用户全双工聊天(一对一)