2013-11-22 3 views
1

Я написал программу отправки сообщений клиент-сервер с использованием сокетов в Java, которая работает нормально, но если длина строки предыдущего сообщения больше, чем текущая in.read(b5), строковое сообщение печатается с предыдущим сообщением добавлены символы. Эта проблема связана с предыдущими сохраненными символами в массиве байтов.ПРОГРАММИРОВАНИЕ КЛЕТОК-СЕРВЕРОВ Socket

Как очистить массив байтов для каждого цикла? Как я могу это решить?

код КЛИЕНТ:

try 
    { 
    String add=args[0]; 
    int port=Integer.parseInt(args[1]); 
    Socket s=new Socket(add,port); 
    OutputStream out=s.getOutputStream(); 
    InputStream in=s.getInputStream(); 
    BufferedReader bufIn = new BufferedReader(new InputStreamReader(in)); 
    BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out)); 
    byte b1[]=new byte[100]; 
    byte b2[]=new byte[100]; 
    while(true)//infinite loop 
    { 
     System.out.println("To Server:"); 
     System.in.read(b1); //reading from keyboard 
     out.write(b1);  //writing to server 
     in.read(b2);   //reading from server    
     String s1=new String(b2); 
     String s2=s1.trim(); 
     System.out.println("From Server:"+s2); 
    } 
    } 
    catch (Exception e) 
    { 
    System.err.println(e); 
    } 

SERVER код:

try 
{  
    int port=Integer.parseInt(args[0]); 
    ServerSocket ss=new ServerSocket(port); 
    while(true) //this loop for diff. no. of clients 
    { 
    Socket s=ss.accept();    
    InputStream in=s.getInputStream(); 
    OutputStream out=s.getOutputStream(); 
    byte b1[]=new byte[100]; 
    byte b2[]=new byte[100]; 
    while(true) //this loop for one client diff. no. of times. 
    {     
     in.read(b1); 
     String s1=new String(b1); 
     String s2=s1.trim(); 
     System.out.println("From Client:"+s2); 
     System.out.print("To Client:"); 
     System.in.read(b2); 
     out.write(b2); 
    } 
    } 
} 
catch (Exception e) 
{ 
    System.err.println(e); 
} 
+0

Чтобы удалить b2 перед вызовом read, возможно, 'Arrays.fill (b2, 0);' Как вы обозначаете пустые символы? –

+0

i добавил Arrays.fill (b2,0); но получил метод fill not found error ... Я думаю, b2 должен быть байтовым массивом ri8 ?? @JerryJeremiah – user3021254

ответ

0

добавить out.flush(); к нижней части цикла. Прочтите javadoc для получения дополнительной информации. См. Соответствующую часть ниже:

«Сбрасывает этот выходной поток и заставляет выписывать любые буферизованные выходные байты. Общий контракт на флеш - это то, что вызов является признаком того, что если любые ранее написанные байты были буферизированы реализацией выходного потока, такие байты должны быть немедленно записаны в их предназначение ».

+0

out.flush dint изменение выход ... такой же ошибка повторы – user3021254

0

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

Для записи/отправки

System.out.println("To Server:"); 
      while (System.in.read(b1) != -1) 
      { 
       out.write(b1);// writing to server 
      } 

Для чтения

    String s2 = ""; 

       do 
       { 
        in.read(b1); 
        String s1 = new String(b1); 
        s2 += s1; 
       } while (in.available() > 0); 
0

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

See Javadoc for InputStream.read:

Первый байт чтения сохраняется в элементе B [0], следующий в б 1, и так далее. Количество прочитанных байтов, самое большее, равно длине b. Пусть k - количество фактически прочитанных байтов; эти байты будут храниться в элементах b [0] через b [k-1], оставив элементы b [k] через b [b.length-1] незатронутыми.

Вы не можете использовать Arrays.fill (b1,0), потому что b1 - это массив байтов, а 0 - int. То есть вы притворяетесь, что используете Arrays.fill (byte [] b, int val), которого не существует.

Просто отбрасывать от 0 до байта, и вы сделали:

Arrays.fill(b1, (byte)0); 

В этом случае вы используете метод Arrays.fill (байт [] B, байт VAL), что действительно существует.

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