закрытие клиентского сокета вызывает ошибку после отправки сообщения - PullRequest
1 голос
/ 02 мая 2019

Я хотел бы знать причину, по которой закрытие клиентского сокета приводит к сообщению об ошибке (показано ниже:)

Traceback (most recent call last):
  File "client.py", line 39, in <module>
    main()
  File "client.py", line 35, in main
    accept()
  File "client.py", line 21, in accept
    len_msg = int(msg[:headersize])
ValueError: invalid literal for int() with base 10: b''

это серверная сторона

import socket 
import time 
import pickle 

def connect(data, headersize = 10, looped = False):

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
        server.bind((socket.gethostname(), 1234))

        server.listen(5)

        while True:

            client_socket, address = server.accept()
            print(f"connection with {address} has been established")
            msg = pickle.dumps(data)
            msg = bytes(f"{len(msg):<{headersize}}", "utf-8") + msg 

            client_socket.send(msg)

            if looped:
                while True:
                    msg = f"{time.time()} + the new message"
                    client_socket.send(msg)


            client_socket.close()  # this causes an error

def main():
    data = {"apple":5, "pinapple":10}
    connect(data)
if __name__ == "__main__":
    main()

и это клиентская сторона

import socket
import time
import pickle 


def accept(headersize = 10):

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
        client.connect((socket.gethostname(), 1234))

        while True:

            new_msg = True
            full_msg = b""
            len_msg = 0
            while True:

                msg = client.recv(headersize + 4)

                if new_msg:
                    len_msg = int(msg[:headersize])
                    new_msg = False 

                full_msg += msg 
                if len(full_msg) - headersize == len_msg:

                    print(full_msg[headersize:])
                    d = pickle.loads(full_msg[headersize:])
                    print(d)
                    full_msg = b""
                    new_msg = True
def main():
    accept()

if __name__ == "__main__":
    main()

Программа проста: я просто отправляю сообщение в двоичном виде клиенту. Когда я удаляю client_socket.close() на стороне сервера, ошибки не возникает - как правильно закрыть клиентский сокет? спасибо

1 Ответ

2 голосов
/ 02 мая 2019

recv возвращает b'', когда отправляющий сокет закрыт.

msg[:headersize], когда msg пусто, возвращает b''.

int(b'') выдает ошибку, которую вы

Следующее закроет внутренний цикл while True: клиента, если сокет закрыт, поэтому он не будет пытаться обработать пустое сообщение.Я не вижу цели для внешнего while True:.

msg = client.recv(headersize + 4)
if not msg:  # empty strings are False
    break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...