杰克逊流媒体API与Jav​​a中的TCP套接字连接

问题描述:

问题是通过套接字连接发送和获取JSON对象...它不能正确解析服务器端。这是我的第一个Java项目杰克逊流媒体API与Jav​​a中的TCP套接字连接

这是我的插座类:

static class CheckerSocket implements Runnable{ 
    static Socket socket; 
    static InputStream sin ; 
    static OutputStream sout; 

    static boolean makeServer(){ 
     int port = 6969; 
     try { 
      ServerSocket serverSocket = new ServerSocket(port); 
      socket = serverSocket.accept(); 
      System.out.println("Someone connected!"); 
      sin = socket.getInputStream(); 
      sout = socket.getOutputStream(); 
      return true; 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
      return false;} 
    } 

    static boolean makeClient(String address, Integer port){ 
     try{ 
      InetAddress ipAddress = InetAddress.getByName(address); 
      socket = new Socket(ipAddress,port); 
      System.out.println("Connected to server!"); 
      sin =socket.getInputStream(); 
      sout =socket.getOutputStream(); 
      return true; 
     }catch (Exception e){ 
      e.printStackTrace(); 
      return false;} 
    } 

    @Override 
    public void run() { 
     if(Board.playerServer){ 
     makeServer(); Main.setScene(); 
     } 
     else makeClient(tf_ip.getText(),Integer.parseInt(tf_port.getText())); ; 
    } 
} 
} 

我使用JsonGeneratore和JsonParser通过jackson.core库 发电机提供:

public static void sendJSON(MoveToSend moveToSend) throws IOException { 
    JsonGenerator jsonGenerator = new JsonFactory().createJsonGenerator(Controller.CheckerSocket.sout); 
    jsonGenerator.writeStartObject(); 
    jsonGenerator.writeBooleanField("isAttack", moveToSend.isAttack()); 
    jsonGenerator.writeStringField("From", moveToSend.getFrom()); 
    jsonGenerator.writeStringField("To", moveToSend.getTo()); 
    if (moveToSend.isAttack()) { 
     jsonGenerator.writeArrayFieldStart("Killed"); 
     for (String s : moveToSend.getKilledCheckers()) jsonGenerator.writeString(s); 
     jsonGenerator.writeEndArray(); 
    } 
    jsonGenerator.writeEndObject(); 
    jsonGenerator.flush(); 
} 

分析器:

public static MoveToSend receiveJSON() { 
    //TODO PARSING JSON 
    MoveToSend receivedMove = new MoveToSend(); 
    try { 
    JsonParser jsonParser = new JsonFactory().createJsonParser(Controller.CheckerSocket.sin); 
     while (jsonParser.nextToken() != JsonToken.END_OBJECT) { 
      String name = jsonParser.getCurrentName(); 
      if ("isAttack".equals(name)) { 
       jsonParser.nextToken(); 
       receivedMove.setIsAttack(jsonParser.getBooleanValue()); 
      } else if ("From".equals(name)) { 
       jsonParser.nextToken(); 
       receivedMove.setFrom(jsonParser.getText()); 
      } else if ("To".equals(name)) { 
       jsonParser.nextToken(); 
       receivedMove.setTo(jsonParser.getText()); 
      } else if ("Killed".equals(name)) { 
       if (receivedMove.isAttack()) { 
        jsonParser.nextToken(); 
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) { 
         receivedMove.setKilledCheckers(jsonParser.getText()); 
        } 
       } 
      } 
     } 

    }catch (JsonGenerationException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
    return receivedMove; 
    } 

测试服务器等级:

public class TestServer { 
public static void main(String[] args) throws IOException { 
    Controller.CheckerSocket.makeServer(); 
    MoveToSend receivedMove; 
    receivedMove = MoveSender.receiveJSON(); 
} 

}

测试客户端类:

public class TestClient { 
public static void main(String[] args) throws IOException { 
    Controller.CheckerSocket.makeClient("127.0.0.1",6969); 
    ArrayList<String> killed = new ArrayList<String>(); 
    killed.add("32"); 
    killed.add("54"); 
    killed.add("76"); 
    MoveToSend m1 = new MoveToSend("21","87",killed); 
    MoveSender.sendJSON(m1); 
    while(true){ 
     if(m1==null) return; 
    } 
} 
} 
+0

什么问题? **请明确点**。你期望发生什么?究竟发生了什么? – 2014-08-30 09:10:37

+0

我预计从MoveToSend生成的json对象将被发送到服务器,并且服务器会将接收到的对象解析为MoveToSend对象。 但: 客户端连接到服务器,这就是全部... – m3mfis 2014-08-30 09:22:37

问题解决:改变流类型。

sendJSON(){ 
DataOutputStream out = new DataOutputStream(Controller.CheckerSocket.sout); 
JsonGenerator jsonGenerator = new JsonFactory().createJsonGenerator(out); 
-//- 
} 
receiveJSON(){ 
DataInputStream in = new DataInputStream(Controller.CheckerSocket.sin); 
JsonParser jsonParser = new JsonFactory().createJsonParser(in); 
-//- 
}