2012-11-30 75 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