上一篇文章介绍了图片的加载和刷新
本篇将介绍socket发送多张图片,图片结束判断以及发送/接受的同步
Server端,在Frame初始化的最后,起进程来监听端口
server = new TestServer();
new Thread(server).start();
一旦有客户端连接到这个端口,server就会通过DataOutputStream持续发送图片给客户端
OutputStream outStream = incoming.getOutputStream();
DataOutputStream dos = new DataOutputStream(outStream);
countPhoto = 1;
while(true)
{
//更新图片在imagePanel中的显示
File file = null;
try{
file = new File("Sample Pictures/" + countPhoto + ".jpg");
//显示图片更新
Image image=ImageIO.read(file);
imagePanel.loadPhoto(image);
imagePanel.repaint();
}
catch(Exception e){
//如果文件不存在,则停止发送,跳出while
System.out.println(e);
textArea.setText("-- " + countPhoto + ".jpg 图片不存在,发送结束!--");
break;
}
File photo = new File("Sample Pictures/" + countPhoto + ".jpg");
FileInputStream fis = new FileInputStream(photo);
byte[] sendBytes = new byte[1024];
while( (length = fis.read(sendBytes, 0, sendBytes.length))>0 ){
if(length!=1024)
System.out.println(length);
dos.write(sendBytes, 0, length);
dos.flush();
}
countPhoto++;
}
每张图片的结束在内层 while( (length = fis.read(sendBytes, 0, sendBytes.length))>0 )判断
遇到的两个问题是:
1. client如何判断一张图片发送结束?
本来以为server端每次都是发送1024个字节,只有在图片的最后不够1024才会发送小于1024的字节长度,所以把接受到字节数组中小于1024作为结束标志。但是测试发现图片有时候只显示半截,后来通过打印接收到的字节数组长度,发现1024可以分为两个512等多种情况发送。所以搜了一下,发现还是需要通过每张图片的长度来判断图片发送结束。
2. 发送图片的速度与接受的速度不一致,图片显示不同步
本来以为通过加sleep解决,发现很难同步。后来网搜了一下,发现问题在于server只有发送的IO, client只有接收的IO。造成的问题是server不管client的反应就不停的发送,sleep是发送进程休眠是不能很准确的解决这个问题的,所以在clent正式接受图片前,接受图片长度完毕后,发送给server一个接受图片长度成功的字符串。
下一篇会贴出所有的代码。