2015-11-03 317 views
1

我想unterstand如何發送我的自定義對象「紙」,這是與JSON通過TCP序列化。如何通過TCP發送JSON對象?

客戶:

import org.json.JSONObject; 

import java.io.*; 
import java.net.ConnectException; 
import java.net.NoRouteToHostException; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 

import model.*; 
import view.*; 

/** 

*/ 
public class JSONClient { 

    private String host; 
    private int port; 
    private Socket socket; 
    private final String DEFAULT_HOST = "localhost"; 


    public void connect(String host, int port) throws IOException { 
     this.host = host; 
     this.port = port; 
     socket = new Socket(host, port); 
     System.out.println("Client has been connected.."); 
    } 


    /** 
    * use the JSON Protocol to receive a json object as 
    * from the client and reconstructs that object 
    * 
    * @return JSONObejct with the same state (data) as 
    * the JSONObject the client sent as a String msg. 
    * @throws IOException 
    */ 
    public JSONObject receiveJSON() throws IOException { 
     InputStream in = socket.getInputStream(); 
     ObjectInputStream i = new ObjectInputStream(in); 
     JSONObject line = null; 
     try { 
      line = (JSONObject) i.readObject(); 

     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 


     return line; 

    } 


    public void sendJSON(JSONObject jsonObject) throws IOException { 
      JSONObject jsonObject2 = new JSONObject(); 
     jsonObject2.put("key", new Paper(250,333)); 


     OutputStream out = socket.getOutputStream(); 
     ObjectOutputStream o = new ObjectOutputStream(out); 
     o.writeObject(jsonObject2); 
     out.flush(); 
     System.out.println("Sent to server: " + " " + jsonObject2.get("key").toString()); 
    } 


    public static void main(String[] args) { 
     JSONClient client = new JSONClient(); 
     try{ 

      client.connect("localhost", 7777); 
      // For JSON call sendJSON(JSON json) & receiveJSON(); 
      JSONObject jsonObject2 = new JSONObject(); 
      jsonObject2.put("key", new Paper(250,333)); 

      client.sendJSON(jsonObject2); 
      client.receiveJSON(); 
     } 

     catch (ConnectException e) { 
      System.err.println(client.host + " connect refused"); 
      return; 
     } 

     catch(UnknownHostException e){ 
      System.err.println(client.host + " Unknown host"); 
      client.host = client.DEFAULT_HOST; 
      return; 
     } 

     catch (NoRouteToHostException e) { 
      System.err.println(client.host + " Unreachable"); 
      return; 

     } 

     catch (IllegalArgumentException e){ 
      System.err.println(client.host + " wrong port"); 
      return; 
     } 

     catch(IOException e){ 
      System.err.println(client.host + ' ' + e.getMessage()); 
      System.err.println(e); 
     } 
     finally { 
      try { 
       client.socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

服務器:

import model.*; 

import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
*/ 
public class JSONServer { 


    private ServerSocket serverSocket; 
    private int port; 
    public static int clients = 0; 


    public void establish(int port) throws IOException { 
     this.port = port; 
     serverSocket = new ServerSocket(port); 
     System.out.println("JSONServer has been established on port " + port); 

    } 


    public void accept() throws IOException { 
     while (true) { 
      Socket socket = serverSocket.accept(); 
      Runnable r = new MyThreadHandler(socket); 
      Thread t = new Thread(r); 
      t.start(); 
     } 
    } 

    private static class MyThreadHandler implements Runnable { 
     private Socket socket; 

     MyThreadHandler(Socket socket) { 
      this.socket = socket; 
     } 

     @Override 
     public void run() { 
      clients++; 
      System.out.println(clients + " JSONClient(s) connected on port: " + socket.getPort()); 

      try { 
       // For JSON Protocol 
       JSONObject jsonObject = receiveJSON(); 
       sendJSON(jsonObject); 

      } catch (IOException e) { 

      } finally { 
       try { 
        closeSocket(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     public void closeSocket() throws IOException { 
      socket.close(); 
     } 


     /** 
     * use the JSON Protocol to receive a json object as 
     * String from the client and reconstructs that object 
     * @return JSONObejct with the same state (data) as 
     * the JSONObject the client sent as a String msg. 
     * @throws IOException 
     */ 
     public JSONObject receiveJSON() throws IOException { 
      InputStream in = socket.getInputStream(); 
      ObjectInputStream i = new ObjectInputStream(in); 
      JSONObject line = null; 
      try { 
       line = (JSONObject) i.readObject(); 

      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      } 

      JSONObject jsonObject = new JSONObject(line); 
      System.out.println("Got from client on port " + socket.getPort() + " " + jsonObject.get("key").toString()); 
      return jsonObject; 
     } 


     public void sendJSON(JSONObject jsonObject) throws IOException { 
       JSONObject jsonObject2 = new JSONObject(); 
      jsonObject2.put("key", new Paper(250,369)); 

      OutputStream out = socket.getOutputStream(); 
       ObjectOutputStream o = new ObjectOutputStream(out); 
      o.writeObject(jsonObject2); 
       out.flush(); 
       System.out.println("Sent to server: " + " " + jsonObject2.get("key").toString()); 
    } 
    } 

    public void start(int port) throws IOException{ 
     establish(port); 
     accept(); 
    } 

    public static void main(String[] args) { 
     JSONServer server = new JSONServer(); 

     try { 
      server.start(7777); 

     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
      System.err.println(e); 
     } 
    } 
} 

雖然class文件是連載我得到錯誤:

localhost org.json.JSONObject

java.io.NotSerializableException: org.json.JSONObject

回答

0

您使用的是ObjectOutputStream序列化數據。該序列化使用它自己的實現將Serializable對象轉換爲通過套接字發送的字節表示。

JSON用於將對象序列化爲String表示形式。不幸的是,你從不使用json序列化,而是嘗試通過你的套接字發送你的JSON對象。

我的建議是:使用

String strJson = jsonObject.toString(); 

把你的對象到字符串,然後使用您的ObjectOutputStream發送一個字符串。在接收端讀取它作爲一個字符串,然後通過passing that String to the constructor把它放回一個JSONObject:

JSONObject js = new JSONObject(strJson); 
+0

謝謝你,我會嘗試。還有一個問題,是否需要Paper必須實現Serializable,儘管我是通過JSON發送的? –

0

只要改變行

 o.writeObject(jsonObject2.toString()); 

使用的ToString()方法來獲取字符串的JSONObject。

它爲我:)