package com.sets.speedtest.http; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class ServerTest { int port = 8888;//端口号,必须与客户端一致 // 选择进行传输的文件(测试) String filePath = "E:\\img1.png"; Socket client; void start() { try { ServerSocket serverSocket = new ServerSocket(port); while (true) { client = serverSocket.accept(); try { // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。 System.out.println("-----建立socket链接----"); //接受客户端信息 DataInputStream dis = new DataInputStream(new BufferedInputStream(client.getInputStream())); // System.out.println(dis.readLine());//接收文字信息 //接收客户端发送的文件 getMessage(dis); //向客户端发送文件(测试) // setMessage(filePath); dis.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ client.close(); System.out.println("close"); } } } catch (Exception e) { e.printStackTrace(); } } //向客户端发送信息 private void setMessage(String filePath) throws IOException{ File fi = new File(filePath); System.out.println("要发送的文件长度:" + (int) fi.length()); //向客户端发送信息 DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath))); DataOutputStream ps = new DataOutputStream(client.getOutputStream()); //将文件名及长度传给客户端。中文名需要处理 ps.writeUTF(fi.getName()); ps.flush(); ps.writeLong((long) fi.length()); ps.flush(); int bufferSize = 8192; byte[] buf = new byte[bufferSize]; while (true) { int read = 0; if (fis != null) { read = fis.read(buf); } if (read == -1) { break; } ps.write(buf, 0, read); } ps.flush(); fis.close(); System.out.println("-----文件传输完成------"); } //接收客户端发送的信息 private void getMessage(DataInputStream inputStream) { try { //本地保存路径,文件名会自动从服务器端继承而来。 String savePath = "D://android_img/"; File file = new File(savePath); // 创建文件夹 if (!file.exists()) { file.mkdirs(); } int bufferSize = 8192; byte[] buf = new byte[bufferSize]; int passedlen = 0; long len=0; savePath += inputStream.readUTF(); DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath)))); len = inputStream.readLong(); System.out.println("文件的长度为:" + len + "\n"); System.out.println("开始接收文件!" + "\n"+getTime()); while (true) { int read = 0; if (inputStream != null) { read = inputStream.read(buf); } passedlen += read; if (read == -1) { break; } //进度条,如果是大文件,可能会重复打印出一些相同的百分比 System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n"); fileOut.write(buf, 0, read); } //花费的时间 System.out.println("接收完成,文件存为" + savePath + "\n"+getTime()); fileOut.close(); } catch (Exception e) { System.out.println("接收消息错误" + "\n" + e.toString()); return; } } public static String getTime(){ long tmp = System.currentTimeMillis();//花费的时间 SimpleDateFormat formatter = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒"); Date date = new Date(tmp); return formatter.format(date); } public static void main(String arg[]) { System.out.println("-----准备建立socket链接----"); new ServerTest().start(); } }