简体   繁体   中英

Jackson streaming API with TCP socket connection in Java

The problem is with sending and getting JSON objects through socket connection... it's not parsing correctly on the server side. This is my first java project

This my socket class:

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

I am using JsonGeneratore and JsonParser provided by jackson.core library Generator:

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

Test server class:

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

}

Test client class:

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

Problem solved: Changed stream types.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM