求助一个java socket传输问题。 我用Java socket发送pdf附件的时,会出现乱码,并且出现问题的附件会比原来的附件大1K左右,我怀疑是写出来的附件多出了什么其他的东西,我也写到pdf文件里去 ,所以导致pdf乱码。而且这个问题不是每次都出现,有20%~左右的几率收到的附件是正常的。。各位朋友帮我看看这是什么问题?socketjava 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的socket流没有传输文件长度,造成文件长度不对 这个是发送代码 if(BodyLen > 0){ log.warn("直接返回附件"); clientOS.write(Header.getBytes()); clientOS.flush(); int totalCount = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((size = wispIS.read(temp)) != -1) { bos.write(temp, 0, size); bos.flush(); totalCount += size; if(BodyLen == totalCount){ break; } } byte[] b = bos.toByteArray(); bos.flush(); bos.close(); if (Header.indexOf("application/pdf") != -1) { OutputStream o = new FileOutputStream("c://223.pdf"); o.write(b); o.flush(); o.close(); } clientOS.write(b); clientOS.flush();这个是接收的代码clientOS.write(Header.getBytes()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] returnBytes = new byte[1024]; int size ; long totalCount = 0; while ((size = nSafeIS.read(returnBytes)) != -1) { totalCount += size; bos.write(returnBytes); bos.flush(); if (totalCount == BodyLen) { break; } } byte [] b = bos.toByteArray(); bos.close(); if (Header.indexOf("application/pdf") != -1) { OutputStream o = new FileOutputStream("c://123.pdf"); o.write(b); o.flush(); o.close(); } clientOS.write(b); clientOS.flush(); nSafeOS.close(); nSafeIS.close();我是模拟Http拼出包头包体,所以后面写的时候也是按自己写的包头读的,从socket里读出的长度应该不会错,但是出错的文件会变大就莫名其妙了。另外,发送的时候我写在本地的 223.pdf是没错的,但是123.pdf就出错了。 socket的流是读不到-1的,刚开始做socket的时候都会碰到这个问题 接收的代码bos.write(returnBytes);改成 bos.write(returnBytes,0,size); 你看下我三楼的说明。还以为你说的直接socket传送文件呢 你看下我三楼的说明。还以为你说的直接socket传送文件呢我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。 你看下我三楼的说明。还以为你说的直接socket传送文件呢我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。 这些都是从返回的http包头里读取出来的。 这些都是从返回的http包头里读取出来的。我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度 这些都是从返回的http包头里读取出来的。我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度嗯,其实知道这个问题,但是一直没重视,之前有的时候没写读取长度也不会出错,这次出了这问题也没想到这个。困扰了我大半天。 遇到个简单的return返回值问题?真心懵了 Hashtable的已在元素无法找到的问题 请高手指点 我要学 java与数据库 开发,应先了解哪些知识,急~~ 关于display 的用法 JButton 的大小设置 怎样清空控制台信息? 【JAVA SE小版发帖须知】 JB7能当JDK用吗?哪位朋友告诉我怎么把它当JDK用啊? 用Corba做分布式应用程序 关于邮件服务器如何自动分配帐号和密码? Java可以实现C++默认参数的功能吗? 在new一个java对象时,如何控制程序员是否必须实现一个方法
if(BodyLen > 0){
log.warn("直接返回附件");
clientOS.write(Header.getBytes());
clientOS.flush();
int totalCount = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((size = wispIS.read(temp)) != -1) {
bos.write(temp, 0, size);
bos.flush();
totalCount += size;
if(BodyLen == totalCount){
break;
}
}
byte[] b = bos.toByteArray();
bos.flush();
bos.close();
if (Header.indexOf("application/pdf") != -1) {
OutputStream o = new FileOutputStream("c://223.pdf");
o.write(b);
o.flush();
o.close();
}
clientOS.write(b);
clientOS.flush();
这个是接收的代码clientOS.write(Header.getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] returnBytes = new byte[1024];
int size ;
long totalCount = 0;
while ((size = nSafeIS.read(returnBytes)) != -1) {
totalCount += size;
bos.write(returnBytes);
bos.flush();
if (totalCount == BodyLen) {
break;
}
}
byte [] b = bos.toByteArray();
bos.close();
if (Header.indexOf("application/pdf") != -1) {
OutputStream o = new FileOutputStream("c://123.pdf");
o.write(b);
o.flush();
o.close();
}
clientOS.write(b);
clientOS.flush();
nSafeOS.close();
nSafeIS.close();我是模拟Http拼出包头包体,所以后面写的时候也是按自己写的包头读的,从socket里读出的长度应该不会错,但是出错的文件会变大就莫名其妙了。另外,发送的时候我写在本地的 223.pdf是没错的,但是123.pdf就出错了。
我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。
我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。
我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度
我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度
嗯,其实知道这个问题,但是一直没重视,之前有的时候没写读取长度也不会出错,这次出了这问题也没想到这个。困扰了我大半天。