В моей программе я хочу, чтобы сокет подключался к серверу без блокировки основного потока, поэтому я запускаю другой поток для выполнения моей функции 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