我希望有人能够注意到我没注意到的东西。我目前正在为大学的项目开发一个系统,它涉及创建一个可以在彼此之间传输文件的Android应用程序和java程序。在这个特定的用例中,两个程序都知道以下细节:将要发送的文件数,每个文件的大小以及它们将被发送的顺序。
这是我的Android应用程序中的代码:
try {
Socket socket = new Socket(ip, port);
ObjectOutputStream requestStream = new ObjectOutputStream(
socket.getOutputStream());
DataInputStream contentStream = new DataInputStream(
socket.getInputStream());
requestStream.writeObject(request);
byte[] buf;
File saveFile;
for (File f : request.getFiles()) {
saveFile = new File(saveLoc + f.getName());
FileOutputStream outputStream = new FileOutputStream(saveFile);
int count = 0;
buf = new byte[4096];
long length = request.getFileSize(f.getName());
while ((count = contentStream.read(buffer, 0,
(int) (Math.min(buffer.length, length-newFile.length())))) > 0) {
outputStream.write(buffer, 0, count);
outputStream.flush();
}
outputStream.close();
}
contentStream.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这是我的电脑程序中的代码:
try
{
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
DataInputStream syncStream = new DataInputStream(socket.getInputStream());
byte[] buffer;
for(File f : request.getFiles())
{
buffer = new byte[4096];
FileInputStream fileInput = new FileInputStream(f);
int count = 0;
while((count = fileInput.read(buffer)) > -1)
{
output.write(buffer,0,count);
output.flush();
}
fileInput.close();
}
output.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我最初的问题是所有字节都将被发送到Android应用程序并保存到传输队列中的第一个文件,从而产生一个大文件和多个空文件。然后我改变了一些流代码以使用涉及偏移/长度的方法,因为我在另一个线程中读取可能解决我的问题。然而,我当前的问题是,虽然队列中的第一个文件使用正确的字节数写入,但后续项目与它们应该的数量相差很少。我很确定我在偏移/长度部分出错了,但我对套接字编程的经验有限。
另外,这是pc程序中的堆栈跟踪。似乎应用程序在服务器完成数据发送之前关闭套接字。
java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
at com.sebastianmgibbs.QRBeam.pc.controller.ClientTransferController.transfer(ClientTransferController.java:66)
at com.sebastianmgibbs.QRBeam.pc.controller.ClientTransferController.run(ClientTransferController.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)