Была предпринята попытка выполнить операцию на том, что не является сокетом в Python - PullRequest
0 голосов
/ 11 октября 2019

В моей программе я хочу, чтобы сокет подключался к серверу без блокировки основного потока, поэтому я запускаю другой поток для выполнения моей функции connect_to_server(ip, port).

Первое подключение проходит гладко и при выходе изпоток безопасно выходит из функции и заканчивает свою роль.

Однако при попытке второго запуска потока я получаю сообщение об ошибке.

Я, честно говоря, понятия не имел, куда и как мне поступитьустранение этой проблемы, потому что, насколько мне известно, сокет client не изменяется нигде в этой функции и не может быть изменен извне, потому что он находится в функции.

def connect_to_server(ip, port):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((ip, port))

    data = _receive(client).decode()
    if data == "valid":
        print("Maintaining connection with server.")
        _send(client, "OK".encode())

        # Starting thread to to recv data simultaneously
        start_new_thread(receive_data, (client, ))

        # Connecting to the game server until disconnection.
        while True:
                # Data sending if there is data to send in input queue
                data = to_server_queue.get(True)
                print("Data sent to server", data)
                _send(client, data)
                if some_condition_to_break:
                    break
    client.close()

def receive_data(client):
    while True:
        data = _receive(client)
        output_queue.put(data)
        if some_condition_to_break:
            break


def _send(conn, data):
    """
    Sends the data. First sends length of incoming data, then the data itself.
    :param conn: The 'other side' of the connection.
    :param data: Data to be sent in bytes.
    :return:
    """
    try:
        length = len(data)
        length_to_send = ''
        for x in range(len(str(length)), 6):
            length_to_send += '0'
        length_to_send += str(length)

        conn.send(length_to_send.encode())
        conn.send(data)
    except Exception as e:
        raise e


def _receive(conn):
    """
    Receives data. First receives the length, then the data itself.
    :param conn: The 'other side' of the connection.
    :return: Returns the received data in bytes.
    """
    try:
        raw_data = conn.recv(6).decode()
        length = int(raw_data)
        raw_data = conn.recv(length)
        return raw_data
    except Exception as e:
        raise e

Это ошибкаЯ получаю, хотя я ожидаю, что он будет вести себя как первый поток.

Unhandled exception in thread started by <function connect_to_server at 0x0382BA08>
Traceback (most recent call last):
  File "C:\Users\---\PycharmProjects\----\Core.py", line 34, in _send
    conn.send(length_to_send.encode())
  File "C:\Users\---\PycharmProjects\----\Core.py", line 37, in _send
    raise e
OSError: [WinError 10038] An operation was attempted on something that is not a socket
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...