2013-03-09 2 views
0

Я сделал лучше чат клиента следующую помощь от людей:Мой чат-клиент зависает после начала резьбы

Они сказали мне, что если я не хочу быть заблокирован на .recv при ожидании сообщений, я должен был бы для использования потоков, классов, функций и очередей для этого.

Итак, я последовал за помощью, чтобы конкретный человек дал мне, где я создал поток из класса, а затем определил функцию, которая должна была читать входящие сообщения и печатать их.

Я также создал функцию, которая позволяет вводить вещи, которые нужно отправить.

Вещь, когда я запускаю программу. Ничего не произошло.

Может ли кто-нибудь помочь указать, что не так? (Я задавал вопросы и исследовал в течение 3-х дней, без получения в любом месте, так что я пробовал)

from socket import * 
import threading 
import json 
import select 

print("Client Version 3") 
HOST = input("Connect to: ") 
PORT = int(input("On port: ")) 
# Create Socket 

s = socket(AF_INET,SOCK_STREAM) 
s.connect((HOST,PORT)) 
print("Connected to: ",HOST,) 

#-------------------Need 2 threads for handling incoming and outgoing messages-- 

#  1: Create out_buffer: 
Buffer = [] 

rlist,wlist,xlist = select.select([s],Buffer,[]) 

class Incoming(threading.Thread): 
    # made a function a thread 
    def Incoming_messages(): 
     while True: 
      for i in rlist: 
       data = i.recv(1024) 
       if data: 
        print(data.decode()) 

# Now for outgoing data. 
def Outgoing(): 
    while True: 
     user_input=("Your message: ") 
     if user_input is True: 
      Buffer += [user_input.encode()] 
     for i in wlist: 
      s.sendall(Buffer) 
      Buffer = [] 

Спасибо за взглянуть, также благодаря Тони Львиного за предложение

ответ

1

гляньте в этой пересмотренной версии кода: (в python3.3)

from socket import * 
import threading 
import json 
import select 


print("client") 
HOST = input("connect to: ") 
PORT = int(input("on port: ")) 

# create the socket 
s = socket(AF_INET, SOCK_STREAM) 
s.connect((HOST, PORT)) 
print("connected to:", HOST) 

#------------------- need 2 threads for handling incoming and outgoing messages-- 

#  1: create out_buffer: 
out_buffer = [] 

# for incoming data 
def incoming(): 
    rlist,wlist,xlist = select.select([s], out_buffer, []) 
    while 1: 
     for i in rlist: 
      data = i.recv(1024) 
      if data: 
       print("\nreceived:", data.decode()) 

# now for outgoing data 
def outgoing(): 
    global out_buffer 
    while 1: 
     user_input=input("your message: ")+"\n" 
     if user_input: 
      out_buffer += [user_input.encode()] 
#  for i in wlist: 
      s.send(out_buffer[0]) 
      out_buffer = [] 

thread_in = threading.Thread(target=incoming, args=()) 
thread_out = threading.Thread(target=outgoing, args=()) 
thread_in.start() # this causes the thread to run 
thread_out.start() 
thread_in.join() # this waits until the thread has completed 
thread_out.join() 
  • в вашей программе, вы имели различные проблемы, а именно: вам нужно позвонить нити; недостаточно просто определить их.
  • Вы также забыли функцию input() в строке: user_input = input ("ваше сообщение:") + "\ n".
  • Функция «select()» блокировалась, пока у вас не было чего-то читать, поэтому программа не попала в следующие разделы кода, поэтому лучше переместить ее в поток чтения.
  • функция отправки в python не принимает список; в python 3.3 он принимает группу байтов, возвращаемую функцией encoded(), так что часть кода должна быть адаптирована.
+0

Спасибо, у меня действительно было много ошибок, я попытаюсь использовать это сразу. В последнее время это была настоящая борьба за то, чтобы это работало. Верьте или нет, я был у него в течение 2-3 дней без большой удачи. Ваш ответ для меня много значит, а не только другой ответ с ссылкой на документацию. Я отправлю любые другие вопросы, если у меня их есть. – Micrified

+0

Когда я запускаю это, он действует довольно странно. Вот что происходит: я открываю клиент # 1: И я подключаюсь к серверу. Затем я соединяю клиента № 2. (Ничего не происходит). Затем я ввожу что-то в сообщение «1 вашего клиента». Пользователь 2 не получает его. Однако, как только клиент 2 набирает и отправляет что-то, он получает сообщение. Теперь другой клиент не получает то, что только что отправил клиент 2. И он должен дождаться отправки сообщения, прежде чем он получит сообщение. Похоже, теперь вместо того, чтобы блокировать .recv. Похоже, что пользовательский вход останавливает процесс от получения и prin – Micrified

+0

И печатает сообщение. Есть ли способ обойти это? Необходимы ли процессы? – Micrified