Java - Socket - Freeze - PullRequest
       4

Java - Socket - Freeze

1 голос
/ 07 июля 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

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

0 голосов
/ 07 июля 2010

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

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

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

...