|
查看: 1640|回复: 12
|
Java Multicast packet 太大
[复制链接]
|
|
|
本帖最后由 nick_khor 于 9-6-2010 08:50 AM 编辑
写了个用 Multicast 来发送 desktop print screen 的programme. 却在发送 packet 的时候不成功,原因是packet size太大了。- java.net.SocketException: The message is larger than the maximum supported by the underlying transport: Datagram send failed
复制代码 请问有什么更好的方法来压缩我的packet。
是从 BufferedImage 下手 还是从 DatagramPacket 下手呢??
请指点.  - try {
- Robot robot = new Robot();
- BufferedImage bufferedImage = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ImageIO.write(bufferedImage, "jpeg", baos);
- byte[] baoss = baos.toByteArray();
- System.out.println(baoss.length); //THIS LENGTH IS VERY HUGE!!!
-
- InetAddress multicastAddress = InetAddress.getByName("224.5.6.7");
- socket = new MulticastSocket(6789);
- DatagramPacket sendPacket = new DatagramPacket(baoss,baoss.length,multicastAddress,6789);
- socket.send(sendPacket); //PACKET CANNOT BE SEND OUT
- }
- catch (AWTException e) {
- e.printStackTrace();
- }
- catch (IOException e) {
- e.printStackTrace();
- }
复制代码 |
|
|
|
|
|
|
|
|
|
|
发表于 9-6-2010 06:21 PM
|
显示全部楼层
1) Resize the file.
2) 用java.util.zip把文件zip了才send.
3) 改configuration 的maximum send limit. |
|
|
|
|
|
|
|
|
|
|
发表于 9-6-2010 11:58 PM
|
显示全部楼层
|
JPEG 改去 GIF 吧 , 应该 SIZE 会 更小 。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 10-6-2010 10:07 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 13-6-2010 09:10 PM
|
显示全部楼层
|
比较有效的方法就是把data split成多个packets。不过,需要加上自己的flow control,才能确保receiver能够重组所有的data。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 14-6-2010 07:32 PM
|
显示全部楼层
回复 5# 苦瓜汤
Multicast UDP packet 是没有得 packet flow control
除非 TCP |
|
|
|
|
|
|
|
|
|
|
发表于 14-6-2010 07:41 PM
|
显示全部楼层
回复 苦瓜汤
Multicast UDP packet 是没有得 packet flow control
除非 TCP
nick_khor 发表于 14-6-2010 07:32 PM 
我不是说了 “需要加上自己的flow control” 吗? |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 14-6-2010 07:57 PM
|
显示全部楼层
回复 7# 苦瓜汤
paiseh~ multicast packet 不可以 split 的咧~  |
|
|
|
|
|
|
|
|
|
|
发表于 14-6-2010 08:22 PM
|
显示全部楼层
回复 8# nick_khor
byte array logically不是可以split吗?
- final int FRAGMENTED_SIZE = 256;
- int numPacket = new Double(Math.ceil(boass.length / (FRAGMENTED_SIZE * 1.0d))).intValue();int offset = 0;
- for(int i = 0; i < numPacket; i++){ ..... new DatagramPacket(boass, offset, (i == numPacket) ? boass.length - offset : FRAGMENTED_SIZE); offset += i * FRAGMENTED_SIZE;}
复制代码
上面的代码没测试过,只是demo用途。还有你需要加入一些flow control的东西例如file id或sequence number。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 14-6-2010 08:35 PM
|
显示全部楼层
回复 9# 苦瓜汤
鸟的! 我试试看! 非常感谢!  |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 31-7-2010 10:22 PM
|
显示全部楼层
回复 9# 苦瓜汤
老大,这几天来我实在是不明白 offset 的原理。 你给我的 concept 我参不透
>.<""
但我用另一个很耗资源方法解决了我的 大 packet 的问题了。
麻烦一下, offset 是怎么操作来的? 谢谢 |
|
|
|
|
|
|
|
|
|
|
发表于 3-8-2010 10:44 PM
|
显示全部楼层
本帖最后由 megablue 于 3-8-2010 10:54 PM 编辑
回复 苦瓜汤
老大,这几天来我实在是不明白 offset 的原理。 你给我的 concept 我参不透
>.
nick_khor 发表于 31-7-2010 10:22 PM 
offset 就是定位点。在array里就是指index了。UDP是可以通过应用层实现Reliability & Flow control的.
但前提是你要先了解如何parse/manipulate/craft packets 还有基本的socket programming概念。
何为connectionless, 何为reliable protocol, hand shacking, ACKs, data sequencing, window size, checksum 等等等.... |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 4-8-2010 02:42 AM
|
显示全部楼层
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|