关于文件传输的UDP协议,麻烦谁给解释一下下面的位运算这段和通信协议有什么关系?谢谢try {
DatagramSocket reciveSocket = new DatagramSocket();
byte[] buf = new byte[40 * 1024];
DatagramPacket dp;
FileInputStream fis = new FileInputStream("F:/testImage.bmp");
int readlen;
int index = 0;
InetAddress addr = InetAddress.getByName("127.0.0.1");
while ((readlen = fis.read(buf, 18, 40 * 1024 - 18)) > 0) {
index++;
buf[10] = (byte) (index & 0xFF);
buf[11] = (byte) (index >>> 8 & 0xFF);
buf[12] = (byte) (index >>> 16 & 0xFF);
buf[13] = (byte) (index >>> 24 & 0xFF);
buf[14] = (byte) (readlen & 0xFF);
buf[15] = (byte) (readlen >>> 8 & 0xFF);
buf[16] = (byte) (readlen >>> 16 & 0xFF);
buf[17] = (byte) (readlen >>> 24 & 0xFF);
dp = new DatagramPacket(buf, 40 * 1024, addr, 7774);
reciveSocket.send(dp);
sleep(5);
}
} catch (Exception e) {
e.printStackTrace();
}
DatagramSocket reciveSocket = new DatagramSocket();
byte[] buf = new byte[40 * 1024];
DatagramPacket dp;
FileInputStream fis = new FileInputStream("F:/testImage.bmp");
int readlen;
int index = 0;
InetAddress addr = InetAddress.getByName("127.0.0.1");
while ((readlen = fis.read(buf, 18, 40 * 1024 - 18)) > 0) {
index++;
buf[10] = (byte) (index & 0xFF);
buf[11] = (byte) (index >>> 8 & 0xFF);
buf[12] = (byte) (index >>> 16 & 0xFF);
buf[13] = (byte) (index >>> 24 & 0xFF);
buf[14] = (byte) (readlen & 0xFF);
buf[15] = (byte) (readlen >>> 8 & 0xFF);
buf[16] = (byte) (readlen >>> 16 & 0xFF);
buf[17] = (byte) (readlen >>> 24 & 0xFF);
dp = new DatagramPacket(buf, 40 * 1024, addr, 7774);
reciveSocket.send(dp);
sleep(5);
}
} catch (Exception e) {
e.printStackTrace();
}
解决方案 »
- (已经求教很多人,均无答案)何如将<xliff:g>标签写入xml文件中
- 关于dom4j查询xml 建web project没事 建java project运行就会出错
- 有没有办法通过jar命令获取jar包中META-INF/mainfest.mf中的内容?
- 用java直接调用power point
- 真正高手请进,一个关于JTable的问题………………!!
- 关于tools.jar,dt.jar
- 有人用html做过黑屏(好像dos)窗口的程序吗?
- 100分来拿,问题纯概念 非常简单的
- 我用throw主动抛出异常,如果我的throw在if块中,程序是否就中止,跳出,而如果在try块中,程序跳出try块,继续执行外的代码
- ******关于java中调用函数的问题********
- JAVA里的容器是不是有大小限制的??
- 请问JAVA如何根据图片画不规则的窗体?用JDK5.0
所以用 DatagramSocket socket = new DatagramSocket(80);
while (true) {
byte buffer[] = new byte[40 * 1024];;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
for (int i = 0; i < buffer.length; i++) {
if (buffer[i] != 0) {
System.out.println(" " + buffer[i]);
}
}
我把我的问题完整的说下吧:
主要实现基于UDP的文件传输,需要自己定义传输协议
主协议:
len0len1+cmd+pack0pack1+Data+VC(校验)
说明:
len0,len1是整个数据包长度(包括自身),len0位高字节,len1位低字节
cmd 位命令码
pack0,pack1表示该包数据在整个文件中拆解后的包号
Data表示实际传输的数据
vc表示校验,方法位从len0开始的到Data的最后一个字节,所有字节的异或和请问再发送端该如何定义,再接收端又该如何解析请各位指点指点,初次接触这个udp协议,谢谢
int totalSize = 0;
FOR 每个UDP包 {
byte[] recievedData = new byte[]{1,1,0,0};
int seq = 0;
for (int i = 0; i < recievedData.length; i++) {
seq |= recievedData[i+10] << (8 * i);
}
int size = 0;
for (int i = 0; i < recievedData.length; i++) {
size |= recievedData[i+14] << (8 * i);
}
totalSize += size;
byte[] realData = new byte[size];
System.arraycopy(recievedData, 18, realData, 0, size);
results.put(seq, realData);
}
byte[] data = new byte[totalSize];
int index = 0;
for (Iterator<Integer> it = results.keySet().iterator(); it.hasNext(); ) {
int key = it.next();
byte[] arr = results.get(key);
System.arraycopy(data, index, arr, 0, arr.length);
index += arr.length;
}大概就这样
你的UDP包中内容是这样的:
1)buf[10]~~buf[13]放的是该UDP包在整个文件中拆解后的包号(注意:以低字节在前,高字节在后的方式存放的包号)
2)buf[14]~~buf[17]放的是该UDP包中数据的实际长度(注意:以低字节在前,高字节在后的方式存放的数据的实际长度)
3)buf[18]开始是真正的数据....具体是多少数据,是由2)中的长度决定的.
4)UDP包中的内容(即:1),2),3)中数据的含义)与UDP的通信是一点关系都没有的.说明:显然楼主对UDP的程序设计的实际经验有点儿注意不够.
即:UDP的包大小(40K)太大了(虽然UDP包最大理论值是:64k-UDP头长-IP包头长),你很快公发现,这样做,UDP包丢失的可能性增大了.