【问题标题】:Cannot receive data from server using socket.recv()无法使用 socket.recv() 从服务器接收数据
【发布时间】:2020-12-16 19:56:12
【问题描述】:

我有一个 python 客户端,它以 json 格式将一些数据(命名空间、metric_name、时间戳、metric_value、维度)发送到 java 服务器并接收响应。

这是客户端代码的一部分:

def _init_socket(self):
    logger.info("initial socket, hostname {}, port {}".format(self.host, self.port))
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    address = (self.host, self.port)
    client.connect(address)
    self.client = client

def send_put_metrics_request(self, namespace, metric_name, metric_value, dimensions): 
    try:
        self._init_socket()
        timestamp = int(round(time.time() * 1000))
        send_data = self.convert_to_json(namespace, metric_name, timestamp, metric_value, dimensions)
        self.client.send(bytes(send_data + "\n", encoding=self.encoding))
        self.client.shutdown(socket.SHUT_WR)

        data = self.client.recv(1024)
        print(data)

    finally:
        self.client.close()

在服务器端,我只想将 HelloWorld 返回给客户端。这是java服务器代码的一部分:

    public void start() {
        logger.info("Daemon Server is listening for metrics");

        try (final ServerSocket serverSocket = new ServerSocket()) {
            final int port = 7072;
            serverSocket.bind(new InetSocketAddress(port));

            while (true) {
                final Socket socket = serverSocket.accept();
                threadPool.submit(() -> process(socket));
            }
        } catch (final Exception e) {
            logger.error(Thread.currentThread().getId() + " failed to make a connection to the server socket"
                + e.getMessage());
            throw new ConnectToServerSocketException(Thread.currentThread().getId()
                + " failed to make a connection to the server socket" + e.getMessage());
        } finally {
            threadPool.shutdown();
        }
    }


    protected void process(final Socket socket) {
        final Message message;
        try (final InputStream input = socket.getInputStream()) {
            final OutputStream output = socket.getOutputStream();
            final OutputStreamWriter osw = new OutputStreamWriter(output, "UTF8");
            final PrintWriter writer = new PrintWriter(new BufferedWriter(osw));
            message = objectMapper.readValue(inputStreamToString(input), Message.class);
// pls ignore the below line, it just calls another method to do something
            final String res = forwardMetrics(message);
            logger.info("Thread " + Thread.currentThread().getId() + " processed result: " + res);

            writer.println("HelloWorld"+"\n");
            writer.flush();
            socket.close();
            logger.info("Socket closed")

        } catch (final IOException e) {
            logger.error(e.getMessage());
            logger.error("Daemon server failed to read input from socket");
            throw new ReadFromSocketException("Failed to read input from socket", e);
        }

    }

然后在我启动服务器并通过客户端以正确的格式发送请求之后。我没有从客户端得到“HelloWorld”。打印结果只是 b' '。从服务器端的日志中,它执行了所有行,直到套接字关闭。

我想知道为什么没有打印出来。

【问题讨论】:

    标签: java python sockets networking network-programming


    【解决方案1】:

    不保证客户端中的socket.recv() 将在第一次获取时返回响应。我建议你在while循环中调用recv(),直到它收到None

    【讨论】:

    • 您好,感谢您提供的信息。我试图为此添加循环。不幸的是,它不起作用。它不断得到 0 字节,但这里没有任何数据。
    • 好的。我刚刚以相同的形式测试了上面的代码,它对我有用。!
    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多