сокеты java проблемы с передачей данных

231
09 февраля 2018, 20:54

Здравствуйте. Пишу клиент-серверную игру на сокетах. На сервере создаются и постоянно изменяются несколько списков с обьектами (Пули, враги, etc), для передачи на клиент этих списков использую json(jackson). Проблема в производительности этого всего (при рисовании на клиенте очень глючит). На локальном уровне все работает нормально. Помогите пожалуйста с оптимизацией, хотя бы в какую сторону двигаться.

Класс передачи с сервера на клиент:

 public class ClientConnection extends Thread {
  Socket client;
  OutputStream daos;
  PrintWriter printWriter;
  BufferedReader fromClient;
  GamePlay gamePlay;
  JsonGenerator jsonGenerator;
public ClientConnection(Socket client)
{
    gamePlay = new GamePlay(); //здесь обрабатывается игровая ситуация
    this.client = client;
    try {
        printWriter = new PrintWriter(client.getOutputStream());
        fromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));
        JsonFactory jsonFactory = new JsonFactory();
        jsonGenerator = jsonFactory.createGenerator(daos);
    } catch (IOException e) {
        try {
            client.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
    this.start();
}
@Override
public void run()
{
ObjectMapper mapper = new ObjectMapper();
    mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
        while (true) {
            try {
                synchronized (gamePlay.bullets.getBullets()) {
                    mapper.writeValue(printWriter, gamePlay.bullets.getBullets());
                }
                synchronized (gamePlay.enemies.getEnemies()) {
                    mapper.writeValue(printWriter, gamePlay.enemies.getEnemies());
                }
                mapper.writeValue(printWriter,gamePlay.ship);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

Класс считывания на клиенте

public class Client extends Thread{
private static final String SERVER_IP    = "127.0.0.1";
private static final int    SERVER_PORT  = 9999;
DrawGame drawGame;
PrintWriter writer;
BufferedReader br;
JsonParser jsonParser;
public static void main(String[] args) {

    Socket clientSocket;
    PrintStream outToServer = null;
    JsonFactory jsonFactory = new JsonFactory();
    try {
        clientSocket = new Socket(Client.SERVER_IP,Client.SERVER_PORT);
        Client client = new Client();
        //client.inputStream = new DataInputStream(clientSocket.getInputStream());
        client.br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        client.writer = new PrintWriter(clientSocket.getOutputStream());
        client.drawGame = new DrawGame(); //тут все рисуется
        client.jsonParser = jsonFactory.createParser(client.br);
        client.start();
        JFrame frame = new JFrame("Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(1000, 1000);
        frame.add(client.drawGame);


    } catch (IOException e) {
        e.printStackTrace();
    }

}
@Override
public void run(){
    TypeReference bul = new TypeReference<ArrayList<Bullet>>() { };
    TypeReference enem = new TypeReference<ArrayList<Enemy>>() { };
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);

    while (true) {
            try {
                ArrayList<Bullet> b = mapper.readValue(jsonParser,bul);
                drawGame.setBullets(b);
                ArrayList<Enemy> e = mapper.readValue(jsonParser,enem);
                drawGame.setEnemies(e);
                Ship ship = mapper.readValue(jsonParser, Ship.class);
                drawGame.ship = ship;
            } catch (IOException e) {
                e.getStackTrace();
            }
        }

}

}

READ ALSO
Как сделать Eclipse 4.7 более отзывчивым server-jre-1.8 oracle&hellip; Linux(Ubuntu)?

Как сделать Eclipse 4.7 более отзывчивым server-jre-1.8 oracle… Linux(Ubuntu)?

Пытаюсь заставить работать Эклипс 47 быстрее, не во время загрузки а в процессе длительной работы с ним

198
Tree - это класс или интерфейс в Java

Tree - это класс или интерфейс в Java

Задали на собеседовании такой вопросПервичный гуглинг дал ответ, что такой структуры данных в чистом нативном виде вообще нет в Java, то есть...

194
Некорректная передача параметров в URI

Некорректная передача параметров в URI

Внимание! Можете не напрягаться над решением, просто подскажите в каком направлении думать!

242
Java: String.split по URL

Java: String.split по URL

Всем привет,

251