2

(サーバーとクライアントを同じマシンで実行しているため、クライアントコードでlocalhostが使用されています)基本的に、このプログラムが行うことは、後でjsonに変換するクライアント側に文字列を送信することです。しかし、クライアント側での変換は私のエラーではありません。リクエストソケットから ObjectInputStreams (in) および ObjectOuputStreams(out) を続行すると、サーバー (ruby) に正常に接続した後、クライアント側 (Java) でそれが発生します....out = requestSocket.getOutputStream() は正常に動作しますが、 in = requesSocket.getInputStream() は私に IOException を与えます..すべてを試しましたが、まだこれを修正できません。PD: これは HW ではありません。異なる言語間の相互作用を学びたいと思って遊んでいるだけです。

これはクライアント側のエラーです:

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)

ルビーコード(サーバー)

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 CODE (クライアント) --->UPDATED

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

}

}

4

2 に答える 2

1

コードをテストしましたが、まだ実行しているという問題がありますObjectOutputStream。これらの2行(で終わる行)をコメントアウトしout.flush()ます。

また、今あなたはを呼んでいるので、それはラインを期待しているreadLine()ことを意味します。BufferedReader行は。で終わるもの"\r\n"です。

したがって、修正はそれをRubyコードに追加することです。

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

それが私のために働くようにそれを実行する(LinuxUbuntu)。

于 2012-11-30T23:53:52.657 に答える
0

ObjectInputStream を使用して JSON 文字列を読み取ることはできません。文字列として読み取ってから、json パッケージを使用してオブジェクトに変換する必要があります。

ObjectInputStream は、バイナリ シリアル化された Java オブジェクトを読み取るためのものであり、json とは関係ありません。

于 2012-11-30T12:10:11.213 に答える