问题同上我现在的思路是 文件→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
}
我的拆分代码
//把一个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
}
解决方案 »
- a+b的处理 新手求好心人帮助
- Object是java里的关键字吗
- 1千万条数据记录比较的算法(临近记录排序算法SNM)
- 新手界面设计求助!
- JAVA的多态到底是什么??
- 100分看个错误
- 将TOMCAT这些开源软件进行商业用途的传播,会不会涉及到有侵犯版权的问题
- 在Eclipse下配置Tomcat运行时出现的错误,请大家帮帮忙
- 那位大哥配置过"洋溢论坛",我设置了数据源,把yy目录也加到了classpath..并且把forum整个目录放在以tomcat的webapps下...可是通过http://l
- 偶如何能实现java精确打印
- 读取PDF文件方式,超级变态!待高手解决!
- java 编译报错
while(n <= dataLength){
int len = Math.min(400, dataLength - n); //这里len = 400
然后进入if (index == 0),然后 n+=400; //注意此时n不再满足while条件,接下来就推出while循环了,而最后的一个byte就丢失了
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++;
}
UDP传输丢失是不会重发的,如果接收端是实时播放,那么丢失了就丢失了,如果是非实时播放的,就用TCP传输,这样如果有丢失,会自动重发的。
这是一个基于UDP的大文件传输的例子,采取了一系列机制来应对UDP的丢失。对了,楼主,如果用TCP传输大数据的话,速度很慢的