TCP/IP发送图片,swing.JPanel显示并更新图片(二、图片发送和发送/接受的同步)

时间:2022-06-01 19:26:08

上一篇文章介绍了图片的加载和刷新

本篇将介绍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一个接受图片长度成功的字符串。


下一篇会贴出所有的代码。