Java 客户端卡在来自 nodejs 服务器的数据流中

Java client stuck in datastream of data from nodejs server

我的问题是,当我将数据(使用 socket.write())从 nodejs 服务器发送到 java 客户端时,只要 java 客户端卡在数据流中服务器没有 FIN 数据包(当我在 nodejs 中使用 socket.end() 时会发送)。

我现在的问题是有没有办法 java 可以在没有 FIN 包的情况下读取它。

我认为必须有一种方法,因为当您使用 NodeJS 的 net 模块。

服务器

var server = require("net").Server();

function cl(t){console.log(t)};

server.listen("5022","127.0.0.1", function(req,res){
cl("Server started...");

});


server.on("connection", function(socket){
var ip = socket.remoteAddress;

socket.setEncoding("utf8");

cl("connection --> "+ip);

socket.write("Welcome...");

socket.on("data",function(d){
    var data = JSON.stringify(d);
    cl("Data arrived "+data);

});

socket.on("end", function(){
    cl("end");
})

socket.on("close",function(){
    cl("Disconnect --> "+ip+"\n");
})

socket.on("error", function(err){
    cl("ERROR "+err);

});
});

注意:正如所说,当我添加 socket.end() 时,将发送一个 FIN 数据包并且 java 客户端退出数据流并且 returns 数据.所以目前我可以在整个会话中从服务器发送一次数据。

部分客户

Socket sc = new Socket(ip, port);

BufferedReader in = new BufferedReader(new
InputStreamReader(sc.getInputStream()));

DataOutputStream out = new DataOutputStream(sc.getOutputStream());
String input;

while(true)
{
   while (!in.ready()) {Thread.sleep(2000);}
   input = in.readLine();
   System.out.println("Message : " + input);
   out.writeUTF(input);
}

注意:从这个 java 客户端向服务器发送数据确实有效。

in.readLine() 就像它说的那样,读取一行,这意味着它正在寻找一个换行符来知道何时停止读取。因此,在您的节点代码中,当您 .write() 时,只需附加一个 \n ,以便 Java 代码可以恢复。示例:socket.write("Welcome...\n");