2017-01-16 2 views
0

Ich versuche, einen kleinen Chat-Server/Client mit Python zu bauen. Bisher habe ich es geschafft, es einzurichten, aber ich stoße auf Probleme. Ich wollte das Programm so einrichten, dass es Multithread-fähig ist, damit der Server nach Verbindungen lauscht und auch weiterhin auf Daten wartet und dann die Hauptprogrammschleife im Client bleibt. Hier ist mein Code, und ich stoße auf ein Problem, wenn ich die listen Funktion starte, es sagt mir, dass das Argument ein nicht iterabler Socket sein muss.Chat-Programm Threaded

import socket 
import platform 
import os 
import threading 

'''Define Globals''' 
HOST = "" 
PORT = 25000 
ADDR = (HOST, PORT) 
BUF = 1024 


def client_send(): 

    server_ip = input("[+] Server's IP to connect to: ") 

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client_socket.connect((server_ip, 25000)) 

    data_thread = threading.Thread(target=client_listen, args=(client_socket)) 
    data_thread.start() 

    while True: 
     data = input("[%s] => " % os.getlogin()) 
     client.send(str.encode("[%s] => " + data % os.getlogin())) 


def client_listen(client): 

    while True: 
     print(client.recv(BUF)) 


def server_loop(): 
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind(ADDR) 
    server.listen(10) 

    print("[+] Server started on %s" %platform.node()) 
    print("[+] Awaitiing connection from client..") 

    while True: 
     client_socket, client_addr = server.accept() 
     print("[+] New Connection from %s" %client_addr[0]) 


def main(): 

    server_thread = threading.Thread(target=server_loop) 

    while True: 

     try: 
      print("Select Operating Mode") 
      print("---------------------") 
      print("1. Server Mode") 
      print("2. Client Mode") 
      mode = int(input("Enter mode of operation: ")) 
      print("") 
      print("") 
      if mode in [1,2]: 
       break 
      else: 
       raise ValueError 
     except ValueError: 
      print("Enter either (1) for Server or (2) for Client") 


    if mode == 1: 
     server_thread.start() 
    elif mode == 2: 
     client_send() 



main() 
+0

Beitrag der Zurückverfolgungs Ihrer Fehler Bitte – nlsdfnbch

Antwort

1

Sie zu brauchen machen die Argumente ein Tupel.

Sie sollten ein zusätzliches Komma nach der Argumentliste liefern, wie in:

data_thread = threading.Thread(target=client_listen, args=(client_socket,)) 

Der Unterschied zu sehen ist, wenn man die Art der beide sehen in:

>>> type((client_socket)) 
<class 'socket._socketobject'> 
>>> type((client_socket,)) 
<type 'tuple'>