这就是我现在所拥有的。
接收器:
public static void read(Socket socket, ObjectInputStream in) {
try {
String separator = in.readUTF();
while (in.readByte() == -3) {
String path = in.readUTF().replaceAll(separator, System.getProperty("file.separator"));
File file = new File(new File(path).getParent());
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(path);
int b = 0;
while ((b = in.readByte()) != -4) {
fos.write(b);
}
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
发信人:
public static void send(String[] path) {
Socket socket;
try {
socket = new Socket(ip, port);
socket.setKeepAlive(true);
} catch (UnknownHostException e) {
return;
} catch (IOException e) {
return;
}
try {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeUTF(Devbox.getSeparator());
for (String s : path) {
send(s, out);
out.writeByte(-2);
}
out.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void send(String path, ObjectOutputStream out) {
File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
send(path + f.getName(), out);
}
} else {
try {
out.writeByte(-3);
out.writeUTF(path);
FileInputStream fis = new FileInputStream(file);
int b = 0;
while ((b = fis.read()) != -1) {
out.writeByte(b);
}
fis.close();
out.writeByte(-4);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是我在发件人中收到的错误。
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeBlockHeader(ObjectOutputStream.java:1874)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1855)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1895)
at java.io.ObjectOutputStream.writeByte(ObjectOutputStream.java:760)
指向
out.writeByte(b);
成功发送大约25个文件,然后抛出此错误。它抛出的文件每次都不同,但它在大约5个文件的相同范围内。接收器在一个特定文件之后停止,该文件通常是发送者停止的文件之前的一对。它会停止,因为in.readByte()== -3为false。当它发生时,我得到了像-85和16这样的数字。我在另一台计算机上试过它,因为它说了一些关于软件的东西,而且它完全相同。有谁知道为什么会这样?我花了一天时间试图解决这个问题,并且无处可去。非常感谢任何帮助。
答案 0 :(得分:0)
使用BufferedInputStream读取send方法中的FileInputStream。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
while ((b = bis.read()) != -1) {
out.writeByte(b);
}
同时尝试补充BufferedOutputStream
BufferedInputStream bos = new FileOutputStream(path);
int b = 0;
while ((b = in.readByte()) != -4) {
bos.write(b);
}
此外,您需要在文件完成传输时清除连接。
out.flush;
答案 1 :(得分:0)
请阅读此answer,我认为除此之外别无其他任何事情,我也不会在您的代码中看到任何会关闭连接的内容。
来自OTN讨论
WinSock说明:本地网络系统可能发生错误 中止连接。如果WinSock中止已建立,则会发生这种情况 数据重传失败后连接(接收方永远不会 确认在数据流套接字上发送的数据。)
TCP / IP方案:如果本地系统没有,连接将超时 收到发送数据的(ACK)nowledgement。如果a,它也会超时 (FIN)ish TCP数据包未被确认(即使FIN被确认,它也是 如果没有返回FIN,最终会超时。)
似乎WindowsXP似乎发生了更多,似乎也是如此 可能与Windows防火墙设置有关。无论如何突出 重点是中止源自本地机器。