package com.softeem.fileserver;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
File dir = new File("D:\\teach\\express\\J1806\\课程\\part2-java高级\\20180726\\video");
//创建一个服务
ServerSocket ss = new ServerSocket(7777);
System.out.println("Softeem文件服务器已启动...");
while(true){
//监听一个客户端连接
Socket s = ss.accept();
System.out.println("客户端连接:"+s.getInetAddress());
//针对当前产生的Socket开启文件服务
FileService fs = new FileService(s);
//设置目标目录
fs.setDir(dir);
//启动服务
fs.start();
}
}
}
package com.softeem.fileserver;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* 提供文件服务的类(多线程服务)
*/
public class FileService extends Thread{
private Socket s;
private File dir;
public FileService(Socket s){
this.s = s;
}
public void setDir(File dir) {
this.dir = dir;
}
@Override
public void run() {
BufferedInputStream bis = null;
try {
//1.获取目录中的所有文件列表
File[] files = dir.listFiles();
//准备map集合以编号->文件的方式存储文件信息
Map<String,File> map = new HashMap<>();
for(int i = 0;i<files.length;i++){
map.put(String.valueOf(i + 1), files[i]);
}
//2.将文件列表发送到客户端
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
//发送对象到客户端Socket中
oos.writeObject(map);
//3.接收客户端的指令(需要下载的文件编号)
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String no = br.readLine();
//4.根据文件编号找到指定文件并获取该文件的输入流
File target = map.get(no);
bis = new BufferedInputStream(new FileInputStream(target));
//5.获取客户端Socket的输出流将读取的文件内容写出去
//获取基于socket的输出流,向客户端发送文件数据
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
byte[] b = new byte[1024];
int len = 0;
while((len = bis.read(b)) != -1){
bos.write(b, 0, len);
}
bos.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(s != null){
s.close();
}
if(bis != null){
bis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.softeem.fileserver;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException {
//连接到指定地址指定端口服务
Socket s = new Socket("192.168.4.254",7777);
//获取基于Socket的对象输入流(Map)
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
//读取一个对象
Map<String,File> map = (Map<String,File>)ois.readObject();
//获取map集合中的键集
Set<String> keys = map.keySet();
//获取set对象的迭代器
Iterator<String> it = keys.iterator();
//迭代
while(it.hasNext()){
//获取迭代器中的一个元素
String key = it.next();
//根据键获取值
File value = map.get(key);
System.out.println(key+"----"+value.getName());
}
System.out.println("请输入需要下载的文件编号:");
//获取基于控制台标准输入流,读取指令
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String no = br.readLine();
//根据编号或许需要下载的文件的文件名
String fname = map.get(no).getName();
//发送指令到服务器
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println(no);
pw.flush();
//准备本地文件的输出流,存储来自socket的输入流中文件数据
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fname));
byte[] b = new byte[1024];
int len = 0;
System.out.println("开始下载...");
while((len = bis.read(b)) != -1){
bos.write(b,0,len);
}
System.out.println("下载完成!");
s.close();
bos.close();
br.close();
}
}
今天的文章java编写实现网络文件传输功能的方法_java上传文件接口请求分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58349.html