问题同上我现在的思路是 文件→byte[]→拆分→发送→接收→根据Index组装→byte[]写文件但是现在文件小的话(大概长度在7000-8000正常拆 接收都正常)文件长度超过10000的话 我循环发送小包 对方有的时候(或者 包并不是按照发送是顺序接到的)就收不到 这叫我很是郁闷啊,请哥哥姐姐帮我看看谢谢了小弟不胜感激!
我的拆分代码
//把一个byte[] 拆成N个长度为400左右的小byte[]
private static List<AudioMessageING> XXAudioData(byte[] aData) throws Exception{
//Check
if(aData == null){

return null;
}
/**
 * 拆分
 */
int dataLength = aData.length;

int arrayNum = (dataLength / 400) + 1;

List<AudioMessageING> list = new ArrayList<AudioMessageING>();
int n = 0;
int index = 0;
while(n <= dataLength){

int len = Math.min(400, dataLength - n);

byte[] temp = new byte[len];

try {
System.arraycopy(aData, n, temp, 0, len);
} catch (Exception e) {
// TODO Auto-generated catch block

System.out.println("n:" + n);
System.out.println("n:" + n);
System.out.println("temp:" + temp);
System.out.println("temp:" + temp);
System.out.println("len:" + len);
System.out.println("len:" + len);

e.printStackTrace();

}

AudioMessageING ing = new AudioMessageING();

if(index == 0){

ing.setCmd(Cmd.Begin);
ing.setData(temp);
ing.setDataIndex(index);

}else if((n + len) == dataLength){

ing.setCmd(Cmd.End);
ing.setData(temp);
ing.setDataIndex(index);

}else{

ing.setCmd(Cmd.Ing);
ing.setData(temp);
ing.setDataIndex(index);
}
list.add(ing);

n+=400;
index++;
}
return list;
}private static void mergeAudio() throws Exception{

/**
 * 组装
 */

byte[] buffer = null;

buffer = new byte[receiveDataLength];

AudioMessageING[] arrING = new AudioMessageING[receiveDataArrCount];

for (AudioMessageING item : AMI) {

if(item.getCmd() == Cmd.Begin){

arrING[0] = new AudioMessageING();
arrING[0].setData(item.getData());

}else if(item.getCmd() == Cmd.Ing){

try {
arrING[item.getDataIndex()] = new AudioMessageING();
arrING[item.getDataIndex()].setData(item.getData());

// System.out.println(item.getDataIndex());
} catch (Exception e) {
// TODO Auto-generated catch block
throw new Exception();
}

}else if(item.getCmd() == Cmd.End){

arrING[item.getDataIndex()] = new AudioMessageING();
arrING[item.getDataIndex()].setData(item.getData());

}
}

int n=0;

for (int i = 0; i < arrING.length; i++) {



try {
System.arraycopy(arrING[i].getData(), 0, buffer, n, arrING[i].getData().length);

n+=arrING[i].getData().length;
} catch (Exception e) {
// TODO Auto-generated catch block

System.out.println("arrING["+i+"].getData() ::" + arrING[i].getData().length);
System.out.println(0);
System.out.println("buffer length::" + buffer.length);
System.out.println("n::" + n);
System.out.println("arrING["+i+"].getData() ::" + arrING[i].getData().length);

e.printStackTrace();
}
}

AudioMessage am = new AudioMessage();

am.setAudioMessage(buffer);

File file = new File("src/rfile.wav");

DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));

out.write(buffer,0,buffer.length);

out.close();
}
//结束类
package com.cnk.entity;import java.io.Serializable;public class AudioMessageEND implements Serializable {
/**
 * dataLength byte[] data 数组总长度
 */
private int dataLength; 
/**
 * dataArrCount 拆分后 多少个小byte[]数量
 */
private int dataArrCount;
public int getDataLength() {
return dataLength;
}
public void setDataLength(int dataLength) {
this.dataLength = dataLength;
}
public int getDataArrCount() {
return dataArrCount;
}
public void setDataArrCount(int dataArrCount) {
this.dataArrCount = dataArrCount;
}



}
//标识发送中的类
package com.cnk.entity;import java.io.Serializable;public class AudioMessageING implements Serializable { int dataIndex;

Cmd cmd;

byte[] data;

public int getDataIndex() {
return dataIndex;
}
public void setDataIndex(int dataIndex) {
this.dataIndex = dataIndex;
}
public Cmd getCmd() {
return cmd;
}
public void setCmd(Cmd cmd) {
this.cmd = cmd;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
}
//声音类package com.cnk.entity;import java.io.Serializable;public class AudioMessage implements Serializable { private String forUserName; public String getForUserName() {
return forUserName;
} public void setForUserName(String forUserName) {
this.forUserName = forUserName;
}

private byte[] audioMessage;

public byte[] getAudioMessage() {
return audioMessage;
} public void setAudioMessage(byte[] audioMessage) {
this.audioMessage = audioMessage;
}
}
//最后我定义的枚举
package com.cnk.entity;import java.io.Serializable;public enum Cmd implements Serializable {
Begin,
Ing,
End
}

解决方案 »

  1.   

    分割没做好比如,假设dataLength为401
    while(n <= dataLength){
                
                int len = Math.min(400, dataLength - n); //这里len = 400
    然后进入if (index == 0),然后 n+=400; //注意此时n不再满足while条件,接下来就推出while循环了,而最后的一个byte就丢失了
      

  2.   

    int tmpLen = dataLength;
            while(tmpLen > 0){
                
                int len = Math.min(400, tmpLen);
                
                byte[] temp = new byte[len];
                
                try {
                    System.arraycopy(aData, n, temp, 0, len);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    
                    System.out.println("n:" + n);
                    System.out.println("n:" + n);
                    System.out.println("temp:" + temp);
                    System.out.println("temp:" + temp);
                    System.out.println("len:" + len);
                    System.out.println("len:" + len);
                    
                    e.printStackTrace();
                    
                }
                
                AudioMessageING ing = new AudioMessageING();
                
                if(index == 0){
                    
                    ing.setCmd(Cmd.Begin);                
                    ing.setData(temp);                
                    ing.setDataIndex(index);
                    
                }else if(tmpLen == len){
                    
                    ing.setCmd(Cmd.End);                
                    ing.setData(temp);                
                    ing.setDataIndex(index);
                    
                }else{
                    
                    ing.setCmd(Cmd.Ing);                
                    ing.setData(temp);                
                    ing.setDataIndex(index);                
                }
                list.add(ing);
                
                //n+=400;    
                tmpLen -= len;        
                index++;        
            }
      

  3.   

    不好意思,看错了。
    UDP传输丢失是不会重发的,如果接收端是实时播放,那么丢失了就丢失了,如果是非实时播放的,就用TCP传输,这样如果有丢失,会自动重发的。
      

  4.   

    你好 我是非常想采用TCP 但是 NAT 打洞 怎么搞呀 我同样的 逻辑用C# 实现一点问题都没有
      

  5.   

    http://d.download.csdn.net/down/3266045/wenbodong
    这是一个基于UDP的大文件传输的例子,采取了一系列机制来应对UDP的丢失。对了,楼主,如果用TCP传输大数据的话,速度很慢的