Java-сокет Json

ОБНОВЛЕНО

После ответа стоит мой обновленный код, У меня одна проблема, сейчас ничего не пришло:

Проблема:

Connexion cliente reçue.
Lancement du traitement de la connexion cliente
Exception in thread "Thread-1" java.lang.NullPointerException
    at cuisine.TimeServer.onResponseReceived(TimeServer.java:85)
    at cuisine.ClientProcessor.run(ClientProcessor.java:43)
    at java.base/java.lang.Thread.run(Thread.java:844)

TimeServer: 85: обратный вызов

  @Override
  public void onResponseReceived(String response) {
    // When the response is received from ClientProcessor
    // this method is called (by ClientProcessor).
    // Your response is the parameter String response.
    callback.onResponse(response);
  }

Клиентский процессор: 43:

server.onResponseReceived(response);

Один клиент может подключиться, но я ничего не могу получить: Json или текст.

Вот мой новый код Java:

Main.java:

   import cuisine.TimeServer.OnResponseReceivedListener;


public class main implements OnResponseReceivedListener {

   public static void main(String[] args) throws IOException {

        String host = "192.168.1.21";
        int port = 8080;

        TimeServer ts = new TimeServer(host, port);
        ts.open();
        System.out.println("------------Connected ! ------------");

   }

   @Override
   public void onResponse(String response) {
     doSomethingWith(response);
     System.out.println("REPONSE : ");
     System.out.println(response);

   }

   private void doSomethingWith(String response) {
         System.out.println("REPONSE : ");
         System.out.println(response);
   }


}

Я действительно не знаю, как использовать ответ сейчас, потому что системного сообщения "RESPONSE" нет в моей консоли TimeServer.java:

...
import cuisine.ClientProcessor.Server;


public class TimeServer implements Server {

  public interface OnResponseReceivedListener {
    void onResponse(String response);
  }

  private int port = 2345;
  private String host = "127.0.0.1";
  private ServerSocket server = null;
  private boolean isRunning = true;
  private OnResponseReceivedListener callback;

  public TimeServer() {
    try {
      server = new ServerSocket(port, 100, InetAddress.getByName(host));
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public TimeServer(String pHost, int pPort) {
    host = pHost;
    port = pPort;
    try {
      server = new ServerSocket(port, 100, InetAddress.getByName(host));
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public void open() {

    Thread t =
        new Thread(
            new Runnable() {
              public void run() {
                while (isRunning == true) {

                  try {
                    Socket client = server.accept();

                    System.out.println("Connexion cliente reçue.");
                    ClientProcessor c = new ClientProcessor(client);
                    Thread t = new Thread(c);
                    // Don't forget to define the Server for ClientProcessor
                    c.addServer(TimeServer.this);
                    t.start();

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

                try {
                  server.close();
                } catch (IOException e) {
                  e.printStackTrace();
                  server = null;
                }
              }
            });

    t.start();
  }

  @Override
  public void onResponseReceived(String response) {
    // When the response is received from ClientProcessor
    // this method is called (by ClientProcessor).
    // Your response is the parameter String response.
    callback.onResponse(response);
  }

  public void addOnResponseReceivedListener(OnResponseReceivedListener listener) {
    callback = listener;
  }

  public void removeOnResponseReceivedListener() {
    callback = null;
  }

  public void close() {
    isRunning = false;
  }
}

ClientProcessor.java:

public class ClientProcessor implements Runnable {

      public interface Server {
        void onResponseReceived(String response);
      }

      private Socket sock;
      private PrintWriter writer = null;
      private BufferedInputStream reader = null;
      public List<Dish> dish;
      // Your server instance
      private Server server;

      public ClientProcessor(Socket pSock) {
        this.sock = pSock;
      }

      public void run() {
        System.err.println("Lancement du traitement de la connexion cliente");

        boolean closeConnexion = false;
        while (!sock.isClosed()) {

          try {

            writer = new PrintWriter(sock.getOutputStream());
            reader = new BufferedInputStream(sock.getInputStream());

            String response = read();

            // report the response to TimeServer
            server.onResponseReceived(response);

            InetSocketAddress remote = (InetSocketAddress) sock.getRemoteSocketAddress();

            String debug = "";
            debug = "Thread : " + Thread.currentThread().getName() + ". ";
            debug += "Demande de l'adresse : " + remote.getAddress().getHostAddress() + ".";
            debug += " Sur le port : " + remote.getPort() + ".\n";
            debug += "\t -> Commande reçue : " + response + "\n";
            System.err.println("\n" + debug);

            String toSend = "";

            switch (response.toUpperCase()) {
              case "ORDER":
                toSend = "Dish";
                break;
              case "CLOSE":
                toSend = "Communication terminée";
                closeConnexion = true;
                break;
              default:
                toSend = "Commande inconnu !";
                break;
            }

            writer.write(toSend);
            writer.flush();

            if (closeConnexion) {
              System.err.println("COMMANDE CLOSE DETECTEE ! ");
              writer = null;
              reader = null;
              sock.close();
              break;
            }
          } catch (SocketException e) {
            System.err.println("LA CONNEXION A ETE INTERROMPUE ! ");
            break;
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }

      public void addServer(Server server) {
        this.server = server;
      }

      private void removeServer() {
        server = null;
      }

      // La méthode que nous utilisons pour lire les réponses
      private String read() throws IOException {
        String response = "";
        int stream;
        byte[] b = new byte[4096];
        stream = reader.read(b);
        response = new String(b, 0, stream);
        return response;
      }
    }

Спасибо, Бенджамин.

Какой у тебя вопрос, @Benjamin?

Themelis 14.12.2018 15:57

@Skemelio Я хочу иметь возможность использовать ответ (получение JSON) в моем основном

Benjamin Barbé 14.12.2018 16:15

Вы получаете ответ в формате JSON?

Themelis 14.12.2018 16:18

Потому что, если вы это сделаете, этот вопрос должен быть о манипуляциях с Json, а не о сокетах.

Themelis 14.12.2018 16:22

@Skemelio Я получаю ответ, а не json, на данный момент я не знаю, как это сделать,

Benjamin Barbé 14.12.2018 16:30

И после того, как мне нужно манипулировать этим json

Benjamin Barbé 14.12.2018 16:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
1 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлять (обновленный Main.java)

Обновление №2 (Удалены статические методы из Main.java и используются объект Main)

Редактировать: (удален предыдущий ответ о сокетах)

This is the json response, now i want to use it in my main : on another class in the same package.

Поскольку вы заявили, что вы получаете ответ от клиента, но не знаете, как управлять им в своем классе Main, ваша проблема не в сокетах.

Решение: используйте обратные вызовы:

  • ClientProcessor сообщит ответ на TimeServer.
  • TimeServer сообщит об этом ответе Main.

Сообщите ClientProcessor о сервере и сообщите, когда будет получен ответ.

public class ClientProcessor implements Runnable {

  public interface Server {
    void onResponseReceived(String response);
  }

  private Socket sock;
  private PrintWriter writer = null;
  private BufferedInputStream reader = null;
  public List<Dish> dish;
  // Your server instance
  private Server server;

  public ClientProcessor(Socket pSock) {
    this.sock = pSock;
  }

  public void run() {
    System.err.println("Lancement du traitement de la connexion cliente");

    boolean closeConnexion = false;
    while (!sock.isClosed()) {

      try {

        writer = new PrintWriter(sock.getOutputStream());
        reader = new BufferedInputStream(sock.getInputStream());

        String response = read();

        // report the response to TimeServer
        server.onResponseReceived(response);

        InetSocketAddress remote = (InetSocketAddress) sock.getRemoteSocketAddress();

        String debug = "";
        debug = "Thread : " + Thread.currentThread().getName() + ". ";
        debug += "Demande de l'adresse : " + remote.getAddress().getHostAddress() + ".";
        debug += " Sur le port : " + remote.getPort() + ".\n";
        debug += "\t -> Commande reçue : " + response + "\n";
        System.err.println("\n" + debug);

        String toSend = "";

        switch (response.toUpperCase()) {
          case "ORDER":
            toSend = "Dish";
            break;
          case "CLOSE":
            toSend = "Communication terminée";
            closeConnexion = true;
            break;
          default:
            toSend = "Commande inconnu !";
            break;
        }

        writer.write(toSend);
        writer.flush();

        if (closeConnexion) {
          System.err.println("COMMANDE CLOSE DETECTEE ! ");
          writer = null;
          reader = null;
          sock.close();
          break;
        }
      } catch (SocketException e) {
        System.err.println("LA CONNEXION A ETE INTERROMPUE ! ");
        break;
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  private void addServer(Server server) {
    this.server = server;
  }

  private void removeServer() {
    server = null;
  }

  // La méthode que nous utilisons pour lire les réponses
  private String read() throws IOException {
    String response = "";
    int stream;
    byte[] b = new byte[4096];
    stream = reader.read(b);
    response = new String(b, 0, stream);
    return response;
  }
}

Теперь перейдите к TimeServer и сообщите ему о Main (та же процедура, что и раньше). Вам также необходимо сообщить об ответе на Main, когда он получен от ClientProcessor.

public class TimeServer implements Server {

  public interface OnResponseReceivedListener {
    void onResponse(String response);
  }

  private int port = 2345;
  private String host = "127.0.0.1";
  private ServerSocket server = null;
  private boolean isRunning = true;
  private OnResponseReceivedListener callback;

  public TimeServer() {
    try {
      server = new ServerSocket(port, 100, InetAddress.getByName(host));
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public TimeServer(String pHost, int pPort) {
    host = pHost;
    port = pPort;
    try {
      server = new ServerSocket(port, 100, InetAddress.getByName(host));
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public void open() {

    Thread t =
        new Thread(
            new Runnable() {
              public void run() {
                while (isRunning == true) {

                  try {
                    Socket client = server.accept();

                    System.out.println("Connexion cliente reçue.");
                    Thread t = new Thread(new ClientProcessor(client));
                    // Don't forget to define the Server for ClientProcessor
                    t.addServer(TimeServer.this);
                    t.start();

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

                try {
                  server.close();
                } catch (IOException e) {
                  e.printStackTrace();
                  server = null;
                }
              }
            });

    t.start();
  }

  @Override
  public void onResponseReceived(String response) {
    // When the response is received from ClientProcessor
    // this method is called (by ClientProcessor).
    // Your response is the parameter String response.
    callback.onResponse(response);
  }

  public void addOnResponseReceivedListener(OnResponseReceivedListener listener) {
    callback = listener;
  }

  public void removeOnResponseReceivedListener() {
    callback = null;
  }

  public void close() {
    isRunning = false;
  }
}

Наконец, заставьте ваш Main слушать TimeServer и делать что-нибудь, когда он получит ответ.

public class Main implements OnResponseReceivedListener {

  public static void main(String[] args) {
    Main application = new Main();
    TimeServer ts = application.createTimeServer();
    ts.addOnResponseReceivedListener(application);
    ts.open();
    System.out.println("------------Connected ! ------------");
  }

  @Override
  public void onResponse(String response) {
    doSomethingWith(response);
  }

  private void doSomethingWith(String response) {
    // Your logic for the response here...
  }

  private TimeServer createTimeServer() {
    String host = "192.168.43.178";
    int port = 8080;
    return new TimeServer(host, port);
  }
}

Спасибо, но когда я пробую этот код, у меня появляется одна ошибка = readLine не существует: reader.readLine ()) для ps: на данный момент я не знаю, как получить json на моем сервере. Но я уверен, что Json, отправленный клиентом, верен

Benjamin Barbé 15.12.2018 13:49

Привет, Бенджи, мне плохо. Я думал, вы используете BufferedReader, но вы используете BufferedInputStream, так что да, вам нужны буферы, и да, readLine() отсутствует.

Themelis 15.12.2018 13:55

Я отредактирую ответ, и вы можете попробовать, если хотите.

Themelis 15.12.2018 13:56

Когда я подключаю свой клиент к своему серверу, я получаю JSON: -> Commande reçue: {"Table": {"Capacity": 5, "IsAvailable": true, "isDressed": true, "‌ Customers": null}, "Рецепты": [{"Цена": 10.‌ 0, "RecipeName": "choc‌ olat", "Категория": "десерт"}]}

Benjamin Barbé 15.12.2018 14:36

Это ответ json, теперь я хочу использовать его в своем основном: в другом классе в том же пакете, спасибо за ваше время @ Skemelio

Benjamin Barbé 15.12.2018 14:37

Итак, ваш вопрос не имеет отношения к сокетам. Вы получили ответ правильно и просто хотите использовать его на своем Main. Правильно?

Themelis 15.12.2018 14:40

Да @skemelio, прости

Benjamin Barbé 15.12.2018 15:01

Последний вопрос, и я напишу еще один ответ. Сколько клиентов вы хотите принять? Один или несколько?

Themelis 15.12.2018 15:05

Есть только один клиент

Benjamin Barbé 15.12.2018 15:16

Я обновил свой пост: у меня одна проблема, теперь я ничего не получил, у меня только что появилась ошибка: Exception in thread "Thread-1" java.lang.NullPointerException ...... (в обновленном сообщении) @ Скемелио

Benjamin Barbé 16.12.2018 21:37

Этот код должен вызвать ошибку компиляции, потому что файл Main.java определяет класс с именем main.

Themelis 16.12.2018 21:40

Но все равно проблему знаю, что-то забыл, обновлю ответ. Кстати, не забудьте отметить ответ как правильный, если считаете его правильным ...

Themelis 16.12.2018 21:42

Конечно, я отмечу @Skemelio, у меня проблема со слушателем "this" в основном: программа возвращает ошибку: нельзя использовать это в статическом контексте

Benjamin Barbé 16.12.2018 21:54

Да, на самом деле не используйте класс Main, кроме функции main(). Сделаю обновление Main.java.

Themelis 16.12.2018 21:56

Другие вопросы по теме