网络传输的综合案例
1. 文件上传系统
a. 文件上传分析图解
- 【客户端】输入流,从硬盘读取文件数据到程序中;
- 【客户端】输出流,写出文件数据到服务端;
- 【服务端】输入流,读取文件数据到服务端程序;
- 【服务端】输出流,写出文件数据到服务器硬盘中;
- 【服务端】获取输出流,回写数据;
- 【客户端】获取输入流,解析回写数据;
b. 案例实现
i. 服务器端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileUpload_Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9956);
System.out.println("Server is set up ...");
while (true) {
Socket accept = serverSocket.accept();
new Thread(() -> {
try (
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis);
) {
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
OutputStream out = accept.getOutputStream();
out.write("Server accepts upload.".getBytes());
out.close();
bos.close();
bis.close();
accept.close();
System.out.println("Accept is over.");
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileUpload_Server {
public static void main(String[] args) throws IOException {
ExecutorService service = Executors.newFixedThreadPool(2);
ServerSocket serverSocket = new ServerSocket(9956);
System.out.println("Server is set up ...");
while (true) {
Socket accept = serverSocket.accept();
Thread t = new Thread(() -> {
try (
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis);
) {
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
OutputStream out = accept.getOutputStream();
out.write("Server accepts upload.".getBytes());
out.close();
bos.close();
bis.close();
accept.close();
System.out.println("Accept is over.");
} catch (IOException e) {
e.printStackTrace();
}
});
service.submit(t);
}
}
}
ii. 客户端
import java.io.*;
import java.net.Socket;
public class FileUpload_Client {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\80626\\Desktop\\test.png"));
Socket socket = new Socket("localhost", 9956);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
bos.flush();
}
socket.shutdownOutput();
System.out.println("Sending is over.");
InputStream in = socket.getInputStream();
byte[] back = new byte[1024];
in.read(back);
System.out.println(new String(back));
in.close();
socket.close();
bis.close();
}
}
2. 模拟 B\S 服务器
- 模拟网站服务器,使用浏览器访问自己编写的服务端程序,查看网页效果;
a. 案例分析
- 准备页面数据,web 文件夹;
- 我们模拟服务器端,ServerSocket 类监听端口,使用浏览器访问,查看网页效果;
b. 案例实现
- 浏览器工作原理是遇到图片会开启一个线程进行单独的访问,因此在服务器端加入线程技术;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while (true) {
Socket socket = server.accept();
new Thread(new Web(socket)).start();
}
}
}
class Web implements Runnable {
private Socket socket;
public Web(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requst = readWb.readLine();
String[] strArr = requst.split(" ");
System.out.println(Arrays.toString(strArr));
String path = strArr[1].substring(1);
System.out.println(path);
FileInputStream fis = new FileInputStream(path);
System.out.println(fis);
byte[] bytes = new byte[1024];
int len = 0;
OutputStream out = socket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("Content-Type:text/html\r\n".getBytes());
out.write("\r\n".getBytes());
while ((len = fis.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
fis.close();
out.close();
readWb.close();
socket.close();
} catch (Exception ex) {
}
}
}
c. 效果展示
- Console:www.index.html;
- 访问效果: