Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby(服务器)-Java(客户端)连接错误_Java_Ruby_Json_Sockets - Fatal编程技术网

Ruby(服务器)-Java(客户端)连接错误

Ruby(服务器)-Java(客户端)连接错误,java,ruby,json,sockets,Java,Ruby,Json,Sockets,(在同一台计算机上运行服务器和客户机,因此在客户机代码中使用localhost) 基本上,我知道这个程序所做的是向客户端发送一个字符串,他稍后会将其转换为json。但是客户端的转换不是我的错误。在客户端(java),当我成功连接到我的服务器(ruby)后,当我从我的请求套接字继续ObjectInputStreams(in)和ObjectOutputStreams(out)时…out=requestSocket.getOutputStream()工作正常,但in=requesSocket.getI

(在同一台计算机上运行服务器和客户机,因此在客户机代码中使用localhost) 基本上,我知道这个程序所做的是向客户端发送一个字符串,他稍后会将其转换为json。但是客户端的转换不是我的错误。在客户端(java),当我成功连接到我的服务器(ruby)后,当我从我的请求套接字继续ObjectInputStreams(in)和ObjectOutputStreams(out)时…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代码(服务器)

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();
    }

}

}不能使用ObjectInputStream读取JSON字符串,必须将其作为字符串读取,然后使用JSON包将其转换为对象


ObjectInputStream用于读取二进制序列化java对象,它与json无关。

我测试了您的代码,但您仍然存在运行
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)。

我对Java不太了解,但对我来说,您似乎正在使用Java
ObjectStream
原语从套接字读取普通字符串。我认为一个Java
ObjectStream
只能与另一个
ObjectStream
通信。也就是说,您只能在这样的流中传递Java对象。普通Ruby字符串不是Java对象,因此代码永远不会像那样进行互操作。您还需要在Java端读取普通字符串,而不是
ObjectStream
之类的东西。基本上只需在Java端调用
requestSocket.read()
(我猜,因为我不是Java大师)。跳过所有
Stream
的内容。再说一次,在这种情况下,阅读对我来说不是问题,因为我还没有通过requestSocket.getInputStream()部分…嗯……如果你看一下调用堆栈,
ObjectStream
正试图从套接字读取(
readStreamHeader
)。您不知道为了建立流类型,它试图读取多少字节。我仍然会固执地说它失败了,因为它需要一个
ObjectStream
,而它实际上是垃圾。如果您想确认您的Ruby代码正常工作,那么
telnet localhost 2000
如果您在Unix上测试Ruby代码。我从来没有提到过json的问题,我的问题是当我尝试从requestSocket获取inpustream时,更新:我现在让inputstream工作:改为使用:BufferedReader in=new BufferedReader(new InputStreamReader(requestSocket.getInputStream());但是当我读这行代码时:String jsonString=in.readLine();这些程序只是给了我一个错误:是的,我是在几个小时前得出这个结论的,但是谢谢你的提示!
Thread.start(serverB.accept) do |client|
  client.write(jsonString)
  client.write("\r\n")
  client.close
end