java中网络传输出现java.net.SocketException 下载后文件不完整

K_X_S_ 2012-09-08 10:40:01
源代码如下
客户端代码
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class FileDown {
public static void main(String[] args) {
try {
System.out.println("Client Start ...");
Socket so = new Socket("127.0.0.1",3333);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
DataInputStream dis = new DataInputStream(so.getInputStream());
DataOutputStream dos = new DataOutputStream(so.getOutputStream());
System.out.println("请输入下载的文件:");
String from = br.readLine();
System.out.println("请输入本地目录和文件名:");
String to = br.readLine();
dos.writeUTF(from);
String st = dis.readUTF();
if(st.startsWith("file")){
FileOutputStream fos = new FileOutputStream(to);
byte[] bb = new byte[10240];
String size = st.split(":")[1];
int length = Integer.parseInt(size);
int times = length/10240;
if(length%10240 != 0) times++;
for(int i=0;i<times;i++){
int num = dis.read(bb);
fos.write(bb,0,num);
}
fos.close();
System.out.println("下载成功!");
}else if(st.startsWith("nofile")){
System.out.println("文件不存在!");
}
br.close();
dis.close();
dos.close();
so.close();
} catch (Exception ee) {
ee.printStackTrace();
}
}

}



服务器端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
public static void main(String[] args) {
try {
System.out.println("Server Start ...");
ServerSocket ss = new ServerSocket(3333);
Socket so = ss.accept();
DataInputStream dis = new DataInputStream(so.getInputStream());
DataOutputStream dos = new DataOutputStream(so.getOutputStream());
String fileName = dis.readUTF();
File file = new File(fileName);
if(file.exists()){
dos.writeUTF("file:"+file.length());
byte[] bb = new byte[10240];
FileInputStream fis = new FileInputStream(file);
while(true){
int num = fis.read(bb);
if(num == -1) break;
dos.write(bb,0,num);
}
fis.close();
}else{
dos.writeUTF("nofile");
}
dis.close();
dos.close();
} catch (Exception ee) {
ee.printStackTrace();
}
}

}



客户端显示下载完成 但是与源文件大小不同
服务器端显示java.net.SocketException: Connection reset by peer: socket write error
鼓捣了一上午没整出来 求助 小弟谢过
...全文
276 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
K_X_S_ 2012-09-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
源代码如下
客户端代码
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.So……
[/Quote]
问题越发诡异 用debug调试 每从服务器写一次就停一次 执行完后 文件可以完整下载 没有任何问题
但是退出debug后 再用java运行 问题依旧 服务器端仍显示java.net.SocketException
iGoodLoser 2012-09-08
  • 打赏
  • 举报
回复
我电脑上可以运行!
ybyq_xyl 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

引用 1 楼 的回复:
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀

本机的话就不是网络问题,看来是因为写错误造成连接重置,LZ能否贴一下捕获……
[/Quote]
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.DataOutputStream.write(DataOutputStream.java:90)
at com.tarena.day01.FileServer.main(FileServer.java:23)
为啥呢 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀
[/Quote]
本机的话就不是网络问题,看来是因为写错误造成连接重置,LZ能否贴一下捕获SocketException异常的错误信息?
K_X_S_ 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
[/Quote]我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀
K_X_S_ 2012-09-08
  • 打赏
  • 举报
回复
我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀
为啥呢 2012-09-08
  • 打赏
  • 举报
回复
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
hheeyyii 2012-09-08
  • 打赏
  • 举报
回复
应该可以跑,至少正常情况下可以跑,

你检查下防火墙,关掉试试。
K_X_S_ 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

引用 4 楼 的回复:
引用 3 楼 的回复:

引用 1 楼 的回复:
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀

本机的话就不是网……
[/Quote]flush 完也不行
用system.out.println()检查 服务器端传输到一半就抛出异常 而客户端却完整显示了循环次数 但尽管如此 客户端文件大小仍有缺失
K_X_S_ 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
我电脑上可以运行!
[/Quote]你是什么系统 记得以前在linux上运行时也没问题 应该不是系统的问题
为啥呢 2012-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
引用 3 楼 的回复:

引用 1 楼 的回复:
这是连接被重置,原因出在网络连接上,怀疑你下载时网络不稳定,造成传输一半后连接中断。建议当抛出此异常时重新连接。
我这个是在一台机器上实现的客户端和服务器 自己练习用的 然后试了n多次 都没有下载成功 然后代码移植到别人的机器上 都是同样错误 逻辑没有任何问题呀

本机的话就不是网络问题,看来是因为写错误造……
[/Quote]
google了一下,貌似流的问题,每次写完flush一下试试看

62,614

社区成员

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

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