2016-11-13 9 views
0

私はDrapsTVの名前でYouTuberからチュートリアルに従ってきました。このチュートリアルはPython 2.7で作成され、UDPを使ってネットワークチャットを行います。私はこれをPython 3に変換し、すべてを動作させました。しかし、スレッドを設定する方法は、他のクライアントからのメッセージを更新して受け取るために、メッセージを送信する(または空白のメッセージであるEnterを押す)必要があるということです。 https://www.youtube.com/watch?v=PkfwX6RjRaI(Python)メッセージをリアルタイムでリフレッシュせずに受信する方法を教えてください。

そしてここでは、私のサーバーのコードは次のとおりです:ここで

from socket import * 
import time 


address = input("IP Address: ") 
port = input("Port: ") 


clients = [] 


serversock = socket(AF_INET, SOCK_DGRAM) 
serversock.bind((address, int(port))) 
serversock.setblocking(0) 


quitting = False 
print("Server is up and running so far.") 


while not quitting: 
    try: 
     data, addr = serversock.recvfrom(1024) 
     if "Quit" in str(data): 
      quitting = True 
     if addr not in clients: 
      clients.append(addr) 
     print(time.ctime(time.time()) + str(addr) + ": :" + str(data.decode())) 
     for client in clients: 
      serversock.sendto(data, client) 
    except: 
     pass 
serversock.close() 

は私のクライアントコードは次のとおりです。

from socket import * 
import threading 
import time 


tLock = threading.Lock() 
shutdown = False 


def receiving(name, sock): 
    while not shutdown: 
     try: 
      tLock.acquire() 
      while True: 
       data, addr = sock.recvfrom(1024) 
       print(str(data.decode())) 
     except: 
      pass 
     finally: 
      tLock.release() 


address = input("IP Address: ") 
port = 0 


server = address, 6090 


clientsock = socket(AF_INET, SOCK_DGRAM) 
clientsock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
clientsock.bind((address, int(port))) 
clientsock.setblocking(0) 


rT = threading.Thread(target=receiving, args=("RecvThread", clientsock)) 
rT.start() 


nick = input("How about we get you a nickname: ") 
message = input(nick + "> ").encode() 
while message != "q": 
    if message != "": 
     clientsock.sendto(nick.encode() + "> ".encode() + message, server) 
    tLock.acquire() 
    message = input(nick + "> ").encode() 
    tLock.release() 
    time.sleep(0.2) 


shutdown = True 
rT.join() 
clientsock.close() 
+0

問題はntoソケットまたはスレッドですが、すべてのプログラムをブロックする 'input()'です。しかし、 'input()'を非ブロック化するための標準的な方法はありません。 2つのスレッドを作成することができます.1つはサーバからの受信用、もう1つはサーバへの送信用と 'input()'です。 – furas

+0

@furasそれを解決できますか? –

答えて

0

@furasは親切のための私の問題を説明しているここにあなたがそれを必要とするかもしれ包みビデオです私:それは私のスレッドや関数などの欠陥のある受信方法ではなく、クライアントが何も受信しないようにする入力呼び出しです。したがって、この問題を解決するために、私は、または特定のボタンが押されたときに入力を呼び出す方法を見つける必要があり、入力しない限りメッセージやデータを受け取ることができません。

ありがとう@furas! https://stackoverflow.com/users/1832058/furas

関連する問題