TCP通信实战案例——模拟BS系统
一、之前的客户端都是什么样的
●其实就是CS架构,客户端实需要我们自己开发实现的。
二、BS结构是什么样的,需要开发客户端吗?
●浏览器访问服务端,不需要开发客户端。
三、实现BS开发
●注意:服务器必须给浏览器响应HTTP协议格式的数据,否则浏览器不识别
四、HTTP响应数据的协议格式:就是给浏览器显示的网页信息
五、TCP通信如何实现BS请求网页信息回来呢?
●客户端使用浏览器发起请求(不需要开发客户端)
●服务端必须按照浏览器的协议规则响应数据。
六、浏览器使用什么协议规则呢?
●HTTP协议
七、具体使用
运行一下
在浏览器中输入网址: IP地址:注册的端口号
回车
public class ServerReaderRunnable implements Runnable{
private Socket socket;
public ServerReaderRunnable(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
// 浏览器 已经与本线程建立了Socket管道
// 响应消息给浏览器显示
PrintStream ps = new PrintStream(socket.getOutputStream());
// 必须响应HTTP协议格式数据,否则浏览器不认识消息
ps.println("HTTP/1.1 200 OK"); // 协议类型和版本 响应成功的消息!
ps.println("Content-Type:text/html;charset=GBK"); // 响应的数据类型:文本/网页
ps.println(); // 必须发送一个空行
// 才可以响应数据回去给浏览器
ps.println("<span style='color:blue;font-size:100px'>你一句春不晚,我就到了真江南 </span>");
ps.close();
} catch (Exception e) {
System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
}
}
}
/**
了解:BS-浏览器-服务器基本了解。
引入:
之前客户端和服务端都需要自己开发。也就是CS架构。
接下来模拟一下BS架构。
客户端:浏览器。(无需开发)
服务端:自己开发。
需求:在浏览器中请求本程序,响应一个网页文字给浏览器显示
*/
public class BSserverDemo {
// 使用静态变量记住一个线程池对象
private static ExecutorService pool = new ThreadPoolExecutor(3,
5, 6, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2)
, Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
try {
// 1.注册端口
ServerSocket ss = new ServerSocket(8080);
// 2.创建一个循环接收多个客户端的请求。
while(true){
Socket socket = ss.accept();
// 3.交给一个独立的线程来处理!
pool.execute(new ServerReaderRunnable(socket));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}