在java库中,http://download.java.net/jdk7/archive/b123/docs/api/java/net/DatagramPacket.html
我想使用这个构造函数构建我的数据报包对象;
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
这是我的代码:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write( by); // by is a buffer that contains filename
outputStream.write(buffer); // buffer contains the actual data for the packet
byte combined[] = outputStream.toByteArray( );
System.out.println("combined length is "+combined.length);
sndPkt = new DatagramPacket(combined,by.length, combined.length, ip, portNum);
sendsocket.send(sndPkt);
Thread.sleep(1);
“by”是包含文件名的缓冲区。 “buffer”包含文件数据。我想将它们组合在一起并发送一个数据包。但是,当我使用上面提到的构造函数创建DatagramPacket对象时。我收到此错误消息:
java.lang.IllegalArgumentException: illegal length or offset
当我将其更改为零时,没有报告错误,但我需要设置与我的文件名长度相同的偏移值,以便我能够在服务器端获取它。谁能告诉我问题出在哪里?我可以通过发送它作为第一个数据包将文件名发送到服务器,但现在我想在我发送的每个数据包中嵌入文件名。这是标准的做法吗?
答案 0 :(得分:1)
offset + length
必须小于或等于缓冲区的长度,否则它将溢出。发送/接收的数据将从缓冲区中的offset
开始,并运行length
长。
如果您在代码中使用offset=0
,您确实会在每个数据包中发送文件名。但是,您将无法解析数据包,因为您不知道接收数据包中文件名的长度。例如,您可以在文件名和其余数据之间添加一个分隔符,并相应地解析数据包。