2012-11-30 87 views
2

(運行服務器和同一臺計算機上的客戶端,因此本地主機是在客戶端代碼中使用) 基本上我有這個程序做什麼是發送一個字符串到客戶端,他將後來轉換爲json。但客戶端部分的轉換不是我的錯誤。它在客戶端(Java)後,我成功地連接到我的服務器(紅寶石)時,我從我的請求套接字進行ObjectInputStreams()和ObjectOuputStreams(出).... out = requestSocket.getOutputStream()工作正常,但in = requesSocket.getInputStream()給了我一個IOException ..雖然我嘗試了一切,但我還無法解決這個任何幫助表示讚賞。 PD:這不是一個硬件,只是我玩耍時想學習不同語言之間的互動。紅寶石(服務器) - 爪哇(客戶端)連接錯誤

這是在客戶端的錯誤:

java.net.SocketException: Software caused connection abort: recv failed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(Unknown Source) 
at java.net.SocketInputStream.read(Unknown Source) 
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source) 
at sun.nio.cs.StreamDecoder.implRead(Unknown Source) 
at sun.nio.cs.StreamDecoder.read(Unknown Source) 
at java.io.InputStreamReader.read(Unknown Source) 
at java.io.BufferedReader.fill(Unknown Source) 
at java.io.BufferedReader.readLine(Unknown Source) 
at java.io.BufferedReader.readLine(Unknown Source) 

Ruby代碼(服務器)

require 'rubygems' 
require 'socket' 
require 'json' 

jsonString = '{"test":23, "prueba":1234}' 
serverB = TCPServer.new(2000) 

loop{#server runs forever 
Thread.start(serverB.accept) do |client| 
    client.write(jsonString) 
    client.close #disconnect from the client 
end 

} 

Java代碼(客戶端)--->更新的

import java.io.*; 
import java.net.*; 

import org.json.simple.*; 
public class json 
{ 
public static void main(String[] args) throws InterruptedException, ClassNotFoundException 
{ 
    Socket requestSocket; 
    ObjectOutputStream out; 
    ObjectInputStream in; 
    try { 
     //creating a socket to connect to the server 
     requestSocket = new Socket("localhost",2000); 
     //Get input and output streams 
     out = new ObjectOutputStream(requestSocket.getOutputStream()); 
     out.flush(); 

        //THIS WORKS NOW 
     BufferedReader in = new BufferedReader(new InputStreamReader(requestSocket.getInputStream())); 

        //THIS IS WHERE IT FAILS NOW 
     String jsonString = in.readLine(); 
     String msg = JSONValue.toJSONString(jsonString); 

     //Convert string to JSON format and print something 
     Object obj = JSONValue.parse(msg); 
     JSONObject jobj = (JSONObject)obj; 
     System.out.print(jobj.get("test")); 

     try { 
      in.close(); 
      out.close(); 
      requestSocket.close(); 
     } catch (Exception e2) { 
      e2.printStackTrace(); 
     } 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

} 

}

+1

我不知道Java的那麼好,但對我來說,似乎您使用的是Java'ObjectStream'元讀取從插座普通字符串。我會認爲一個Java ObjectStream只能與另一個ObjectStream進行通信。即你只能在這樣的流內傳遞Java對象。一個普通的Ruby字符串不是一個Java對象,所以代碼永遠不會像這樣互操作。你也需要在Java端閱讀純字符串,而不是'ObjectStream'。 – Casper

+0

基本上在Java端調用'requestSocket.read()'(我猜是因爲我不是Java大師)。跳過所有'流'的東西。 – Casper

+0

再次,閱讀是沒有問題的,我在這種情況下,因爲我還沒有得到通過requestSocket.getInputStream()部分... – richddr

回答

1

我測試你的代碼,你還有你正在運行的ObjectOutputStream問題。註釋掉這兩行(以out.flush()結尾的行)。

而且你現在打電話readLine(),所以這意味着BufferedReader期待一條線。一條線是以"\r\n"結尾的東西。

因此,解決方法是將它添加到Ruby代碼:

Thread.start(serverB.accept) do |client| 
    client.write(jsonString) 
    client.write("\r\n") 
    client.close 
end 

運行它就像我的作品(Linux操作系統Ubuntu)。

+0

是啊,我得到了幾小時前的結論,但謝謝你的提示! – richddr

0

你不能使用ObjectInputSt想要讀取JSON字符串,必須將其讀取爲字符串,然後使用json包將其轉換爲對象。

ObjectInputStream的是讀取二進制序列化的Java對象,它無關JSON。

+0

我從來沒有提到這個問題是與json,再次我的問題是,當我嘗試從requestSocket獲取inpustream,無論我的方式,它仍然無法正常工作。 – richddr

+0

更新:我現在inputstream工作:使用此代替:BufferedReader in = new BufferedReader(new InputStreamReader(requestSocket。的getInputStream())); 但是當我讀取的行:String jsonString = in.readLine(); 該方案只給了我一個錯誤: – richddr

+0

更新代碼 – richddr