【问题标题】:How to transfer jpg image using UDP socket如何使用 UDP 套接字传输 jpg 图像
【发布时间】:2019-04-27 03:17:19
【问题描述】:

我想通过 UDP 连接传输 jpg 图像。我想要一个 java 代码将图像转换为字节数组并在另一侧重新创建 jpg 文件。

我尝试过的代码

图像到字节数组

    BufferedImage img = ImageIO.read(new File("src/test.jpg"));
    ByteArrayOutputStream baos = new ByteArrayOutputStream();        
    ImageIO.write(img, "jpg", baos);
    baos.flush();
    byte[] buffer = baos.toByteArray();
    byte[] buff = new byte[1024];
    int c=0;

    DatagramSocket clientSocket = new DatagramSocket();       
    InetAddress IPAddress = InetAddress.getByName("192.168.43.1");
    System.out.println(buffer.length);
    for(int i=0;i<buffer.length;i++){
        buff[c] = buffer[i];
        c++;
        if(i%1023==0){
            DatagramPacket packet = new DatagramPacket(buff, buff.length, IPAddress, 9876);
            buff = new byte[1024];
            c=0;
            clientSocket.send(packet);

            System.out.println("sent a mini-packet");
        }
    }

字节数组到图像

tv = (TextView)findViewById(R.id.recv_message);
try {
  DatagramSocket clientsocket=new DatagramSocket(9876);
  byte[] receivedata = new byte[1024];
  while(true)
  {
    DatagramPacket recv_packet = new DatagramPacket(receivedata, receivedata.length);
    Log.d("UDP", "S: Receiving...");

    clientsocket.receive(recv_packet);       

    byte[] buff = recv_packet.getData();
    final Bitmap new_img = BitmapFactory.decodeByteArray(buff, 0,
            buff.length);
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            tv.setText("received");
            ImageView image = (ImageView) findViewById(R.id.test_image);
            image.setImageBitmap(new_img);
        }
    });



    InetAddress ipaddress = recv_packet.getAddress();
    int port = recv_packet.getPort();
    Log.d("IPAddress : ",ipaddress.toString());
    Log.d(" Port : ",Integer.toString(port));
  }
} catch (Exception e) {
  Log.e("UDP", "S: Error", e);
  runOnUiThread(new Runnable() {
      @Override
      public void run() {
          tv.setText("Error Occured");
      }
  });
}

【问题讨论】:

  • 显示你目前尝试过的一些代码
  • 您的发送部分似乎是正确的。我猜这个问题是因为数据报包可能会丢失,所以字节接收不完整。请务必说明您遇到的问题。还要确保您的设备是否能够通过 udp 进行通信,即是否接收到任何数据包。
  • @KunjanThadani 通信工作正常。我已经通过传输文本对其进行了测试。但是当涉及到图像时,它不起作用。我也认为问题出在接收部分。有什么想法吗?

标签: java sockets udp


【解决方案1】:

图片的发送方式有一点小问题。 最初,图像被转换为​​ byte[],然后发送单个字节,即完整的图像被破坏并通过不同的较小数据包发送。

现在,当您尝试接收数据包时,这些数据包中的每一个都是单独接收的,并且每次收到一个小数据包时都会创建一个图像。

例如。让图像为 1024 字节。您正在发送其单个字节,例如 1,然后是 2,...... 1024。 在接收它们时,比如接收到数据包 1,它正在使用该单个数据包创建图像。 同样,当第二个数据包到达时,正在创建另一个图像。

但是要创建一个完整的 1024 字节的图像。 这就是为什么,你没有得到你想要的结果。

您需要实现一种机制,将它们缓冲成单个字节[],然后形成图像。

现在,只做一件事。以单个单元发送图像,即从图像创建一个字节 [] 并直接发送它而不破坏它或从循环中单独发送字节。

 BufferedImage img = ImageIO.read(new File("src/test.jpg"));
 ByteArrayOutputStream baos = new ByteArrayOutputStream();        
 ImageIO.write(img, "jpg", baos);
 baos.flush();
 byte[] buffer = baos.toByteArray();

 DatagramSocket clientSocket = new DatagramSocket();       
 InetAddress IPAddress = InetAddress.getByName("192.168.43.1");
 System.out.println(buffer.length);

  DatagramPacket packet = new DatagramPacket(buffer, buffer.length, IPAddress, 9876);

  clientSocket.send(packet);

现在,当您收到数据包时,可以形成一个完整的图像,因为所有 1024 字节将一次接收。

【讨论】:

  • 好的,但请保持尊严。至少接受/投赞成票。
  • 是的,但是我没有投票的权限,因为我是 stack-overflow 的新手。对此我感到非常抱歉。
  • 哦,是的,我没注意到。没问题。
  • 图片大于65535字节怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2012-09-21
相关资源
最近更新 更多