【问题标题】:Data transfer using sockets. Java & Firefox extension使用套接字进行数据传输。 Java 和 Firefox 扩展
【发布时间】:2011-08-23 09:10:47
【问题描述】:

我正在尝试在 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);
    }
}

【问题讨论】:

标签: java javascript sockets firefox-addon


【解决方案1】:

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

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

虽然 PrintWriter 是使用 autoflush=true 创建的,但只有当您使用 printlnprintfformat 方法(根据 javadocs)时,自动刷新才会生效,所以我d 将您的代码更改为:

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 字节块读取输入) :

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

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

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

【讨论】:

  • 带 out.flush(); SocketSniff 跟踪:接收:返回代码:0x00002733 接收:返回代码:0x00000000 google.pl 接收:返回代码:0x00002733 发送:返回代码:0x00000000 是。并且使用 out.println(messageToServer) NetBeans 说:imageshack.us/photo/my-images/194/ff2oo.jpg
  • 在这两种情况下,浏览器都会收到一条空消息
  • 谢谢。已编辑。但是所有相同的流都是空的。 Mozilla Firefox 没有收到任何东西
【解决方案2】:

需要在Java中关闭out

out.close();

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多