客户端 - 服务器插座编程

时间:2013-11-22 10:32:20

标签: java client-server

我已经使用Java中的套接字编写了客户端 - 服务器消息发送程序,该程序工作正常,但如果前一条消息的字符串长度大于当前in.read(b5),则使用以前的消息字符打印字符串消息添加到它。此问题是由于以前在字节数组中存储的字符。

如何清除每个循环的字节数组? 我该如何解决这个问题?

客户代码:

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

3 个答案:

答案 0 :(得分:0)

out.flush();添加到循环的底部。阅读javadoc以获取更多信息。见下面的相关部分:

“刷新此输出流并强制写出任何缓冲的输出字节。刷新的一般合同是调用它表示,如果先前写入的任何字节已被输出流的实现缓冲,例如应立即将字节写入其预期目的地。“

答案 1 :(得分: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);

答案 2 :(得分: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(byte [] b,byte val)。