import
java.io.*;
import java.net.*;
public class MySend
{
static void sendFile(ObjectOutputStream oos, String filename) throws Exception
{
FileInputStream fis = new FileInputStream(filename);
byte[] buf = new byte[1024]; // 创建缓冲区
oos.writeObject(filename); // 首先把文件名发给对方
oos.flush();
// 打算每次读1024个,最后一次可能不足
while(true){
int n = fis.read(buf); // n 表示实际上读入了多少
if(n>0){
oos.writeInt(n); // 告诉对方本次传送的数据量
oos.write(buf,0,n); // 发送实际的数据
oos.flush();
}
if(n<1024){ // 表示已经没有更多的数据要读,就是已经到了文件尾
oos.writeInt(-1); // 告诉对方本文件的数据发送完毕
oos.flush();
break;
}
}
fis.close();
}
public static void main(String[] args) throws Exception
{
System.out.println("link to
server ....");
Socket skt = new Socket("127.0.0.1", 6789);
System.out.println("连接成功....开始发送文件");
ObjectOutputStream os = new ObjectOutputStream(skt.getOutputStream());
//
测试发送两个文件,第二个文件较大
sendFile(oos, "a.txt");
sendFile(oos, "cat.bmp");
oos.writeObject("end"); // 告诉对方,所有文件都发送完了
oos.flush();
System.out.println("发送完毕");
}
}
----------------------------------------------------------------
import java.io.*;
import java.net.*;
public class MyRecv
{
// 处理一个文件的接收
static void recvOneFile(ObjectInputStream ois, FileOutputStream fos) throws Exception
{
byte[] buf = new byte[1024];
while(true){
int num = ois.readInt(); // 得到下一个数据块的字节数
if(num<0) break;
ois.readFully(buf,0,num); // 不要使用read(),因为它不能保证正好读num个
fos.write(buf,0,num);
}
}
// 接收多个文件
static void recvFiles(ObjectInputStream ois) throws Exception
{
while(true){
String filename = (String)ois.readObject();
if(filename.equals("end")) break; // 如果一个文件的文件名为end就结束
FileOutputStream fos = new FileOutputStream("c:\\" + filename);
recvOneFile(ois, fos);
fos.close();
}
}
public static void main(String[] args) throws Exception
{
System.out.println("server at 6789, listen....");
ServerSocket sskt = new ServerSocket(6789);
Socket skt = sskt.accept();
System.out.println("联接成功.... 正在接收文件");
ObjectInputStream is = new ObjectInputStream(skt.getInputStream());
recvFiles(ois);
System.out.println("接收完毕");
}
}