import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* 服务端:实现接收客户端发送的文件
*
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String filename = null;
String filesize = null;
File file=null;
// 1.创建ServerSocket实例,指定绑定的端口号,并监听次端口
ServerSocket serverSocket = new ServerSocket(8235);
// 2.调用accept()方法开始监听,等待客户端的连接
Socket socket = serverSocket.accept();
System.out.println("***启动服务器,等待连接…………………………");
// 3.读取客户端发送的请求信息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String info=br.readLine() ;
// 4.解析客户端发送的文件信息,正确的,保存文件名以及文件的大小,为下面接收文件内容做准备
int index = info.indexOf("/#");// 查找/#在字符串中的索引位置
String daima = info.substring(0, index);// 获取字符串从0位置-index(不包括)之间的字符串内容
if (!daima.equals("111")) {
System.out.println("服务器收到的文件的协议代码和客户端的文件协议代码不匹配!!");
} else {
System.out.println("文件的协议代码一致!!!");
String infoChild = info.substring(index + 2);
// 获得info字符串的子字符串,该子字符串从指定索引处的字符开始,直到此字符串末尾部分的内容
int indexC = infoChild.indexOf("/#");
filename = infoChild.substring(0, index).trim();// trim忽略前导空白和尾部空白
filesize = infoChild.substring(index + 2).trim();
}
// 将接收到的文件保存在本地
file = new File(filename);
if (!file.exists()) {
file.createNewFile();
} else {
System.out.println("本路径已存在相同文件,进行覆盖");
}
// 5.服务器接收文件内容,并将内容保存到本地文件中
InputStream is1 = socket.getInputStream();// 获取传送文件的字节流
ObjectInputStream ois = new ObjectInputStream(is1);
// long fileSize = Long.parseLong(filesize);//将文件大小转换成有符号的十进制形式
/** 将文件包装到文件输出流对象中 */
FileOutputStream fos = new FileOutputStream(file);
byte[] data = new byte[ois.available()];
// ObjectInputStream的available()方法,读取字节数
int len;
while ((len = ois.read()) != -1) {// ObjectInputStream的read()方法,读取数据字节;如果读取的字节已到达流的末尾,则返回
// -1。
fos.write(data, 0, len);
fos.flush();
}
serverSocket.close();
socket.close();
is.close();
isr.close();
br.close();
is1.close();
ois.close();
fos.close();
}
}
客户端*******************************
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
/**
* 客户端:向服务端发送文件
* 1、建立与服务器端的连接,
* 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器
* 3、循环读取本地文件,将文件打包发送到数据输出流中
* 4、关闭文件,结束传输
*
*/
public static void main(String[] args) throws UnknownHostException, IOException {
String filename=null;
int filesize;
//1.指定要发送的文件,并确保文件存在
File sendfile = new File("C:\\Users\\Lbb\\Desktop\\API.CHM");
if(!sendfile.exists()){
System.out.println("客户端:要发送的文件不存在");
}
//2.创建Socket实例,指定服务器的IP地址和端口号
Socket socket=new Socket("localhost",8235);
//3.向服务器发送文件的协议编码(/#),文件名(/#)和文件大小的信息
FileInputStream fis=new FileInputStream(sendfile);
ObjectInputStream ois=new ObjectInputStream(fis);
filename=sendfile.getName();//获取文件名
filesize=ois.available();//获取文件的字节数(文件大小)
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("111/#"+filename+"/#"+filesize);
pw.flush();
socket.shutdownOutput();
//4.向服务器传送文件的内容
byte[]data=new byte[ois.available()];
int len;
while((len=ois.read())!=-1){
os.write(data, 0, len);
os.flush();
}
socket.close();
fis.close();
ois.close();
os.close();
pw.close();
}
}