简介
____最近看Gem5,需要用到Linux系统下的一些回馈,为了简化分析,就想要直接把生成的数据文件下载到本地。搜索了几篇博客,大多是讲将文件从客户端发给云服务器的。我自己学习了一下,并且加以修改,写了一个简单的从服务端向客户端反馈文件的程序。
服务端思路:
服务端通过阻塞式接受请求获得连接,建立线程开始处理此请求。通过文件流的方式传输给客户端,这个过程可以放在对客户端发出的一系列请求之后,各位可以自行添加。
客户端思路:
由于本文是由服务端向客户端发文件,且必定需要收到一个文件,所以只需要在线性执行等待接收文件的过程即可,接收完再关闭连接。相对于服务端,客户端通过写入流,将文件保存到指定目录(若不存在则创建目录)的同名文件。
以下为代码实现
服务端源码
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 文件传输server(由服务器发送)
*
* @author Walskor
* @Date 2020年3月28日
* @version 1.0
*/
public class Transfer_Server extends ServerSocket{
private static final int Server_PORT = 8888; //服务器端口
private ServerSocket server;
public Transfer_Server() throws Exception{
super(Server_PORT);
this.server = this;
}
public static void main(String[] args) {
System.out.println("Server starting...");
try {
Transfer_Server transfer = new Transfer_Server();
transfer.waiting();
if(transfer!=null) {
transfer.close();
}
} catch (Exception e) {
System.out.println("Error: "+ e.getMessage());
}
}
/**
* 等待连接
* @throws Exception
*/
public void waiting() throws Exception{
while(true) {
//当阻塞时接受新的连入请求
Socket client = this.accept();
//并建立新的线程进行处理
new Handler(client);
}
}
}
/**
* 线程处理类
* @author Walskor
*
*/
class Handler implements Runnable{
private String FileURL = null; //文件路径
private Socket socket;
private FileInputStream fileIn;
private DataOutputStream DataOUT;
public Handler(Socket client) {
this.socket = client;
new Thread(this).start();
}
@Override
public void run() {
try {
setFileURL("D:\\DownLoads\\Chrome\\161840230754060.doc ");
sendFile(FileURL