一个通过Socket实现的文件传输。
发送端大概的实现是:
try
{
out.writeUTF("??Receive File??"); //通知接收端现在要接收文件
}
catch(Exception e)
{
}
try
{
out.writeUTF(f.getFile()); // f.getFile()是一个文件的字符串
FileInputStream fos = new FileInputStream(F); //F是File类型的,联接f
OutputStream netOut = socket.getOutputStream();
OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));
//创建文件读取缓冲区
byte[] buf = new byte[2048];
int num = fos.read(buf);
while(num != -1){ //是否读完文件
doc.write(buf, 0, num); // 把文件数据写出网络缓冲区
doc.flush(); // 刷新缓冲区把数据写往客户端
num = fos.read(buf); // 继续从文件中读取数据
}
fos.close();
doc.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null, "文件读取或发送错误" , "注意", JOptionPane.ERROR_MESSAGE);
}
接收端大概是:
while(true)
{
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
catch(Exception e){
System.out.println(filename);
System.out.println(e);
break;
}
if(filename.compareTo("??Receive File??") == 0)
{
try
{
filename = in.readUTF();
System.out.println(filename);
}
catch(Exception e){
System.out.println(e);
}
receiveFile(filename, disk);
}
}
public static void receiveFile(String filename, String filedirectory)
{
File file=new File(filedirectory + filename);
try
{
file.createNewFile();
RandomAccessFile raf = new RandomAccessFile(file,"rw");
InputStream netIn = you.getInputStream();
InputStream In = new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据
byte[] buf=new byte[2048];
int num=In.read(buf);
while(num!=(-1)){ //是否读完所有数据
raf.write(buf,0,num);//将数据写往文件
raf.skipBytes(num); //顺序写文件字节
num=In.read(buf); // 继续从网络中读取文件
}
In.close();
raf.close();
}
catch(Exception e){
System.out.println(e);
}
System.out.println(filename + "接收完毕");
}
}这个程序可以接收一次文件,但循环到第二次的时候,在
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
以下这个位置就会出错。抛出一个EOFException异常。可以告诉我怎么解决吗?
发送端大概的实现是:
try
{
out.writeUTF("??Receive File??"); //通知接收端现在要接收文件
}
catch(Exception e)
{
}
try
{
out.writeUTF(f.getFile()); // f.getFile()是一个文件的字符串
FileInputStream fos = new FileInputStream(F); //F是File类型的,联接f
OutputStream netOut = socket.getOutputStream();
OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));
//创建文件读取缓冲区
byte[] buf = new byte[2048];
int num = fos.read(buf);
while(num != -1){ //是否读完文件
doc.write(buf, 0, num); // 把文件数据写出网络缓冲区
doc.flush(); // 刷新缓冲区把数据写往客户端
num = fos.read(buf); // 继续从文件中读取数据
}
fos.close();
doc.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null, "文件读取或发送错误" , "注意", JOptionPane.ERROR_MESSAGE);
}
接收端大概是:
while(true)
{
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
catch(Exception e){
System.out.println(filename);
System.out.println(e);
break;
}
if(filename.compareTo("??Receive File??") == 0)
{
try
{
filename = in.readUTF();
System.out.println(filename);
}
catch(Exception e){
System.out.println(e);
}
receiveFile(filename, disk);
}
}
public static void receiveFile(String filename, String filedirectory)
{
File file=new File(filedirectory + filename);
try
{
file.createNewFile();
RandomAccessFile raf = new RandomAccessFile(file,"rw");
InputStream netIn = you.getInputStream();
InputStream In = new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据
byte[] buf=new byte[2048];
int num=In.read(buf);
while(num!=(-1)){ //是否读完所有数据
raf.write(buf,0,num);//将数据写往文件
raf.skipBytes(num); //顺序写文件字节
num=In.read(buf); // 继续从网络中读取文件
}
In.close();
raf.close();
}
catch(Exception e){
System.out.println(e);
}
System.out.println(filename + "接收完毕");
}
}这个程序可以接收一次文件,但循环到第二次的时候,在
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
以下这个位置就会出错。抛出一个EOFException异常。可以告诉我怎么解决吗?
我的意思就是说,当我读取完文件以后,如果再用
in.readUTF();就会抛出EOFException的异常,不知道为什么。 希望有回帖,不然就太郁闷了!
楼上的好心人,谢谢你,不过我说得很清楚了,
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
} 这个位置会出错,出错的提示信息是EOFException
最常见的做法是每次先发送File的length过去,对方读到length,再发File的话接收端就能严格知道应该读多少length的byte,一直不会多读也就不会碰触到EOF