Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonsocket-Can';I don’我再也不接了_Python_Sockets_Reconnect - Fatal编程技术网

pythonsocket-Can';I don’我再也不接了

pythonsocket-Can';I don’我再也不接了,python,sockets,reconnect,Python,Sockets,Reconnect,我已经设置了一个带有客户端和主机的套接字服务器。 在客户端断开连接之前,它可以正常工作,包括.shutdown()和.close()。 当我再次启动客户端时,它无法连接。 我想这不是因为我是如何编写代码的,而是因为我没有编写什么 如何使服务器真正断开客户端的连接,以便它可以再次连接 服务器: import socket, threading, time, json ONLINE_USERS = [] SESSION = None class User(): def __init__(

我已经设置了一个带有客户端和主机的套接字服务器。 在客户端断开连接之前,它可以正常工作,包括.shutdown()和.close()。 当我再次启动客户端时,它无法连接。 我想这不是因为我是如何编写代码的,而是因为我没有编写什么

如何使服务器真正断开客户端的连接,以便它可以再次连接

服务器:

import socket, threading, time, json

ONLINE_USERS = []
SESSION = None

class User():
    def __init__(user, connection, address):
        print('for', address, '{Connection established}')
        user.connection = connection
        user.address = address
        user.character = None
        threading.Thread(target=user.process, args=(), daemon=True).start()

    def process(user):
        time.sleep(1)

        user.send("&pLogin\n^^^^^\n")
        username = user.send("&iUser>")
        password = user.send("&iPass>")
        print(user.ping())
        print(user.logout())

    def send(user, *x):
        user.connection.sendall(str.encode(str(x)))
        data = user.connection.recv(1024)
        return data if data!=b'\x01' else True

    def recv(user, x):
        user.connection.recv(x)

    def ping(user):
        start = time.time()
        user.connection.sendall(b'\x02')
        end = float(user.connection.recv(1024))
        return round((end - start) * 1000)

    def logout(user):
        user.connection.sendall(b'\x04')
        return user.connection.recv(4)


class Session():
    def __init__(session, host='', port=12345):
        session.host = host
        session.port = port
        session.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        session.socket.bind((host, port))
        session.socket.listen(10)

        def accept():
            conn = User(*session.socket.accept())
        session.thread_accept = threading.Thread(target=accept, args=(), daemon=True).start()

    def shutdown():
        for user in ONLINE_USERS.keys():
            ONLINE_USERS[user].connection.sendall(bytes([0xF]))


if __name__ == '__main__':
    SESSION = Session()
    input('Press heart to continue!\n')
客户:

import socket, sys, threading, time, os


def clear(t=0.5):
    time.sleep(t)
    os.system('cls')

def tryeval(x, default):
    try:
        return eval(x)
    except:
        return default


class Client():
    def __init__(client):
        try:
            server_info = input('IP_ADDRESS:PORT>').split(':')
            client.host = server_info[0]
            client.port = int(server_info[1])
        except:
            client.host = 'localhost'
            client.port = 12345

        client.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.socket.settimeout(10)

        try:
            client.socket.connect((client.host, client.port))
            clear()
            client.data_exchange()

        finally:
            client.shutdown()

    def data_exchange(client):
        while True:
            data = client.socket.recv(1024)

            if data:
                if data==b'\x02':
                    client.socket.sendall(str.encode(str(time.time())))
                elif data==b'\x04':
                    client.shutdown()

                else:
                    data = tryeval(data, ())
                    response = []

                    for item in data:
                        try:
                            prefix, content = item[:2], item[2:]
                            if prefix=='&p':
                                print(content, end='')
                            elif prefix=='&i':
                                response.append(input(content))
                            if prefix=='&c':
                                time.sleep(float(content))
                                clear()
                        except:
                            pass

                    if len(response)>0:
                        client.socket.sendall(str.encode(str(tuple(response))))
                    else:
                        client.socket.sendall(b'\x01')


            time.sleep(0.001)

    def shutdown(client):
        try:
            client.socket.sendall(b'\x04')
        except:
            pass
        print('Shutting down program.')
        client.socket.shutdown(socket.SHUT_RDWR)
        print('Socket has been shutdown.')
        client.socket.close()
        print('Socket has been closed.')
        print('Exiting program')
        time.sleep(1)
        sys.exit()




if __name__ == '__main__':
    client = Client()

“服务器反复调用accept,等待新的传入连接。”不,不会。它在一个线程中调用
accept
一次,该线程退出Mark Tolonen

您是否收到错误消息?始终有问题显示完整错误消息(回溯)您的服务器呼叫接受多少次?我没有收到任何错误消息。如果要运行服务器和客户机,它可以工作。然后关闭客户端并再次打开它,它永远不会连接,什么也不会发生。服务器重复调用accept,等待新的传入连接。在会话下,您有以下内容:
def accept():conn=User(*Session.socket.accept())Session.thread\u accept=threading.thread(target=accept,args=(),daemon=True)。start()
“服务器重复调用accept,等待新的传入连接。”不,它不会。它在一个线程中调用
accept
一次,然后退出。哎哟。。。我怎么会错过呢?x) 谢谢你指出这一点。现在可以了。有点尴尬。既然这只是我的疏忽,我是否应该删除这篇文章,这样其他人就不会来这里寻找答案,而事实上这与我无关?