DataInputStream接收数据不对??[带代码] 本帖最后由 sqz10200 于 2011-03-18 13:40:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 LZ这么凄惨···虽然不懂java,但是我写过类似的程序,既然不能接受完说明缓冲区不够大呗 不懂java,所以没看程序,说的不对请见谅LZ可以先接收这个 “第1位☞第4位,用4个byte表示此信息的长度...”然后根据的信息来分配合适空间,C用malloc,不知道java用什么,这样就可以了,最后记得释放 还有也不说是TCP还是UDP.哎,你自己玩把,下班了. zh这代码肯定是TCP啊一会加上注释代码不难所以就没加 public void run() { DataOutputStream dos=null; DataInputStream dis=null; try { dos = getDataOutput(socket); dis = getDataInput(socket); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while(true){ try { String msg = null; msg = this.getData;//获取命令的长度. dataLen = intToByte(msg.length()); System.out.println(bytesToInt(dataLen)); System.out.println("dataLen="+msg.length());//发送开始表示01 dos.write(start);//发送命令长度 dos.write(dataLen);//发送正文 dos.write(msg.getBytes());//发送结束字符00 dos.write(end); System.out.println(msg); byte[] bb = new byte[5];//读取5个字节,就是01和正文长度... dis.read(bb); byte[] bf = new byte[] { bb[1], bb[2], bb[3], bb[4] };//打印看那看那 for(byte b :bf){ System.out.println(b); }//转换成int System.out.println(bytesToInt(bf));//缓冲区大小. int buJin = 1024; int len = bytesToInt(bf); String re = "";//建立缓冲区. byte[] by = new byte[buJin]; int count= len/buJin;//循环读取 for(int i = 0 ;i<count;i++){ dis.read(by); System.out.println(new String(by)); re+=new String(by); }//读进最后的剩下的部分. if(len%1024!=0){ System.out.println("进入与"+len%buJin); byte[] foo = new byte[len%buJin]; dis.read(foo,0,foo.length); System.out.println(new String(foo)); re+=new String(foo); } System.out.println("asdf"+re.length());//看看是否是正常数据.//是的话进行解析发送回来的是XML if(!(dataNone.equals(re))){ List<Traffic> tList = xmlStrToDB(re); System.out.println("tList"); }else{ System.out.println("else"); } } catch (Exception e) { e.printStackTrace(); }finally{// try {// socket.close();// } catch (IOException e) {// // TODO Auto-generated catch block// e.printStackTrace();// } } try { Thread.sleep(17000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }加上注释的. 900课时j2ee教程大放送 unbuntu下配置grails? 有关LIST存储的问题 Mysql与hibernate3之间的一个问题 一天没解决了 Hibernate问题 ClassCastException 请教高手:用hibernate向数据库中添加数组时出现问题 自己打算做点东西,请指教 大家好,请教一个关于J2EE入门的问题,焦急 java.ejb.*找不到 一个令我困惑的问题(关于xml的解析) 有关 axis WebService 发布的问题 在Myeclipse中配置好了openfire,还是不能对原代码进行修改。。。
虽然不懂java,但是我写过类似的程序,
既然不能接受完说明缓冲区不够大呗
LZ可以先接收这个 “第1位☞第4位,用4个byte表示此信息的长度...”
然后根据的信息来分配合适空间,C用malloc,不知道java用什么,这样就可以了,最后记得释放
zh这代码肯定是TCP啊
一会加上注释代码不难所以就没加
public void run() {
DataOutputStream dos=null;
DataInputStream dis=null;
try {
dos = getDataOutput(socket);
dis = getDataInput(socket);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while(true){
try {
String msg = null; msg = this.getData;
//获取命令的长度.
dataLen = intToByte(msg.length());
System.out.println(bytesToInt(dataLen));
System.out.println("dataLen="+msg.length());
//发送开始表示01
dos.write(start);
//发送命令长度
dos.write(dataLen);
//发送正文
dos.write(msg.getBytes());
//发送结束字符00
dos.write(end); System.out.println(msg); byte[] bb = new byte[5];
//读取5个字节,就是01和正文长度...
dis.read(bb);
byte[] bf = new byte[] { bb[1], bb[2], bb[3], bb[4] };
//打印看那看那
for(byte b :bf){
System.out.println(b);
}
//转换成int
System.out.println(bytesToInt(bf));
//缓冲区大小.
int buJin = 1024;
int len = bytesToInt(bf);
String re = "";
//建立缓冲区.
byte[] by = new byte[buJin];
int count= len/buJin;
//循环读取
for(int i = 0 ;i<count;i++){
dis.read(by);
System.out.println(new String(by));
re+=new String(by);
}
//读进最后的剩下的部分.
if(len%1024!=0){
System.out.println("进入与"+len%buJin);
byte[] foo = new byte[len%buJin];
dis.read(foo,0,foo.length);
System.out.println(new String(foo));
re+=new String(foo);
}
System.out.println("asdf"+re.length());
//看看是否是正常数据.
//是的话进行解析发送回来的是XML
if(!(dataNone.equals(re))){
List<Traffic> tList = xmlStrToDB(re);
System.out.println("tList");
}else{
System.out.println("else");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
// try {
// socket.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
try {
Thread.sleep(17000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}加上注释的.