1、服务器端代码
package demo.net;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 下载服务器,采用UDP协议,传送的过程中可能会丢包,导致下载的文件不完整
*/
public class DownloadServer {
// 提供服务
public void service() {
try {
// 创建本机指定端口8289的服务器
DatagramSocket dataSocket = new DatagramSocket(8289);
// 线程池,固定有十个线程
ExecutorService ThreadPool = Executors.newFixedThreadPool(10);
while (true) {// 不断接收来自客户端的请求
byte[] buff = new byte[101];// 文件名长度不超过50
DatagramPacket dataPacket = new DatagramPacket(buff, buff.length);
dataSocket.receive(dataPacket);// 等待接收来自客户端的数据包
// 接收到数据包,开一个线程为该客户服务
ThreadPool.execute(new WorkThread(dataPacket));
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 内部类,为每个客户提供服务
private class WorkThread implements Runnable {
private DatagramPacket packet;
private DatagramSocket dataSocket;
public WorkThread(DatagramPacket packet) {
this.packet = packet;
try {// 创建本机可以端口的DatagramSocket
dataSocket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
}
// 获取可以下载的文件列表传送给客户端
private void showFiles() {
File files = new File("upload_download");
File[] allFile = files.listFiles();// 获取所有文件
StringBuffer message = new StringBuffer();
for (File f : allFile) {
if (f.isFile()) {
message.append(f.getName());
message.append('\n');
}
}
// 构造响应数据包