2017-11-29 3 views
2

소켓과 스레딩 모듈을 사용하여 파이썬에서 서버 - 클라이언트 통신을 만들고 있습니다. 클라이언트를 서버에 연결하고 일부 데이터를 보내고 일부 데이터를 수신하지만 문제는 두 가지 메시지 만 보낼 수 있다는 것입니다. 그 후에는 서버가 내 패킷을 수신하지 않습니다. 누군가가 무엇이 잘못되었는지 말해 줄 수 있습니까? 미리 감사드립니다.서버 루프 Python 소켓 및 스레딩 모듈 사용

Server.py :

import socket 
from threading import Thread 


class Server: 
    def __init__(self): 
     self.host = '127.0.0.1' 
     self.port = 9999 
     self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.server.bind((self.host, self.port)) 
     self.server.listen(5) 
     self.threads = [] 

     self.listen_for_clients() 

    def listen_for_clients(self): 
     print('Listening...') 
     while True: 
      client, addr = self.server.accept() 
      print('Accepted Connection from: '+str(addr[0])+':'+str(addr[1])) 
      self.threads.append(Thread(target=self.handle_client, args=(client, addr))) 
      for thread in self.threads: 
       thread.start() 

    def handle_client(self, client_socket, address): 
     client_socket.send('Welcome to server'.encode()) 
     size = 1024 
     while True: 
      message = client_socket.recv(size) 
      if message.decode() == 'q^': 
       print('Received request for exit from: '+str(address[0])+':'+str(address[1])) 
       break 
      else: 
       print('Received: '+message.decode()+' from: '+str(address[0])+':'+str(address[1])) 

     client_socket.send('Received request for exit. Deleted from server threads'.encode()) 
     client_socket.close() 

if __name__=="__main__": 
    main = Server() 

Client.py

import socket 
import sys, time 

def main(): 
    target_host = '127.0.0.1' 
    target_port = 9999 

    try: 
     client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    except socket.error: 
     print('Could not create a socket') 
     time.sleep(1) 
     sys.exit() 

    try: 
     client.connect((target_host, target_port)) 
    except socket.error: 
     print('Could not connect to server') 
     time.sleep(1) 
     sys.exit() 

    while True: 
     data = input() 
     client.send(data.encode()) 
     message = client.recv(4096) 
     print('[+] Received: '+ message.decode()) 

main() 
+2

''않습니다 서버가 클라이언트로부터의 접속을 취득 할 때마다'self.threads'의 thread를 개시합니다. 당신이 원하는 것이 아닙니다. –

+1

다음을 사용하십시오 :'Thread (target = self.handle_client, args = (client, addr)). start()'. – xaav

+0

@ xaav eariel을 사용하여 for 루프가 무언가를 바꿀 수 있기를 바랍니다. –

답변

0

당신은 클라이언트를 닫 너무 클라이언트에 종료 메시지 'q^'를 보낼 수 있습니다.

경고 : 유니 코드를 문자열 인코딩으로 사용하는 것은 소켓에서 권장되지 않습니다. 부분 유니 코드 문자가 서버/클라이언트에서 수신되어 UnicodeDecodeError이 발생합니다. 서버 사용하여 스레드

코드는 다음과 같습니다

server.py :

import socket 
from threading import Thread 


class Server: 
    def __init__(self, host, port): 
     self.host = host 
     self.port = port 
     self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.server.bind((self.host, self.port)) 
     self.server.listen(5) 

    def listen_for_clients(self): 
     print('Listening...') 
     while True: 
      client, addr = self.server.accept() 
      print(
       'Accepted Connection from: ' + str(addr[0]) + ':' + str(addr[1]) 
      ) 
      Thread(target=self.handle_client, args=(client, addr)).start() 

    def handle_client(self, client_socket, address): 
     size = 1024 
     while True: 
      try: 
       data = client_socket.recv(size) 
       if 'q^' in data.decode():  
        print('Received request for exit from: ' + str(
         address[0]) + ':' + str(address[1])) 
        break 

       else: 
        # send getting after receiving from client 
        client_socket.sendall('Welcome to server'.encode()) 

        print('Received: ' + data.decode() + ' from: ' + str(
         address[0]) + ':' + str(address[1])) 

      except socket.error: 
       client_socket.close() 
       return False 

     client_socket.sendall(
      'Received request for exit. Deleted from server threads'.encode() 
     ) 

     # send quit message to client too 
     client_socket.sendall(
      'q^'.encode() 
     ) 
     client_socket.close() 


if __name__ == "__main__": 
    host = '127.0.0.1' 
    port = 9999 
    main = Server(host, port) 
    # start listening for clients 
    main.listen_for_clients() 

client.py는 : self.threads의 스레드에 대한

import socket 
import sys, time 


def main(): 
    target_host = '127.0.0.1' 
    target_port = 9999 

    try: 
     client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    except socket.error: 
     print('Could not create a socket') 
     time.sleep(1) 
     sys.exit() 

    try: 
     client.connect((target_host, target_port)) 
    except socket.error: 
     print('Could not connect to server') 
     time.sleep(1) 
     sys.exit() 

    online = True 
    while online: 
     data = input() 
     client.sendall(data.encode()) 
     while True: 
      message = client.recv(4096) 
      if 'q^' in message.decode(): 
       client.close() 
       online = False 
       break 

      print('[+] Received: ' + message.decode()) 
      break # stop receiving 


# start client 
main()