2016-03-13 34 views
1

我试图创建一个简单的聊天应用程序使用Python中的套接字(线程)。应用程序是简单的客户端必须线程发送数据和另一个接收。服务器必须有两个线程才能接受客户端连接,另一个线程才能广播消息。但在运行下面的代码,我收到错误消息错误:传输端点未连接(Python套接字)

Transport endpoint is not connected

enter image description here

谁能告诉我为什么我得到这个错误

客户

import socket, threading 

def send(): 
    msg = raw_input('Me > ') 
    cli_sock.send(msg) 

def receive(): 
    data = cli_sock.recv(4096) 
    print('> '+ str(data)) 

if __name__ == "__main__": 
    # socket 
    cli_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    # connect 
    HOST = 'localhost' 
    PORT = 5028 
    cli_sock.connect((HOST, PORT))  
    print('Connected to remote host...') 

    thread_send = threading.Thread(target = send) 
    thread_send.start() 

    thread_receive = threading.Thread(target = receive) 
    thread_receive.start() 

服务器

import socket, threading 

def accept_client(): 
    while True: 
     #accept  
     cli_sock, cli_add = ser_sock.accept() 
     CONNECTION_LIST.append(cli_sock) 
     print('Client (%s, %s) connected' % cli_add) 

def broadcast_data(): 
    while True: 
     data = ser_sock.recv(4096) 
     for csock in CONNECTION_LIST: 
      try: 
       csock.send(data) 
      except Exception as x: 
       print(x.message) 
       cli_sock.close() 
       CONNECTION_LIST.remove(cli_sock) 

if __name__ == "__main__":  
    CONNECTION_LIST = [] 

    # socket 
    ser_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    # bind 
    HOST = 'localhost' 
    PORT = 5028 
    ser_sock.bind((HOST, PORT)) 

    # listen   
    ser_sock.listen(1) 
    print('Chat server started on port : ' + str(PORT)) 

    thread_ac = threading.Thread(target = accept_client) 
    thread_ac.start() 

    thread_bd = threading.Thread(target = broadcast_data) 
    thread_bd.start() 

回答

1

您正在错误地使用服务器套接字。您不能在服务器套接字上使用recv,而使用accept连接; accept返回实际连接插座:

ser_sock.listen(1) 
sock, addr = ser_sock.accept() 

print('Got connection from {}'.format(addr)) 

# only this *connection* socket can receive! 
data = sock.recv(4096)