java - 使用套接字进行数据传输。 Java 和 Firefox 扩展

标签 java javascript sockets firefox-addon

我正在尝试在Java(客户端)程序和JavaScript(服务器)中的Firefox扩展程序之间实现数据传输。我无法仅使用一个套接字发送和接收。请帮我解决这个问题。现在客户端从服务器收到一条消息,但给它一条空白消息。

客户端(Java):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketOptions;

public class JustForTest {

    /**
     * @param args the command line 
     * 
     * Connect to FF Plugin (Server). Send URL and waiting for innerHTML
     */
    public static void main(String[] args) throws IOException {
        String messageFromServer;
        String messageToServer = "http://google.pl/";

        Socket clientSocket = new Socket("localhost", 8888);

        try {
            System.out.println("Socket is connected to 127.0.0.1:8888");
            // Send URL to Firefox Plugin
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            out.write(messageToServer);
            InputStream inStream = clientSocket.getInputStream();
            // Is waiting for answer from Firefox Plugin
            BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
            System.out.println(reader.readLine());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (clientSocket != null && clientSocket.isConnected()) {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.print(e);
                }
            }
        }
    }
}

Firefox 扩展(JavaScript):

    var BeansServer = new function () {

    /*
     * Listen for connections. Transmit
     */
    var listener = {
        onSocketAccepted: function(serverSocket, transport) {
            addSpan("Accepted connection on " + transport.host + ":" + transport.port);
            var input = transport.openInputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0);//.QueryInterface(Ci.nsIAsyncInputStream);
            var output = transport.openOutputStream(Ci.nsITransport.OPEN_BLOCKING, 0, 0);
            var sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);

            try{
                sin.init(input);
                var readBytes = sin.available();

                var request = '';
                request = sin.read(readBytes);
                addSpan('Received: ' + request);

                getUrl(request);

                output.write("yes", "yes".length);
                output.flush();
            }
            finally{
                sin.close();
                input.close();
                output.close();
            }
        }
    }

    /*
     * Main
     */
    this.start = function() {
        var serverSocket = Cc["@mozilla.org/network/server-socket;1"].createInstance(Ci.nsIServerSocket);
        serverSocket.init(8888, true, 5);
        addSpan("Opened socket on " + serverSocket.port);
        serverSocket.asyncListen(listener);
    };

    /*
     * Opening the page in the browser. Checks the HTML status of the loaded page
     */
    function getUrl(url){
        var xmlhttp = getXmlHttp();
        xmlhttp.open('GET', 'http://google.pl', true);
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                if(xmlhttp.status == 200) {
                    alert(xmlhttp.status);
                }
            }
        };
        xmlhttp.send(null);
    }

    function getXmlHttp(){
        var xmlhttp;
        try {
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (E) {
                xmlhttp = false;
            }
        }
        if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
            xmlhttp = new XMLHttpRequest();
        }
        return xmlhttp;
    }

    function getBrowser(){
        if (!gBrowser)
            gBrowser = document.getElementById("content");
        return gBrowser;
    }

    /*
     * Displays a string on a page in the browser
     */
    function addSpan(content2) {
        var mySpan = content.document.createElement('span');
        mySpan.innerHTML = content2 + '<br/>';
        content.document.body.appendChild(mySpan);
    }
}

最佳答案

您的问题可能与您没有刷新客户端代码中的输出流有关:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.write(messageToServer);

虽然 PrintWriter 是使用 autoflush=true 创建的,但只有在使用 printlnprintfformat 方法(按照 javadocs ),所以我将您的代码更改为:

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.println(messageToServer);

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.write(messageToServer);
out.flush();

编辑:

虽然我没有使用 Firefox 库的经验,但我也想知道读取输入的 Javascript 代码是否不完整,我想知道您是否可以尝试以下操作(应该以 512 字节 block 读取输入) :

var request = '';
while (sin.available()) {
    request = request + sin.read(512);
}

此外,当在 Java 客户端中阅读您的回复时,我会:

String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

关于java - 使用套接字进行数据传输。 Java 和 Firefox 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158656/

相关文章:

javascript - 我如何通过 Angular 向套接字服务器发送数据和获取数据

C#程序导致蓝屏?

java - JUnit 5 测试在 IntelliJ 内部和本地 Maven 并行执行,但不在 Google Cloud Build 上的 Maven Docker 容器内并行执行

java - 如何更新 if block 中的实例变量?

javascript - 将Class添加到重定向页面上的元素

javascript - 从 javascript 监控 Web 应用程序的 UI 延迟

javascript - 用图像替换文本 Google 脚本?

java - 如何使用 Java 将数据插入 Microsoft Word 模板?

Java - 纸牌游戏输出问题

c# - 通过 C# Socket 发送 WebSocket 消息