Передача данных с использованием сокетов.Расширение Java & Firefox - PullRequest
1 голос
/ 23 августа 2011

Я пытаюсь реализовать передачу данных между программами на Java (клиент) и расширением Firefox на JavaScript (сервер). Я не могу отправлять и получать, используя только один сокет. Помогите мне решить эту проблему, пожалуйста. Прямо сейчас клиент получает сообщение от сервера, но дает ему пустое сообщение.

Клиент (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);
    }
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

Необходимо закрыть out в Java.

out.close();
0 голосов
/ 23 августа 2011

Ваша проблема может быть связана с тем, что вы не очищаете поток вывода в своем клиентском коде:

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

, в то время как PrintWriter был создан с autoflush = true, автозапуск вступает в силу, только если вы используете метод println, printf или format (согласно javadocs ) поэтому я бы изменил ваш код на:

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

или

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

EDIT:

Хотя у меня нет опыта работы с библиотекой 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...