Socket 发送文件 在本地测试可以 放互联网上却发不过来

loujingqin 2007-10-23 03:56:14
我写了个发送文件的代码,放在本地测试是正确的,可是我放在互联网上的时候却出错了,根本发不过来
java.net.SocketException: Software caused connection abort: socket write error
报这样的错误
byte[] buf = new byte[1024];
while ((dis.read(buf)) != -1) { //每次向流里写入1024个字节
dos.write(buf, 0, buf.length);
}
在红色部分这个地方输出流写入报异常

大家帮忙看看呀
...全文
156 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
loujingqin 2007-10-29
  • 打赏
  • 举报
回复
楼上的什么意思?
liang8305 2007-10-29
  • 打赏
  • 举报
回复
那你不如服务器端弄成单张的算了,加个参数作为请求的图片(名)

这样的话,客户端只要知道一共要收到的图片的列表,挨个请求就可以了


loujingqin 2007-10-29
  • 打赏
  • 举报
回复
哎,人烟稀少呀,最后提问,就是我用的for()循环发的多张图片,接收端再接收完一张图片都发个消息给发送端,发送端收到这个接收完毕的标志消息后发第二张图片,调试的时候完全Ok,可是运行就出错。有时候第一次连接也ok,我把接收端关了重新连接就出错,发送端其他的都关掉,只是ServerSocket一直监听,不知道为什么。

希望有人能帮帮忙
loujingqin 2007-10-26
  • 打赏
  • 举报
回复
“因为我要发送队长图片” 是 “多张图片”
loujingqin 2007-10-26
  • 打赏
  • 举报
回复
现在解决了一个问题,就是我在接收端接收一张图片后发了一个消息给发送端,然后接着发送第二张图片,因为我要发送队长图片,放在一个for循环里面发的,在Input接收到这个字符串后再开始发送第二张图片,结果就能发过来了。以前是没有这个控制,发送端只管发,接收端只管接,接收到文件大小就跳出while(in.read)这样子,然后继续接下一张,这样不行,不知道为什么。
上面问题是解决了,可是现在有新问题了。
就是我客户端第一次去连接的时候发送正确,然后关掉了客户端,服务器端一直监听。第二次连接的时候第二张图片就发送失败了,不知道什么原因了。我在第一次连接发送完后,把所有的东西都关掉了,除了ServerSocket。
loujingqin 2007-10-26
  • 打赏
  • 举报
回复
5555555555,没人帮忙,大家帮忙了,搞出来了我加分,由于现在还不能加分,发得时候没小心就发了。
我调试的时候是正确的,可是运行的时候就不行了,实在不知道什么原因了
loujingqin 2007-10-25
  • 打赏
  • 举报
回复
我是这样子做的,可是感觉发送的图片不对劲,显示不了,大小都是正确的,可是不认识发过来的东西,我用in.readLine()读出来的图片的东西是一些方块的乱码 ,不知道是怎么回事呀
「已注销」 2007-10-25
  • 打赏
  • 举报
回复
制定一个简单的通讯协议吧
数据包=数据长度(int)+有效数据

/*
* 数据发送
*/
public static void writeBytes(java.io.DataOutputStream dos,byte[] bytes) throws IOException
{
dos.writeInt(bytes.length);
dos.write(bytes);
}
/*
* 数据接收
*/
public byte[] readBytes(java.io.DataInputStream dis) throws IOException
{
byte[] bytes=new byte[dis.readInt()];
dis.readFully(bytes);
return bytes;
}
loujingqin 2007-10-24
  • 打赏
  • 举报
回复
谢谢 redduke1202 回复 ,我发现另外这里报错是因为我客户端再没有接收完数据的情况下 关闭了输入流,所以报这个错误,感觉关键的问题是两边没有控制好,因为我发的是多张图片。我把两边的字节 byte[] buf=new byte[1024];
这个改变一下就能就收到部分数据,一点点。就是把发送端的这个改成8192,接收端改成568个字节读取,就能收到一部分数据,请问这样的通信怎么控制呀
「已注销」 2007-10-24
  • 打赏
  • 举报
回复

bufSize=dis.read(buf)
「已注销」 2007-10-24
  • 打赏
  • 举报
回复
dis.read(buf)
不一定能读满整个buf,比如整个长度不是1024的整数倍,最后一次肯定buf不满
另外可能的io问题,任何一次读取都不能保证完全读取1024字节内容

因此后面 dos.write(buf, 0, buf.length);
就有问题了


byte[] buf=new byte[1024];
int bufSize=0;
while((bufSize=dis.read(bug))!=-1)
dos.write(buf,0,bufSize);

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧