一、模拟B/S服务器
1、B/S结构的模式图解
B/S模式是web的内容,以下是服务器需要给浏览器发送的响应信息,在正式传输数据前,要先写这个。
发送图片:
"HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n"
发送文字时:
"HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n"
2、服务器端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Test服务器 {
public static void main(String[] args) throws IOException {
//创建服务器对象
ServerSocket ss = new ServerSocket(8000);
//在接受浏览器前面写循环 就可以接受多次浏览器访问
while(true) {
//接受浏览器
Socket s = ss.accept();
//接受浏览器发过来的数据
byte[] bys = new byte[1024];
InputStream is = s.getInputStream();
int len = is.read(bys);
String str = new String(bys, 0, len);
//str是浏览器发送过来的信息,其中包含很多内容,我们只想要获取里面的资源名称
String[] arr = str.split(" ");
//切割之后获取1索引的元素就是资源名称
String name = arr[1];
System.out.println(name);
//判断浏览器要访问的资源是否存在
File f = new File("day12/资源" + name); // day12/资源/2.jpg
if (f.exists()) {
//如果存在就把数据发送给浏览器
//输入流(读取本机的数据)
FileInputStream fis = new FileInputStream(f);
//输出流(输出给别人的电脑)
OutputStream os = s.getOutputStream();
//通知浏览器发送的是图片(这个语句大家直接复制就行 这个以后学)
os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
//循环读取数据发送数据
while ((len = fis.read(bys)) != -1) {
os.write(bys, 0, len);
}
//关闭资源
fis.close();
} else {
//如果不存在 就给浏览器显示404文字
OutputStream os = s.getOutputStream();
//先通知浏览器发送的是文字(这个语句大家直接复制就行 这个以后学)
os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
//输出404信息
os.write("404~ 你访问的资源不存在!".getBytes());
}
}
}
}
扩展知识,多线程代码
多线程代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Test服务器多线程 {
public static void main(String[] args) throws IOException, InterruptedException {
//创建服务器对象
ServerSocket ss = new ServerSocket(8000);
//在接受浏览器前面写循环 就可以接受多次浏览器访问
while(true) {
//接受浏览器
Socket s = ss.accept();
//为获取到的这个浏览器开启一个新线程
//在这里使用了Lambda表达式
Runnable r = ()->{
//把整个代码try
try {
//直接在这里写代码
Thread.sleep(3000);
//接受浏览器发过来的数据
byte[] bys = new byte[1024];
InputStream is = s.getInputStream();
int len = is.read(bys);
String str = new String(bys, 0, len);
//str是浏览器发送过来的信息,其中包含很多内容,我们只想要获取里面的资源名称
String[] arr = str.split(" ");
//切割之后获取1索引的元素就是资源名称
String name = arr[1];
System.out.println(name);
//判断浏览器要访问的资源是否存在
File f = new File("day12/资源" + name); // day12/资源/2.jpg
if (f.exists()) {
//如果存在就把数据发送给浏览器
//输入流(读取本机的数据)
FileInputStream fis = new FileInputStream(f);
//输出流(输出给别人的电脑)
OutputStream os = s.getOutputStream();
//通知浏览器发送的是图片(这个语句大家直接复制就行 这个以后学)
os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
//循环读取数据发送数据
while ((len = fis.read(bys)) != -1) {
os.write(bys, 0, len);
}
//关闭资源
fis.close();
} else {
//如果不存在 就给浏览器显示404文字
OutputStream os = s.getOutputStream();
//先通知浏览器发送的是文字(这个语句大家直接复制就行 这个以后学)
os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
//输出404信息
os.write("404~ 你访问的资源不存在!".getBytes());
}
}catch (Exception e){
e.printStackTrace(); //打印异常信息
}
};
Thread t = new Thread(r);
t.start();
}
}
}