我一直在搜索Google几个小时,试图找出如何通过Java套接字成功发送任何文件。我在网上发现了很多东西,但似乎没有一个对我有用,我终于遇到了对象输出/输入流来在服务器和客户端之间发送文件,到目前为止,我发现它是唯一有效的,但是它似乎只能通过与localhost的连接工作。例如,如果我从另一个网络上的朋友计算机连接到服务器并发送文件失败,则套接字关闭说"读取超时"然后在重新连接后不久,文件永远不会被发送。如果我连接到服务器上的localhost并发送文件它完美地工作。那么问题是什么,我该如何解决呢?
编辑:下面是更新的代码..移动速度非常慢
public synchronized File readFile() throws Exception {
String fileName = readLine();
long length = dis.readLong();
File temp = File.createTempFile("TEMP", fileName);
byte[] buffer= new byte[1000];
int count=0;
FileOutputStream out = new FileOutputStream(temp);
long total = 0;
while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
{
System.out.println(total+" "+length+" "+temp.length()); //Just trying to keep track of where its at...
out.write(buffer, 0, count);
total += count;
}
out.close();
return temp;
}
public synchronized void writeFile(File file) throws Exception {
writeString(file.getName());
long length = file.length();
dos.writeLong(length);
byte[] buffer= new byte[1000];
int count=0;
FileInputStream in = new FileInputStream(file);
long total = 0;
while (total < length && (count = dis.read(buffer, 0, (int)Math.min(length-total, buffer.length))) > 0)
{
System.out.println(total+" "+length); //Just trying to keep track of where its at...
dos.write(buffer, 0, count);
total += count;
}
in.close();
}
客户端和服务器都有writeFile和readFile。目前我正在使用它来发送和显示图像。
答案 0 :(得分:2)
不要使用对象流。使用DataInputStream
和DataOutputStream:
writeUTF()
和readUTF()
发送和接收文件名。发送和接收数据,如下所示:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
您可以在两端使用此代码。 buffer
可以是大于零的任何大小。它不需要是文件的大小,并且不会扩展到大文件。
关闭套接字。
如果您需要发送多个文件,或者还有其他需要保持套接字打开:
使用writeLong()
发送文件前面的长度,并使用readLong()
读取并修改循环,如下所示:
long length = in.readLong();
long total = 0;
while (total < length && (count = in.read(buffer, 0, length-total > buffer.length ? buffer.length : (int)(length-total))) > 0)
{
out.write(buffer, 0, count);
total += count;
}
并且不要关闭套接字。请注意,您必须在读取之前测试total
,并且必须调整读取长度参数,以免超出文件末尾。