【问题标题】:Chat Client/Server problems on PythonPython 上的聊天客户端/服务器问题
【发布时间】:2018-08-08 20:08:47
【问题描述】:

我和我的一个朋友正在用 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。

【问题讨论】:

    标签: python sockets server client chat


    【解决方案1】:

    当您说connect.join() 时,您等待线程connect 完成,但它处于无限循环中,因此直到连接关闭才完成。

    【讨论】:

    • 所以基本上我应该只删除它?
    • 我删除了它,但还有另一个问题,现在它首先显示表示已连接的 msg_box,两秒钟后显示连接失败...
    猜你喜欢
    • 2016-11-07
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多