How to transfer jpg image using UDP socket(如何使用UDP套接字传输jpg图像)
本文介绍了如何使用UDP套接字传输jpg图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想通过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");
}
});
}
推荐答案
发送图像的方式略有问题。 最初将图像转换为byte[],然后发送单个字节,即完整图像被破坏并通过不同的较小数据包发送。
现在,当您尝试接收数据包时,每个数据包都会被单独接收,并且每次接收到一个小数据包时都会创建一个映像。用于前。设图像为1024字节。您正在发送其单个字节,如1,然后是2,.1024号。 在接收它们的同时,例如接收到数据包1,它会创建具有该单个数据包的映像。 同样,当第二个数据包到达时,将创建另一个映像。
但是要创建一个完整的1024字节的图像。 这就是为什么您得不到您想要的结果。您需要实现一种机制来将它们缓冲到单个字节[]&;中,然后形成图像。
现在,只做一件事。以单个单元发送图像,即从图像创建一个byte[]&;直接发送,而不打断它或从循环中单独发送字节。
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个字节。
这篇关于如何使用UDP套接字传输jpg图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何使用UDP套接字传输jpg图像
基础教程推荐
猜你喜欢
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01