2013-03-14 1 views
0

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

AIM: Напишите простой серверный сокет, который может считывать CORRECT данные из клиентского сокета.

До сих пор: я смог написать код для чтения из сокета, даже умеющего читать данные, но дело в том, что я получаю много пробелов в конце.

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

Поблагодарите за входные данные.

ПРИМЕЧАНИЕ. Для подключения к соке я использую telnet-службу windows7.

readSocket() { 
    System.out.println(client_socket); 
    try { 
     System.out.println("reading socket"); 
     /*BufferedReader brIn = new BufferedReader(new InputStreamReader(client_socket.getInputStream())); 
     String inputLine = null; 
     while ((inputLine = brIn.readLine()) != null) { 
      System.out.println(inputLine); 
     }*/ 
     InputStream is = client_socket.getInputStream(); 
     byte[] byteArr = new byte[1024]; 
     int inputsize = -1; 
     int currentPos = 0; 
     StringBuffer sb = new StringBuffer(11111); 
     /*while((inputsize = is.read(byteArr)) != -1) { 
      String processed = new String(byteArr); 
      sb.append(processed); 
     }*/ 
     int BUFFER_SIZE = 1024; 
     int read; 
     byte[] buffer = new byte[BUFFER_SIZE]; 
     String processed = ""; 
     while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) { 
      String current = new String(byteArr); 
      //os.write(buffer, 0, read); 
      System.out.println("current Process "+current); 

      //processed +=current; 
      sb.append(current.toString().trim()); 
     } 
     System.out.println("Socket input is : "+sb.toString()); 
     System.out.println("Sending response to client "+processed.toString()); 
     //client_socket.getOutputStream().write(sb.toString().getBytes()); 
     //client_socket.getOutputStream().close(); 

     FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\himanshu2100\\eee.txt")); 
     fos.write(processed.getBytes()); 
     fos.close(); 
     is.close(); 
     client_socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Ну используя предложение как Роджер Lindsjö и mprivat, я переработан ту часть, где я читал из потока.

readSocket() { 
    System.out.println(client_socket); 
    try { 
     System.out.println("reading socket"); 
     InputStream is = client_socket.getInputStream(); 
     byte[] byteArr = new byte[1024]; 

     int read; 
     int BUFFER_SIZE = 1024; 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

     while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) { 
      baos.write(byteArr, 0, read); //This is an optimized design, instead of having so many strings 
     } 
     System.out.println("Output is :"+new String(baos.toByteArray())); 
     baos.close(); 
     is.close(); 
     client_socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

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

ответ

1

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

while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) { 
     String current = new String(byteArr, 0, read); 
     System.out.println("current Process "+current); 
     sb.append(current); 
    } 

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

+0

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

5

На этой линии: while ((read = is.read(byteArr, 0, BUFFER_SIZE)) != -1) {

read будет содержать количество считанных байт, поэтому, если ваш сервер отправляет строку «ПРАВИЛЬНО», но ваш BUFFER_SIZE 1024, вы будете иметь много дополнительного пространства, чтобы вы не может этого сделать: String current = new String(byteArr);. Вместо этого, вы должны использовать только байты вы считываемые из потока:

String current = new String(byteArr, 0, read); 

 Смежные вопросы

  • Нет связанных вопросов^_^