Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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
运行python代码结果[WinError 10061]无法建立连接,因为目标计算机主动拒绝连接_Python - Fatal编程技术网

运行python代码结果[WinError 10061]无法建立连接,因为目标计算机主动拒绝连接

运行python代码结果[WinError 10061]无法建立连接,因为目标计算机主动拒绝连接,python,Python,你好,我想知道为什么它不起作用 import asyncio import PNUtils import random import threading from GameServerHandler import GameServer class StallServer(asyncio.Protocol): def __init__(self, current_connections): self.current_connections = current_conn

你好,我想知道为什么它不起作用

import asyncio
import PNUtils
import random
import threading
from GameServerHandler import GameServer


class StallServer(asyncio.Protocol):

    def __init__(self, current_connections):
        self.current_connections = current_connections
        self.transport = None
        self.ip = None
        self.index = None
        self.serial = None

    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport
        self.ip = self.transport.get_extra_info("peername")[0]
        self.transport.write(bytearray())
        self.transport.write(bytes.fromhex('04 00 00 00 ef ee ee ee'))

    def connection_lost(self, exc):
        print("connection_lost")
        try:
            self.disconnect_user()
            del current_connections[(self.index, self.serial)]
            self.prune_channels()
        except:
            print("err")

    def data_received(self, data: bytes):
        data_copy = bytearray(data)
        for packet in PNUtils.split_packets(data_copy):
            PNUtils.decode(packet)
            if packet:
                self.handle_client_request(packet[4], packet)
            else:
                print("NO PACKET FROM CLIENT")
                self.transport.close()

    def handle_client_request(self, opcode, buffer):
        print("Client")
        print(opcode)
        switch = {
            2: self.login,
            51: self.handle_create_role,
            52: self.get_in_game,
            54: self.heartbeat,
            53: self.select_object,
            56: self.select_object,
            55: self.select_object
        }
        switch.get(opcode, self.unknown_packet)(buffer)

    def handle_create_role(self, buffer):
        msg = bytearray()
        role_json = buffer[12: 12 + buffer[8]]
        print(role_json.decode())
        PNUtils.write_int(msg, 4 + 4 + 4 + 4 + 4 + len(role_json))
        # Message type 9
        PNUtils.write_int(msg, 9)
        # Index
        PNUtils.write_int(msg, self.index)
        # Serial
        PNUtils.write_int(msg, self.serial)
        # Message type 51 for create role
        PNUtils.write_int(msg, 51)
        # JSON Role Info
        try:
            PNUtils.write_string(msg, role_json.decode())
        except:
            print("could not create role")
            print(role_json.decode())
            return
        game_server.send(msg)

    #         Send signal to disconnect user to game server
    def disconnect_user(self):
        # # Length of packet
        msg = bytearray()
        PNUtils.write_int(msg, 4 + 4 + 4)
        PNUtils.write_int(msg, 8)
        # Index
        PNUtils.write_int(msg, self.index)
        # Serial
        PNUtils.write_int(msg, self.serial)
        game_server.send(msg)

    def prune_channels(self):
        for i in channels:
            for j in channels[i]:
                if j not in self.current_connections.copy():
                    channels[i].remove(j)

    def heartbeat(self, buffer):
        print("".join(chr(x) for x in buffer))
        msg = bytearray(PNUtils.int_to_little_endian(4 + 4 + 4 + len(buffer[4:])))
        # Message type 9
        PNUtils.write_int(msg, 9)
        # Index
        PNUtils.write_int(msg, self.index)
        # Serial
        PNUtils.write_int(msg, self.serial)
        msg.extend(buffer[4:])
        print(list(msg))
        print("".join(chr(x) for x in msg))
        game_server.send(msg)

    def unknown_packet(self, buffer):
        print("Unknown")
        print("".join(chr(x) for x in buffer))
        for b in buffer:
            print(b)
        print(list(buffer))

    def get_in_game(self, buffer):
        msg = bytearray()
        PNUtils.write_int(msg, 4 + 4 + 4 + len(buffer[4:]))
        # Message type 9
        PNUtils.write_int(msg, 9)
        # Index
        PNUtils.write_int(msg, self.index)
        # Serial
        PNUtils.write_int(msg, self.serial)
        # Rest of the message
        msg.extend(buffer[4:])
        game_server.send(msg)

    # login to the server
    def login(self, buffer):
        # Get login info from buffer
        username = PNUtils.read_string(buffer, 12, buffer[8])
        password = PNUtils.read_string(buffer, 12 + buffer[8] + 4, buffer[12 + buffer[8]])
        login_details = bytearray()
        index = random.randint(0, 2147483647)
        serial = random.randint(0, 2147483647)
        self.index = index
        self.serial = serial
        # Length of packet
        PNUtils.write_int(login_details, 4 + 4 + len(username) + 4 + len(password) + 4 + len(self.ip) + 1 + 4 + 4)
        # Write type. 6 = login packet
        PNUtils.write_int(login_details, 6)
        # Username
        PNUtils.write_string(login_details, username)
        print(len(password))
        # Password
        PNUtils.write_string(login_details, password)
        print(list(login_details))
        # IP
        PNUtils.write_int(login_details, len(self.ip) + 1)
        login_details.extend(map(ord, self.ip))
        login_details.append(0)
        # Index
        PNUtils.write_int(login_details, self.index)
        # Serial
        PNUtils.write_int(login_details, self.serial)
        game_server.send(login_details)
        # Add connection to current connection list
        current_connections[(self.index, self.serial)] = self.transport
        print(f"TALK ID ADDED: {(self.index, self.serial)}")
        print(self.current_connections)
        # print(self.current_connections_aliases)
        print("Conn added")

    def select_object(self, buffer):
        msg = bytearray(PNUtils.int_to_little_endian(4 + 4 + 4 + len(buffer[4:])))
        # Message type 9
        PNUtils.write_int(msg, 9)
        PNUtils.write_int(msg, self.index)
        # Serial
        PNUtils.write_int(msg, self.serial)
        msg.extend(buffer[4:])
        game_server.send(msg)


async def main():
    loop = asyncio.get_running_loop()

    server = await loop.create_server(
        lambda: StallServer(current_connections),
        'localhost', 7001)
    print("Server started")
    async with server:
        await server.serve_forever()


current_connections = {}
channels = {}

game_server = GameServer(current_connections, channels)
threading.Thread(target=game_server.start).start()
asyncio.run(main())
当我在VisualStudio中运行它时,代码会产生

PS C:\Users\kats> & python c:/app/bin/NIOMain.py
Traceback (most recent call last):
  File "c:\app\bin\NIOMain.py", line 193, in <module>
    game_server = GameServer(current_connections, channels)
  File "c:\app\bin\GameServerHandler.py", line 18, in __init__
    self.game_socket.connect(("localhost", 8001))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
导入套接字 导入选择器 导入选择 导入PNUtils 输入键盘 从集合导入deque

类游戏服务器: 当前连接:dict 频道:dict 消息列表:deque

def __init__(self, current_connections, channels):
    self.current_connections = current_connections
    self.channels = channels
    self.game_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.game_socket.connect(("localhost", 8001))
    self.message_list = deque()
    # self.game_socket.settimeout(1)
    self.game_socket.setblocking(False)

def send(self, data):
    self.game_socket.send(data)
    # self.message_list.append(data)

def start(self):
    hello = bytearray()
    PNUtils.write_int(hello, 4)
    PNUtils.write_int(hello, 1)
    self.game_socket.send(hello)
    sel = selectors.DefaultSelector()
    sel.register(self.game_socket, selectors.EVENT_READ, self.server_read)
    while True:
        if keyboard.is_pressed('b'):
            print('server loop')
        for key, mask in sel.select(2):
            callback = key.data
            callback(key.fileobj, mask)
    #     readable, writable, exceptional = select.select([self.game_socket], [self.game_socket], [self.game_socket], 3)
    #     for s in readable:
    #         self.server_read(s, 0)
    #     for s in writable:
    #         if len(self.message_list) > 0:
    #             message = self.message_list.popleft()
    #             s.send(message)
    #     for s in exceptional:
    #         print("EXCEPTION")
    #         exit(1)


def server_read(self, conn, mask):
    try:
        data = bytearray(conn.recv(1024))
    except:
        print("COULD NOT RETURN BYTES FROM SERVER BUFFER")
        return
    # Read msg len and split up accordingly
    buff = data
    while len(buff) == 1024:
        try:
            buff = bytearray(conn.recv(1024))
        except:
            print("COULD NOT RETURN BYTES FROM SERVER BUFFER")
            return
        data.extend(buff)
    for packet in PNUtils.split_packets(data):
        if packet:
            self.handle_server_request(packet[4], packet, conn)
        else:
            print("NO PACKET FROM SERVER")

def handle_server_request(self, opcode, buffer: bytearray, conn):
    print("Server")
    print(opcode)
    switch = {
        51: self.return_created_role,
        70: self.send_server_time,
        53: self.send_object,
        56: self.send_object,
        55: self.send_object,
        60: self.send_object,
        59: self.send_object,
        75: self.send_object,
        48: self.handle_channel,
        47: self.send_to_channel,
        46: self.send_to_all,
        65: self.send_object,
        66: self.send_object,
        58: self.send_object,
        67: self.send_object,
        57: self.send_object,
        62: self.send_object,
        71: self.send_object,
        54: self.send_object,
        72: self.send_object,
        68: self.send_object,
        49: self.close_client,
        69: self.send_object,
        99: self.send_object,
        44: self.send_login_return,
        # 73: self.return_account_in_use,
        73: self.send_object,
        52: self.send_object
    }
    switch.get(opcode, self.unknown_packet)(buffer, conn)

def send_object(self, buffer, conn):
    msg_type = buffer[4:8]
    # if msg_type == PNUtils.int_to_little_endian(68):
    print("".join(chr(x) for x in buffer))
    print(list(buffer))
    # Index
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    # JSON object
    msg = bytearray(msg_type)
    msg.extend(buffer[16:])
    # if msg_type == PNUtils.int_to_little_endian(68):
    print("".join(chr(x) for x in msg))
    print(list(msg))
    PNUtils.encode(msg)
    # Message header
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def return_created_role(self, buffer, conn):
    print("Role create")
    print("".join(chr(x) for x in buffer))
    role_info = buffer[20:len(buffer) - 1].decode()
    print(list(buffer))
    print(role_info)
    msg = bytearray()
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    print((index, serial))
    PNUtils.write_int(msg, 51)
    PNUtils.write_string(msg, role_info)
    PNUtils.encode(msg)
    msglen = bytearray()
    PNUtils.write_int(msglen, 4 + 4 + len(role_info))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def send_login_code(self, buff, err):
    # Index
    index = PNUtils.little_endian_bytes_to_int(buff[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buff[12:16])
    msg = bytearray(PNUtils.int_to_little_endian(2))
    msg.extend(PNUtils.int_to_little_endian(err))
    PNUtils.encode(msg)
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    print((index, serial))
    self.send_to_talk_id((index, serial), msglen)

def send_server_time(self, buffer, conn):
    msg = bytearray()
    # Index
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    # JSON of TIME AND TIME1
    msg.extend(buffer[16:])
    msglen = bytearray()
    PNUtils.encode(msg)
    PNUtils.write_int(msglen, len(buffer[16:]))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def send_login_return(self, buff, conn):
    print("login return")
    print(list(buff))
    print("".join(chr(x) for x in buff))
    # Index
    index = PNUtils.little_endian_bytes_to_int(buff[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buff[12:16])
    msg = bytearray(PNUtils.int_to_little_endian(2))
    msg.extend(buff[len(buff) - 4:])
    PNUtils.encode(msg)
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def handle_channel(self, buff, conn):
    channel_id = PNUtils.little_endian_bytes_to_int(buff[8:12])
    msg_type = PNUtils.little_endian_bytes_to_int(buff[12:16])
    if msg_type == 1:
        print("channel created: " + str(channel_id))
        self.channels[channel_id] = []
    elif msg_type == 3:
        index = PNUtils.little_endian_bytes_to_int(buff[16:20])
        serial = PNUtils.little_endian_bytes_to_int(buff[20:24])
        try:
            self.channels[channel_id].append(self.current_connections[(index, serial)])
        except:
            print(f"COULD NOT ADD TO CHANNEL " + str(channel_id))

def send_to_channel(self, buff, conn):
    channel_id = PNUtils.little_endian_bytes_to_int(buff[8:12])
    msg = bytearray(PNUtils.int_to_little_endian(len(buff[12:])))
    data = buff[12:]
    PNUtils.encode(data)
    msg.extend(data)
    try:
        for talk_id in self.channels[channel_id].copy():
            talk_id.write(msg)
    except:
        print("Couldn't send to channel " + str(channel_id))

def send_to_all(self, buffer, conn):
    # Send to all in buffer
    print(list(buffer))
    msg = bytearray(PNUtils.int_to_little_endian(len(buffer[8:])))
    data = buffer[8:]
    PNUtils.encode(data)
    msg.extend(data)
    print(list(msg))
    for k in self.current_connections.copy():
        self.send_to_talk_id(k, msg)

def close_client(self, buffer, conn):
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    print(f"CLOSING CLIENT {(index, serial)}")
    try:
        self.current_connections[(index, serial)].close()
    except:
        print("Already closed")

def send_to_talk_id(self, id, msg):
    try:
        self.current_connections[id].write(msg)
    except:
        print("guys dead mate")

def unknown_packet(self, buffer, conn):
    print("Unknown")
    print("".join(chr(x) for x in buffer))
    for b in buffer:
        print(b)
    print(list(buffer))

我尝试过适应本地主机和不同的端口,但一点运气都没有。请帮助

有人能帮我解决这个问题吗
def __init__(self, current_connections, channels):
    self.current_connections = current_connections
    self.channels = channels
    self.game_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.game_socket.connect(("localhost", 8001))
    self.message_list = deque()
    # self.game_socket.settimeout(1)
    self.game_socket.setblocking(False)

def send(self, data):
    self.game_socket.send(data)
    # self.message_list.append(data)

def start(self):
    hello = bytearray()
    PNUtils.write_int(hello, 4)
    PNUtils.write_int(hello, 1)
    self.game_socket.send(hello)
    sel = selectors.DefaultSelector()
    sel.register(self.game_socket, selectors.EVENT_READ, self.server_read)
    while True:
        if keyboard.is_pressed('b'):
            print('server loop')
        for key, mask in sel.select(2):
            callback = key.data
            callback(key.fileobj, mask)
    #     readable, writable, exceptional = select.select([self.game_socket], [self.game_socket], [self.game_socket], 3)
    #     for s in readable:
    #         self.server_read(s, 0)
    #     for s in writable:
    #         if len(self.message_list) > 0:
    #             message = self.message_list.popleft()
    #             s.send(message)
    #     for s in exceptional:
    #         print("EXCEPTION")
    #         exit(1)


def server_read(self, conn, mask):
    try:
        data = bytearray(conn.recv(1024))
    except:
        print("COULD NOT RETURN BYTES FROM SERVER BUFFER")
        return
    # Read msg len and split up accordingly
    buff = data
    while len(buff) == 1024:
        try:
            buff = bytearray(conn.recv(1024))
        except:
            print("COULD NOT RETURN BYTES FROM SERVER BUFFER")
            return
        data.extend(buff)
    for packet in PNUtils.split_packets(data):
        if packet:
            self.handle_server_request(packet[4], packet, conn)
        else:
            print("NO PACKET FROM SERVER")

def handle_server_request(self, opcode, buffer: bytearray, conn):
    print("Server")
    print(opcode)
    switch = {
        51: self.return_created_role,
        70: self.send_server_time,
        53: self.send_object,
        56: self.send_object,
        55: self.send_object,
        60: self.send_object,
        59: self.send_object,
        75: self.send_object,
        48: self.handle_channel,
        47: self.send_to_channel,
        46: self.send_to_all,
        65: self.send_object,
        66: self.send_object,
        58: self.send_object,
        67: self.send_object,
        57: self.send_object,
        62: self.send_object,
        71: self.send_object,
        54: self.send_object,
        72: self.send_object,
        68: self.send_object,
        49: self.close_client,
        69: self.send_object,
        99: self.send_object,
        44: self.send_login_return,
        # 73: self.return_account_in_use,
        73: self.send_object,
        52: self.send_object
    }
    switch.get(opcode, self.unknown_packet)(buffer, conn)

def send_object(self, buffer, conn):
    msg_type = buffer[4:8]
    # if msg_type == PNUtils.int_to_little_endian(68):
    print("".join(chr(x) for x in buffer))
    print(list(buffer))
    # Index
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    # JSON object
    msg = bytearray(msg_type)
    msg.extend(buffer[16:])
    # if msg_type == PNUtils.int_to_little_endian(68):
    print("".join(chr(x) for x in msg))
    print(list(msg))
    PNUtils.encode(msg)
    # Message header
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def return_created_role(self, buffer, conn):
    print("Role create")
    print("".join(chr(x) for x in buffer))
    role_info = buffer[20:len(buffer) - 1].decode()
    print(list(buffer))
    print(role_info)
    msg = bytearray()
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    print((index, serial))
    PNUtils.write_int(msg, 51)
    PNUtils.write_string(msg, role_info)
    PNUtils.encode(msg)
    msglen = bytearray()
    PNUtils.write_int(msglen, 4 + 4 + len(role_info))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def send_login_code(self, buff, err):
    # Index
    index = PNUtils.little_endian_bytes_to_int(buff[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buff[12:16])
    msg = bytearray(PNUtils.int_to_little_endian(2))
    msg.extend(PNUtils.int_to_little_endian(err))
    PNUtils.encode(msg)
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    print((index, serial))
    self.send_to_talk_id((index, serial), msglen)

def send_server_time(self, buffer, conn):
    msg = bytearray()
    # Index
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    # JSON of TIME AND TIME1
    msg.extend(buffer[16:])
    msglen = bytearray()
    PNUtils.encode(msg)
    PNUtils.write_int(msglen, len(buffer[16:]))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def send_login_return(self, buff, conn):
    print("login return")
    print(list(buff))
    print("".join(chr(x) for x in buff))
    # Index
    index = PNUtils.little_endian_bytes_to_int(buff[8:12])
    # Serial
    serial = PNUtils.little_endian_bytes_to_int(buff[12:16])
    msg = bytearray(PNUtils.int_to_little_endian(2))
    msg.extend(buff[len(buff) - 4:])
    PNUtils.encode(msg)
    msglen = bytearray(PNUtils.int_to_little_endian(len(msg)))
    msglen.extend(msg)
    self.send_to_talk_id((index, serial), msglen)

def handle_channel(self, buff, conn):
    channel_id = PNUtils.little_endian_bytes_to_int(buff[8:12])
    msg_type = PNUtils.little_endian_bytes_to_int(buff[12:16])
    if msg_type == 1:
        print("channel created: " + str(channel_id))
        self.channels[channel_id] = []
    elif msg_type == 3:
        index = PNUtils.little_endian_bytes_to_int(buff[16:20])
        serial = PNUtils.little_endian_bytes_to_int(buff[20:24])
        try:
            self.channels[channel_id].append(self.current_connections[(index, serial)])
        except:
            print(f"COULD NOT ADD TO CHANNEL " + str(channel_id))

def send_to_channel(self, buff, conn):
    channel_id = PNUtils.little_endian_bytes_to_int(buff[8:12])
    msg = bytearray(PNUtils.int_to_little_endian(len(buff[12:])))
    data = buff[12:]
    PNUtils.encode(data)
    msg.extend(data)
    try:
        for talk_id in self.channels[channel_id].copy():
            talk_id.write(msg)
    except:
        print("Couldn't send to channel " + str(channel_id))

def send_to_all(self, buffer, conn):
    # Send to all in buffer
    print(list(buffer))
    msg = bytearray(PNUtils.int_to_little_endian(len(buffer[8:])))
    data = buffer[8:]
    PNUtils.encode(data)
    msg.extend(data)
    print(list(msg))
    for k in self.current_connections.copy():
        self.send_to_talk_id(k, msg)

def close_client(self, buffer, conn):
    index = PNUtils.little_endian_bytes_to_int(buffer[8:12])
    serial = PNUtils.little_endian_bytes_to_int(buffer[12:16])
    print(f"CLOSING CLIENT {(index, serial)}")
    try:
        self.current_connections[(index, serial)].close()
    except:
        print("Already closed")

def send_to_talk_id(self, id, msg):
    try:
        self.current_connections[id].write(msg)
    except:
        print("guys dead mate")

def unknown_packet(self, buffer, conn):
    print("Unknown")
    print("".join(chr(x) for x in buffer))
    for b in buffer:
        print(b)
    print(list(buffer))