2011-08-23 53 views
1

我試圖在Java(客戶端)和JavaScript擴展(JavaScript)中的程序之間實現數據傳輸。我無法僅使用一個套接字發送和接收數據。請幫我解決這個問題。現在,客戶端從服務器獲取消息,但給它一個空白消息。使用套接字進行數據傳輸。 Java和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); 
    } 
} 
+0

你能提供你正在得到的輸出嗎?什麼顯示在瀏覽器中? – beny23

+0

[複選標記]:http://imageshack.us/photo/my-images/196/84399304.jpg/ Firefox [複選標記]:http://imageshack.us/photo/my-images/9/94945118.jpg/ SocketSniff – SEMA

+0

@SEMA你能做到這些嗎?如果有,請提供您的解決方案 – Samrat

回答

0

您的問題可能涉及到的事實,你沒有刷新在客戶端代碼的輸出流:

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

雖然使用autoflush = true創建了PrintWriter,但autoflu SH只有生效,如果您使用的是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字節讀取輸入塊):

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

此外,閱讀在Java客戶端我想你的迴應時:

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

用out.flush(); SocketSniff跟蹤收件人:返回代碼:0x00002733 接收:返回代碼:00000000 http://google.pl/ 接收:返回代碼:0x00002733 發送:返回代碼:00000000 肯定。與out.println(messageToServer)NetBeans說:http://imageshack.us/photo/my-images/194/ff2oo.jpg/ – SEMA

+0

在這兩種情況下,瀏覽器收到一條空消息 – SEMA

+0

謝謝。編輯。但所有相同的流是空的。 Mozilla Firefox沒有收到任何東西 – SEMA

0

需要關閉Java中的out

out.close(); 
相關問題