Java – Сокет – Заморозить

У меня есть минимальный сервер, который ждет, пока клиент подключится, затем он запустит поток, который отправит ответ обратно клиенту, проблема в ответе.

Это код сервера:

 int port = 1234;
 ServerSocket servSock = null;
 servSock = new ServerSocket(port);       
  while (true) {
   Socket link = servSock.accept();
   serverThread st = new serverThread(link);
   st.start();
  }

Это код метода run() потока, который отправляет ответ обратно, sk — это «ссылка» сокета, передаваемая параметром в коде сервера.

 public void run() {
    String dato = "";
    InputStream i = null;
    try {
        i = sk.getInputStream();
    } catch (IOException ex) {
        Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
    }
        Scanner input = new Scanner(i);
     //i receive the data sent
        while (input.hasNext()) {
            dato += input.nextLine();
        }   
    // then i send a reply
    DataOutputStream outputStream=new DataOutputStream(sk.getOutputStream());
    outputStream.writeInt(1);
    outputStream.close();

Клиентская сторона (только код, который должен получить ответ от сервера):

        Socket link;
        int valid = 0;
        String url="localhost";
        int port=1234;
        link = new Socket(InetAddress.getByName(url), port);

        //i've to send some data to the server
        PrintWriter output = new PrintWriter(link.getOutputStream(), true);
        String a = new String(Base64.encode(mex));
        output.println(createXml(tag, a));
        output.flush();


        //then i need to receive an answer from the server
        DataInputStream answerI = new DataInputStream(link.getInputStream());

        while(answerI.available()!=0)// but answerI.available() is always equal 0
           valid = answerI.readInt();

        answerI.close();
        output.close (); 
        link.close();

С этим кодом инструкция valid = answerI.readInt(); не достигается.

Без цикла while клиент зависает на строке: valid = answerI.readInt();

Может кто-нибудь помочь мне?

заранее спасибо


person michele    schedule 06.07.2010    source источник
comment
Возможный дубликат Что такое отладчик и как это может помочь мне диагностировать проблемы   -  person Raedwald    schedule 29.01.2016


Ответы (2)


Я предполагаю, что сервер заблокирован при вызове input.hasNext(). Это вернет false, когда сокет будет закрыт, а его InputStream вернет -1, чтобы сигнализировать об окончании потока. Тем не менее, сокет все еще открыт. Клиент может отправить другую строку; Scanner блокирует, чтобы увидеть, каким будет следующий ход клиента.

Существуют способы отключить «половину» сокета, чтобы сервер мог сказать, что клиент закрыл свой канал отправки, но все еще может получить ответ.

Однако этот подход сложен. Я предлагаю изменить протокол, чтобы сервер мог определять, когда ему разрешено отвечать.

person erickson    schedule 06.07.2010

В этом протоколе вам не нужен ответ, если он всегда равен «1». Просто закройте сокет. Клиент должен заблокировать функцию read(), которая вернет -1, когда сервер закроет сокет.

person user207421    schedule 07.07.2010
comment
ответ не всегда будет 1, я поставил 1 для проверки протокола, в настоящее время я закрываю поток ввода и поток вывода отдельно на сервере и в клиенте, например: 1 - клиент отправляет мекс на сервер, затем закрывает выходной поток 2 - сервер получает мексиканский файл, затем закрывает входной поток, 3 - сервер открывает выходной поток, а клиент открывает входной поток 4 - сервер отправляет ответ обратно клиенту. Теперь работает :) спасибо! - person michele; 08.07.2010