2016-11-30 3 views
0

파이썬 서버에 연결되어있는 여러 사람이 메시지를 입력하고 다른 사람이 Enter 키를 눌러야 볼 필요없이 즉시 볼 수 있도록 연결하는 방법을 모릅니다. 여기서 스레딩을 어떻게 사용합니까?스레딩 및 네트워킹

서버 :

import socket, thread 

def reactor(sock,client,data): 
     try: 
      sock.sendto(data.encode('utf-8'),client) 
      sock.close() 
     except Exception,e : 
      print(e) 
      sock.close() 

def Main(): 
    host = '25.4.221.63' 
    port = 5000 

    clients = [] 


    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    s.bind((host,port)) 

    print("Server Started") 
    while True: 
     data,addr=s.recvfrom(1024) 
     if addr not in clients: 
      clients.append(addr) 
     data = data.decode('utf-8') 
     print("Message From: " + str(addr)) 
     print("From connected user: " + data) 
     print("Sending: " + data) 
     for client in clients: 
      try: 
       thread.start_new_thread(reactor,(s,client,data)) 
      except Exception,e : 
       print(e) 
       s.close() 



if __name__ == '__main__': 
    Main() 

클라이언트 :

import socket 

def Main(): 
    alias = input("ScreenName:") 
    inp = input("IP:") 

    host =inp 
    port = 5001 

    server = ('25.4.221.63',5000) 

    s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    s.bind((host,port)) 

    message = input("-> ") 

    while message != 'q': 
     s.sendto(message.encode('utf-8'), server) 
     data,addr = s.recvfrom(1024) 
     data = data.decode('utf-8') 
     print(data) 
     message = input(alias + ' -> ') 
    s.close() 


if __name__ == '__main__': 
    Main() 
+0

실제 IP 주소를 게시하는 것은 좋지 않을 것입니다. –

답변

0

스레드를 피하십시오; select을 사용하십시오.

소켓 또는 표준 입력에서 동시에 입력을 대기하려면 select 또는 epoll을 사용해야합니다. 소켓이 읽을 준비가되었음을 나타내는 select이라면 메시지를 읽으십시오. stdin이 읽을 준비가되면 사용자 입력을 읽습니다. 이 경우 직접 input을 구현해야합니다.

+1

하나의 잠재적 인 문제 (원본 포스터의 사용 사례에 따라 다름) : Windows에서는 select()/poll()을 stdin에서 사용할 수 없습니다. –