#python #sockets #server #chat
Вопрос:
Журнал ошибок:
File "???PythonPython38libthreading.py", line 932, in _bootstrap_inner self.run() File "???PythonPython38libthreading.py", line 870, in run self._target(*self._args, **self._kwargs) File "main.py", line 27, in th_listen_user content = data.split('n'.encode('utf-8'))[3] IndexError: list index out of range
Код сервера:
import socket import threading as th server = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) server.bind(('127.0.0.1',8000)) server.listen(100) USERS = {} Exit = 0 def th_listen_user(user,adress): try: while True: data = user.recv(2048) ip = data.split('n'.encode('utf-8'))[0].decode('utf-8') port = int(data.split('n'.encode('utf-8'))[1].decode('utf-8')) part = data.split('n'.encode('utf-8'))[2] content = data.split('n'.encode('utf-8'))[3] print(data.split('n'.encode('utf-8'))) #check Log print(data) print(ip,port,part,content) except ConnectionResetError:print(f'lt;{adress[0]}:{adress[1]}gt; DISCONNECTED') def start_server(): global Exit while Exit==0: user_socket,adress = server.accept() print(f'lt;{adress[0]}:{adress[1]}gt; CONNECTED') USERS[adress] = user_socket th_func = th.Thread(target = th_listen_user,args = (user_socket,adress)) th_func.start() print(USERS)
Лог:
[b'127.0.0.1', b'9001', b'1', b'gAAAAABhitL94rJt4tAINg5Y1av_hY7YitgnrJD12pgNev6gjomZcYam9_VYQOZIR3Hyg-4mmPAyCKON2JZ3PSG9FHcQZLM_IyJZTAgFexlKc6UG1oVIBCo='] b'127.0.0.1n9001n1ngAAAAABhitL94rJt4tAINg5Y1av_hY7YitgnrJD12pgNev6gjomZcYam9_VYQOZIR3Hyg-4mmPAyCKON2JZ3PSG9FHcQZLM_IyJZTAgFexlKc6UG1oVIBCo=' 127.0.0.1 9001 b'1' b'gAAAAABhitL94rJt4tAINg5Y1av_hY7YitgnrJD12pgNev6gjomZcYam9_VYQOZIR3Hyg-4mmPAyCKON2JZ3PSG9FHcQZLM_IyJZTAgFexlKc6UG1oVIBCo='
Я пишу приложение для чата. Возникла проблема с сервером. Он клянется в несуществующей ошибке. Ошибка отображается после выполнения кода без ошибок. И, как я понимаю, это как-то связано с розетками. Что означает эта ошибка и как ее избежать ?
Комментарии:
1. Вы должны записать значение
data
ПЕРЕД выполнением строки, в которой появляется ошибка.2. Ошибка произойдет, если в нем меньше 4 строк
data
.3.
recv()
не гарантируется возврат всего, что было отправлено за один звонок, он может вернуть меньше.4. recv() вернул все сообщение.
5. Разделите сообщение, а затем проверьте длину.