簡體   English   中英

在Python上聊天客戶端/服務器問題

[英]Chat Client/Server problems on 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完成,但是它處於無限循環中,因此直到連接關閉才完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM