我已经使用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);
}
答案 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)。