2014-08-30 2 views
1

Проблема заключается в отправке и получении объектов JSON через соединение сокетов ... он не правильно разбирается на стороне сервера. Это мой первый проект JavaJackson streaming API с подключением к сокету TCP в Java

Это мой класс сокета:

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

Parser:

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

В чем проблема? **Быть конкретной**. Чего вы ожидаете? Что на самом деле происходит? –

+0

Я ожидал, что сгенерированный объект json из MoveToSend будет отправлен на сервер, а сервер будет анализировать полученный объект на объект MoveToSend. Но: клиент подключается к серверу, и все ... – m3mfis

ответ

1

Проблема решена: Изменены типы потоков.

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); 
-//- 
} 
Смежные вопросы