Сокет сервера продолжает читать данные, пока я не закрою сокет от клиента в Java

Я не могу получить данные на сервере от клиента с помощью java. Ниже приведен код моего сервера:

 public void UpdateClients() throws Exception{

    Socket socktmp=null;

    try
    {
        socktmp= mainSocket.accept();
        rdr= new BufferedReader( new InputStreamReader(socktmp.getInputStream()));
        String t="";
        String name="";
        while((t=rdr.readLine())!=null){     <<<<< **it stops here**
            name=t;
        }
        //rdr.close();
        LstClient.AddClient(name, socktmp);

        objwriter = new ObjectOutputStream(socktmp.getOutputStream());
        objwriter.writeObject(LstClient.clients);
        objwriter.flush();  
        objwriter.close();
   }
   catch(Exception ex){
        throw new Exception("Unable to Update Clients. Error :" + ex.getMessage());
   }
      finally{
        try{
            if(mainSocket!=null){
                mainSocket.close();
            }
            if(socktmp!=null){
                socktmp.close();
            }
            if(rdr!=null)
            {
                rdr.close();
            }
            if(objwriter!=null)
            {
                objwriter.close();
            }

        }
        catch(Exception ex1){
            throw new Exception("Unable to close streams after opeining. Error :"+ ex1.getMessage());
        }


   }


}

и следующий код моего клиента:

public Client(String serverIp,int port,String name) throws Exception{

    try{
        if(mainSock!=null){
        mainSock.close();
        }
        mainSock= new Socket(serverIp, port);
        writer= new BufferedWriter(new OutputStreamWriter(mainSock.getOutputStream()));

        writer.write(name);
        writer.flush();
        **//writer.close();**
        Thread.sleep(1500);
        objin = new ObjectInputStream(mainSock.getInputStream());
        Hashtable<String,Socket> lst= new Hashtable<String , Socket>();
        lst = (Hashtable<String, Socket>) objin.readObject();
        cl = new LstClient();
        LstClient.clients = lst;
        System.out.println(LstClient.clients.size());
        objin.close();

    }
    catch(Exception ex){
        throw new Exception("Error : "+ ex.getMessage());
    }
    finally{
        if(mainSock!=null){
            mainSock.close();

        }
        if(writer!=null){
            writer.close();
        }
        if(objin!=null){
            objin.close();
        }


    }

}

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


person Shan Khan    schedule 07.01.2013    source источник
comment
Чтение ввода до конца потока, а затем попытка записи вывода в тот же сокет не имеет смысла. Конец потока в сокете обычно означает, что партнер закрыл соединение. Вероятно, вам следует просто читать строку за раз и отвечать на нее или что-то еще, что действительно требует ваш протокол приложения.   -  person user207421    schedule 02.12.2014


Ответы (2)


Я очень распространенная ошибка при использовании readLine, это забыть отправить новую строку.

Вы отправляете текст без новой строки, т.е. \n, но все равно ждете его отправки.

Попробуйте добавить write('\n');

person Peter Lawrey    schedule 07.01.2013

Поскольку вы читаете с помощью readLine(), который будет блокироваться до тех пор, пока не встретится с возвратом каретки. Добавьте '\n' в конце своего имени. Или, что еще лучше, используйте PrintWriter и напишите, используя println

person mprivat    schedule 07.01.2013
comment
Недостатком использования PrintWriter является молчаливое проглатывание исключений ввода-вывода. - person Peter Lawrey; 07.01.2013
comment
На самом деле это довольно большой минус. Вы можете использовать checkError(), но нет обратной связи о том, что пошло не так. Хотя большинство IOException при записи разрешаются одинаково с точки зрения клиента. Подключить/повторить попытку - person mprivat; 07.01.2013
comment
Решение состоит в том, чтобы использовать BufferedWriter и BufferedWriter.newline(). - person user207421; 02.12.2014