原理
客户端读取本地的文件,把文件上传到服务器,服务器在把上传的文件保存到服务器的硬盘上。
代码实现
服务器端:
// 1、创建一个服务器ServerScoket对象,和系统要的指定的端口号
ServerSocket server= new ServerSocket(8887);
// 2、使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
/*
让服务器一直处于监听状态(死循环accept方法)
有个客户端上传文件,就保存一个文件
*/
while(true){
Socket socket = server.accept();
/*
使用多线程技术,提高程序的效率
*/
new Thread(new Runnable() {
@Override
public void run() {
try{
// 3、使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
// 4、判断是否有文件夹存在,不存在则创建
File file = new File("E:\\upload");
if(!file.exists()){
file.mkdirs();
}
// 自定义一个文件命名规则:方知同名文件被覆盖
String fileName="itcast"+System.currentTimeMillis()+new Random().nextInt(9999999)+".jpg";
//5、 创建一个本地字节输出流FileOutPutStream对象,构造方法中绑定要输出的目的地
FileOutputStream fos=new FileOutputStream(file+"\\"+fileName);
// 6、使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
int len =0;
byte[] bytes=new byte[1024];
while ((len = is.read(bytes))!=-1){
//7、使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
fos.write(bytes,0,len);
}
// 8、使用Socket对象中的方法getOutputStream,获取到网络字节输出流outputStream对象
// 9、使用网络字节输出流outputstream独享中的方法write,给客户端回写“上传成功"
socket.getOutputStream().write("上传成功".getBytes());
// 10、释放资源
fos.close();
socket.close();
}catch (IOException e){
System.out.println(e);
}
}
}).start();
}
PS:
- 服务气短启动后将不会关闭,如果需要关闭可以用:server.close();
- File file = new File(“E:\upload”);此处的路径是自定义的,可以根据自己需求而设计
客户端:
//1、创建本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis= new FileInputStream("E:\\FoodHealthWeb\\FoodHealthWeb\\images\\ba1.jpg");
// 2、创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
Socket socket=new Socket("127.0.0.1",8887);
// 3、使用Socket中的方法GetoutputStream,获取网路字节输出流outputStream对象
OutputStream os = socket.getOutputStream();
// 4、使用本地字节输入流FileInputStream对象这的方法read,读取本地文件
int len=0;
byte[] bytes= new byte[1024];
while ((len=fis.read(bytes))!=-1){
// 5、 使用网络字符输出流OutPutStream对象中的方法write,把读取到的文件上传到服务器
os.write(bytes,0,len);
}
socket.shutdownOutput();
//6、使用socket中的方法getInputstream,获取网络字符流Inputstream对象
InputStream is = socket.getInputStream();
// 7、使用网路字符输入流InputStream对象中的方法read读取服务回写的数据
while((len=is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len ));
}
// 8、释放资源(FileInpuStream,socket)
socket.close();
fis.close();
PS:
- Socket socket=new Socket(“127.0.0.1”,8887);此处的host,是服务器端的ip地址,后面的port是端口号,要和服务器端的端口号一致
- 若是在同一台电脑中启动客户端和服务器端,host写127.0.0.1
- 若是在局域网中传递数据的话,host写服务器端的ip地址。(以自己的电脑作为服务器端需要关闭防火墙 ,链接为windows10关闭防火墙的方法~)