Ошибка индекса в коде сервера, которого не существует

#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. Разделите сообщение, а затем проверьте длину.