【问题标题】:Error: Transport endpoint is not connected (Python Sockets)错误:传输端点未连接(Python 套接字)
【发布时间】:2016-06-28 10:32:29
【问题描述】:

我正在尝试使用 Python 中的套接字(带有线程)创建一个简单的聊天应用程序。应用程序很简单,客户端必须线程一个来发送数据,另一个线程来接收。服务器有两个线程,一个接受客户端连接,另一个用于广播消息。但是在运行下面的代码时,我收到了错误消息

传输端点未连接

谁能告诉我为什么会出现这个错误

客户

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()

【问题讨论】:

    标签: python multithreading sockets chat


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2012-04-10
      • 1970-01-01
      • 2011-10-31
      • 2018-11-06
      相关资源
      最近更新 更多