гнездо python - [Errno 57] Сокет не подключен, хотя ответ хороший - PullRequest
0 голосов
/ 17 октября 2018

Я строю простой серверный сокет на Java и использую клиентский сокет python для связи с ним.Если ответ хороший, connection.shutdown(socket.SHUT_RDWR) всегда терпит неудачу с ошибкой [Errno 57] Socket is not connected.Поскольку клиент может получить ответ от сервера, я подумал, что сокет уже подключен.Но почему постоянно говорят, что розетка не подключена?Я очень запутался.Есть идеи?Большое спасибо!

Мой клиент (в Python3):

url = '/import_image'
headers = [
    b"PUT " + bytes(url, "UTF-8") + b" HTTP/1.0",
    b'Content-Type: application/octet-stream',
    b"Content-Length: " + bytes("hello world", "UTF-8"),
    b"Connection: close",
    b""
]

for h in headers:
    connection.sendall(h)
    connection.sendall(b"\r\n")

response = HTTPResponse(connection)
response.begin()
if response.status != 200:
    raise Exception("Received HTTP response {0}: {1}".format(response.status, response.reason))
else:
    print(response.read())

try:
    # This will fail with the error: [Errno 57] Socket is not connected
    connection.shutdown(socket.SHUT_RDWR)
except Exception as e:
    print(e)

Мой серверный сокет (в Java8):

    ServerSocket serverSocket = new ServerSocket(Defs.SOCKET_SERVER_PORT); // port 8888
    try {
            while (true) {
                log.info("Waiting for connection on port " + Defs.SOCKET_SERVER_PORT);
                Socket socket = serverSocket.accept();
                log.info("Connection received. Handling request...");
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                        new BufferedOutputStream(socket.getOutputStream()), "UTF-8"));
                String header = "HTTP/1.0 200 OK\r\n" +
                        "Content-Type: text/html\r\n" +
                        "Content-Length: ";
                String output = "<html><head><title>Example</title></head><body><p>success!</p></body></html>";
                out.write(header + output.length() + "\r\n\r\n" + output);
                out.flush();
                out.close();
            }
        } finally {
            serverSocket.close();
        }

1 Ответ

0 голосов
/ 17 октября 2018

При вызове клиента Python к connection.shutdown(), скорее всего, выдается ошибка, поскольку соединение уже закрыто сервером Java, а shutdown() это не нравится.

Что мне помогло, так этовызовите «connection.close ()» вместо «connection.shutdown ()».Я не вижу ошибки при вызове close.

...