Javascript 如何刷新代码中的套接字
我正在通过一个套接字将FF附加组件写入java服务器。我写了几个请求,服务器似乎一个接一个地处理它们。相反,来自服务器的响应是同时处理的 我尝试在服务器中刷新输出流,但它没有任何作用。我不明白发生了什么事 谢谢你的帮助,谢谢 EDIT1:可能是加载项(客户端)没有刷新输入流,这可能吗?我在java服务器中使用out.println,因此“\n”必须刷新其输出流,网络库使用write.flush(),但我没有看到任何其他刷新输入 编辑2:这是我的代码:Javascript 如何刷新代码中的套接字,javascript,sockets,firefox-addon,firefox-addon-sdk,Javascript,Sockets,Firefox Addon,Firefox Addon Sdk,我正在通过一个套接字将FF附加组件写入java服务器。我写了几个请求,服务器似乎一个接一个地处理它们。相反,来自服务器的响应是同时处理的 我尝试在服务器中刷新输出流,但它没有任何作用。我不明白发生了什么事 谢谢你的帮助,谢谢 EDIT1:可能是加载项(客户端)没有刷新输入流,这可能吗?我在java服务器中使用out.println,因此“\n”必须刷新其输出流,网络库使用write.flush(),但我没有看到任何其他刷新输入 编辑2:这是我的代码: exports.main = functio
exports.main = function() {
try {
// At first, we need a nsISocketTransportService
var transportService =
Cc["@mozilla.org/network/socket-transport-service;1"]
.getService(Ci.nsISocketTransportService);
// Try to connect to localhost:2222
var transport = transportService.createTransport(null, 0, "localhost", 6666, null);
var stream = transport.openInputStream(Ci.nsITransport.OPEN_UNBUFFERED,null,null);
var instream = Cc["@mozilla.org/scriptableinputstream;1"]
.createInstance(Ci.nsIScriptableInputStream);
// Initialize
instream.init(stream);
var outstream = transport.openOutputStream(0, 0, 0);
var dataListener = {
onStartRequest: function(request, context){},
onStopRequest: function(request, context, status){
instream.close();
outstream.close();
},
onDataAvailable: function(request, context, inputStream, offset, count) {
var data = instream.read(count);
console.log(data);
},
};
var pump = Cc["@mozilla.org/network/input-stream-pump;1"]
.createInstance(Ci.nsIInputStreamPump);
pump.init(stream, -1, -1, 0, 0, false);
pump.asyncRead(dataListener, null);
// Write data
console.log("hi1");
var outputData = "hi1\n";
outstream.write(outputData, outputData.length);
// Write data
console.log("hi2");
var outputData = "hi2\n";
outstream.write(outputData, outputData.length);
} catch (e){
console.log("Error" + e.result + ": " + e.message);
return e;
} return null;
};
因此,当我运行它时,我得到:
Client > hi1
Client > hi2
Server > bye1
Server > bye2
它应该是:
Client > hi1
Server > bye1
Client > hi2
Server > bye2
TCP是一种流协议,因此您可以接收字节流。如果您想要数据包,您必须通过TCP实现自己的协议,以便能够将它们分开。这个话题在互联网上被广泛报道 编辑 这是套接字编程中常见的陷阱。大多数人一开始并不理解TCP套接字是一个流,而不是一个消息队列 我的意思是,在套接字的一端对“发送”的一个调用不一定对应于另一端的一个“接收”。底层可以随意决定对发送的字节进行分组或拆分 所以你可以有这样的东西:
- 客户端发送“ABCD”
- 客户端发送“EFGH”
- 服务器收到“AB”
- 服务器收到“CDEF”
- 服务器收到“GH”
所以,如果您想从文件中读取字符串,您需要某种方法来分离它们。它可以是分隔符,也可以根据字符串的长度为字符串添加前缀,或者其他任何内容。您正在同步写入输出流,这意味着在执行此操作时无法运行其他JavaScript代码。因此,在编写时不可能从服务器接收任何内容,传入的数据只需放入缓冲区即可 另一个问题是,在不等待服务器响应的情况下发送下一个字符串。通常,您可以在服务器响应到达之前发送这两个消息。您可能只希望在收到上一个字符串的响应时才发送下一个字符串 您可能希望使用如下发送函数:
Components.utils.import("resource://gre/modules/NetUtil.jsm");
var toSend = ["hi1\n", "hi2\n"];
function sendNextString(outstream)
{
if (!toSend.length)
return; // Nothing left to send
var outputData = toSend.shift();
console.log(outputData);
var instream = Components.classes["@mozilla.org/io/string-input-stream;1"]
.createInstance(Components.interfaces.nsIStringInputStream);
instream.setData(outputData, outputData.length);
NetUtil.asyncCopy(instream, outstream);
}
您可以在pump.asyncRead()
之后的代码中以及在onDataAvailable
中调用sendNextString(outstream)
PS:据我所知,刷新流不是这里的问题-您使用的是非缓冲流。@MarkoTopolnik:如果您想看一看,我添加了一些代码。您将其标记为Java,但我看不出您的问题与Java有任何关系。如果你不给它贴标签,我们就不会有这次对话了。我不是JavaScript方面的专家。哦,对不起!服务器是用Java编写的,但我认为这是正确的。谢谢。@user1336939:请不要编辑您的问题以将其更改为其他问题。如果你需要问一个新问题-问一个新问题。哦,对不起,我认为这是一个非常类似的问题。但我对服务器没有问题:当它接受'\n'时,它会刷新流。否则,客户端只打印“\n”。我真的不知道实现我自己的协议是什么意思。。如果a为每种类型的消息提供一个操作码,我如何在消息继续读取之前动态检测该消息?你有我可以查到的消息来源吗?谢谢,谢谢!这对我帮助很大。虽然它的工作并不完美,但当我将sendNextString调用到onDataAvailable中时,服务器似乎什么也没有收到。奇怪的事情发生了,你觉得呢?(我更新了问题中的代码)@user1336939:我认为你需要开始调试你的代码-你应该能够告诉更多的事情,而不仅仅是“发生了一些奇怪的事情”。但是我调试了服务器,没有收到任何东西。如何调试加载项?谢谢