【问题标题】:Java client stuck in datastream of data from nodejs serverJava客户端卡在来自nodejs服务器的数据数据流中
【发布时间】:2015-03-04 19:21:47
【问题描述】:

我的问题是,当我从 nodejs 服务器向 java 客户端发送数据(使用 socket.write())时,只要没有 FIN 数据包,java 客户端就会卡在数据流中(当我发送在 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 客户端退出数据流并返回数据。所以目前我可以在整个会话中从服务器发送一次数据。

部分客户

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 客户端向服务器发送数据确实有效。

【问题讨论】:

    标签: java javascript node.js tcp


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我以某种方式推测 write 方法会自动执行此操作。
    猜你喜欢
    • 2015-03-05
    • 2019-05-31
    • 1970-01-01
    • 2017-07-07
    • 2018-05-01
    • 2020-11-13
    • 2019-05-09
    • 2020-11-17
    • 2017-07-23
    相关资源
    最近更新 更多