2014-12-04 2 views
1

Я пытаюсь сделать соединение с сокетами клиент/сервер через BufferedReader и Buffered Writer, но читатель не читает ничего, он просто повешен, где клиент отправляет и скрывает правильно. Сервер не генерирует никаких исключений, как если бы клиент не отправлял ничего на сервер.Java-сокет BufferedReader читает не читает

Моя голова собирается идти взрываются ...

Im используя то же самое для клиента и сервера:

in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 

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

//inside of try catch 
while(true){ 
      while(!in.ready())// just to debug 
      System.out.println("READY: " + in.ready()); //just to debug 
      System.out.println("READY: OK"); //just to debug 
      msg = receive().toString(); //hangs here... 
      System.out.println("KEYIS: " + msg); 
      ///some stuff to do .... 

public StringBuilder receive() throws IOException { 
    StringBuilder str = new StringBuilder(); 
    int tmp; 
    while(true){ 
     tmp = in.read(); 
     if(tmp == 0) 
      break; 
     else if(tmp == -1) 
      throw new IOException(); 
     str.append((char)tmp); 
    } 
    return str; 
} 

код клиента: не висит здесь

//inside of try catch 
     send(KEY); //sended properly, no exception 
     while(true){ 
      send(KEY); // sended properly, no exception 
      System.out.println("sent"); 
      //System.out.println(receive().toString()); 
     } 

public void send(String str) throws IOException{ 
    out.write(str + "\n"); // 
    //out.newLine(); //tried too, not helped 
    out.flush(); //push message to server 
} 
+1

Почему ты использовать BufferedReader? Попытайтесь удалить его, что должно помочь. – vbezhenar

ответ

1

Ну сервер ждет if(tmp == 0), который является 0, ноль, и клиент никогда его не отправляет.
Я думаю, что вы ждёте около \n, а это не 0, это 10 (line feed).
Просто интересно, почему вы не используете DataOutputStream#writeUTF() и DataInputStream#readUTF()?

+0

\ 0 используется для определения конца данных, -1 означает, что произошла ошибка в соединении. – Bob

+0

readUTF не может быть разрешен программой lua, которая также будет подключаться к серверу. – Bob

+0

@Bob Нет, * 'IOException' * означает, что в соединении произошла ошибка. -1 означает, что сверстник * закрыл * соединение. Нет ошибки. – EJP

1

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

Попробуйте BufferedReader.readLine(), не забудьте проверить значение null.

+0

Мне нужно передать данные, которые могут содержать символы \ n \ r, поэтому can not use readLine – Bob

+0

Итак, используйте 'BufferedInputStream.read()' и не используйте 'String' в качестве контейнера для двоичных данных. – EJP

0

решаемая проблема ... Так что глупая ошибка ... Я просто забыл добавить \ 0, чтобы определить конец сообщения, так Recieve метод ожидания, как будто приходит больше данных ...