Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何刷新代码中的套接字_Javascript_Sockets_Firefox Addon_Firefox Addon Sdk - Fatal编程技术网

Javascript 如何刷新代码中的套接字

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

我正在通过一个套接字将FF附加组件写入java服务器。我写了几个请求,服务器似乎一个接一个地处理它们。相反,来自服务器的响应是同时处理的

我尝试在服务器中刷新输出流,但它没有任何作用。我不明白发生了什么事

谢谢你的帮助,谢谢

EDIT1:可能是加载项(客户端)没有刷新输入流,这可能吗?我在java服务器中使用out.println,因此“\n”必须刷新其输出流,网络库使用write.flush(),但我没有看到任何其他刷新输入

编辑2:这是我的代码:

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:我认为你需要开始调试你的代码-你应该能够告诉更多的事情,而不仅仅是“发生了一些奇怪的事情”。但是我调试了服务器,没有收到任何东西。如何调试加载项?谢谢