2013-11-22 48 views
1

我已經寫客戶端 - 服務器消息發送使用Java,它工作正常套接字程序,但如果前一消息的字符串長度比本in.read(b5)越大,印刷有先前的消息字符串的消息添加到它的字符。這個問題是由於以前存儲在字節數組中的字符。CLIENT -server套接字編程

如何清除每個循環的字節數組? 我該如何解決這個問題?

客戶端代碼:

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

服務器代碼:

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

在調用read之前清空b2也許'Arrays.fill(b2,0);'你如何表示空字符? –

+0

我添加了Arrays.fill(b2,0);但得到了一個方法填充未找到錯誤...我認爲b2必須是一個字節數組ri8 ?? ?? @JerryJeremiah – user3021254

回答

0

添加out.flush();到您的循環的底部。閱讀javadoc獲取更多信息。請參閱下面的相關部分:

「刷新此輸出流並強制寫出任何緩衝的輸出字節。flush的一般協定是,調用它表示如果先前寫入的任何字節已由實現緩衝的輸出流,這些字節應立即寫入其預期的目的地。「

+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],接下來的一個到b中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)確實存在這種情況。