Java 和 Node.js 之间的通信问题(基于 TCP/IP)

Java 和 Node.js 之间的通信问题(基于 TCP/IP)

我用 Node.js

var net = require('net');

建了一个 tcpserver,然后用 Java 的 socket 去连接,结果 Java 这边可以把信息完整无误的发给 Node.js 这边,但是 Node.js 返回的数据始终读不出来(java:读取方式:

InputStream ips = socket.getInputStream();
DataInputStream din = new DataInputStream(ips);
din.readUTF();

)然后这样就一直停留在 din.readUTF(); 求大神看看是怎么回事


3 回复

好的,让我们来分析一下这个问题,并提供一个解决方案。

问题描述

你有一个 Node.js 的 TCP 服务器,使用 net 模块创建。你的 Java 客户端可以成功地将数据发送到 Node.js 服务器,但当 Node.js 服务器尝试返回数据时,Java 客户端无法正确读取这些数据。具体来说,Java 客户端在调用 din.readUTF() 方法时卡住了。

分析原因

  1. 数据格式不匹配readUTF() 方法期望读取的是由 writeUTF() 方法写入的数据。如果你的 Node.js 服务器没有使用 writeUTF() 方法写入数据,那么 Java 客户端将无法正确解析这些数据。
  2. 流处理问题:TCP 是一种流式协议,Java 客户端可能需要更多的时间来接收完整的数据包。如果数据没有完全到达,readUTF() 可能会阻塞等待更多的数据。

解决方案

Node.js 服务器端

确保你在 Node.js 服务器端正确地发送了数据。例如,你可以使用 socket.write() 方法发送数据:

var net = require('net');

var server = net.createServer(function(socket) {
    // 接收来自客户端的数据
    socket.on('data', function(data) {
        console.log('Received data:', data.toString());
        // 发送响应数据
        socket.write("Hello from Node.js");
    });

    // 处理断开连接
    socket.on('end', function() {
        console.log('Client disconnected');
    });
});

server.listen(1337, '127.0.0.1');

Java 客户端

确保你正确地读取了从 Node.js 服务器接收到的数据。你可以使用 InputStream 来读取数据,而不是依赖 readUTF()

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 1337);
        
        // 发送数据到服务器
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os, true);
        pw.println("Hello from Java");

        // 读取服务器返回的数据
        InputStream ips = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(ips));
        String responseLine;
        while ((responseLine = br.readLine()) != null) {
            System.out.println("Received from Node.js: " + responseLine);
        }

        socket.close();
    }
}

总结

通过上述代码示例,你可以看到如何在 Node.js 和 Java 之间进行 TCP 通信。关键是确保发送和接收的数据格式一致,并且正确处理数据流。希望这能解决你的问题!


不熟悉JAVA,但是你可以下载一个socket调试助手来测试你的node服务器,如果没有问题,则表示你的java程序有问题。

在这个场景中,Java客户端通过TCP连接到Node.js服务器,并尝试读取返回的数据。问题可能在于数据的发送与接收不匹配。Node.js服务器需要正确地将数据发送回Java客户端。

示例代码

Node.js 服务器端

const net = require('net');

const server = net.createServer((socket) => {
    // 接收来自客户端的消息
    socket.on('data', (data) => {
        console.log(`Received data from client: ${data.toString()}`);
        
        // 将字符串转换为UTF-8编码并发送回客户端
        const response = 'Hello from Node.js';
        socket.write(response);
    });

    // 客户端断开连接时的处理
    socket.on('end', () => {
        console.log('Client disconnected');
    });
});

// 监听端口
server.listen(3000, () => {
    console.log('Server listening on port 3000');
});

Java 客户端

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.Socket;

public class JavaClient {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 3000);

            InputStream ips = socket.getInputStream();
            DataInputStream dis = new DataInputStream(ips);

            // 发送消息到Node.js服务器
            System.out.println("Sending message to Node.js...");
            socket.getOutputStream().write("Hello from Java".getBytes());

            // 接收并打印从Node.js服务器返回的消息
            String receivedMessage = dis.readUTF();
            System.out.println("Received from Node.js: " + receivedMessage);

            // 关闭资源
            dis.close();
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解释

  1. Node.js 服务器:使用net模块创建一个TCP服务器。当接收到客户端数据时,将其打印出来,并以UTF-8格式返回一条消息。
  2. Java 客户端:通过Socket连接到Node.js服务器。向服务器发送一条消息,并使用DataInputStream读取服务器返回的消息。

确保你的Java客户端和Node.js服务器都正确地发送和接收数据,这样就能避免阻塞在din.readUTF()这一行。

回到顶部