2017-01-16 113 views
0

我想建立一個使用python的小聊天服務器/客戶端。到目前爲止,我認爲我設法設置了它,但我遇到了問題。我想將程序設置爲多線程以保持服務器偵聽連接,並且還要繼續偵聽數據,然後讓主程序循環保留在客戶端發送中。這裏是我的代碼,並且我在啓動listen函數時遇到了一個問題,它告訴我參數必須是可迭代的而不是套接字。聊天程序線程

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

安置自己的錯誤追蹤請 – nlsdfnbch

回答

1

您需要使參數的元組

你應該參數列表後提供一個額外的逗號爲:

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

當你看看類型兩者的差異可以看出:

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