2017-11-29 3 views
2

私はソケットとスレッドモジュールを使用してPythonでサーバーとクライアントの通信を行っています。私はサーバーにクライアントを接続し、いくつかのデータを送信し、いくつかのデータを受信するが、問題は、私は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内のスレッドのために:'んサーバがクライアントからの接続を取得するたびに 'self.threads'でスレッドを開始します。あなたが望むものではありません。 –

+1

これは 'Thread(target = self.handle_client、args =(client、addr))。start()'を使ってください。 – xaav

+0

@ xaav私はearielを使って、forループが何かを変えることができると期待しました。 –

答えて

0

あなたは、クライアントを閉じるには、あまりにも、クライアントに終了メッセージ'q^'を送信する必要があります。

警告: 文字列のエンコードとしてUnicodeを使用することは、ソケットではお勧めできません。部分的なUnicode文字がサーバー/クライアントで受信され、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:

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() 
関連する問題