TCP通信实战:模拟BS系统

1、之前的客户端都是什么样的

  • 其实就是CS架构,客户端是需要我们自己开发实现的

2、BS结构是什么样的,需要开发客户端吗?

  • 浏览器访问服务端,不需要开发客户端

注意:服务端必须给浏览器响应HTTP协议格式的数据,否则浏览器不识别

TCP通信实战:模拟BS系统_第1张图片

 

package com.csdn.d10_bs;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class BSserverDemo {
    public static void main(String[] args) {

        try {
            //1.注册端口
            ServerSocket ss = new ServerSocket(8080);
            //2.创建一个循环接收多个客户端的请求
            while (true) {
                Socket socket = ss.accept();
                //3.交给一个独立的线程来处理!
                new ServerReaderThread(socket).start();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
class ServerReaderThread extends Thread {
    private Socket socket;

    public ServerReaderThread(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=UTF-8");

            ps.println();//必须发送一个空行

            //才可以响应数据回去给浏览器
            ps.println("CSDN");
            ps.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 3、基于线程池BS架构

package com.csdn.d10_bs;

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

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 (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

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=UTF-8");

            ps.println();//必须发送一个空行

            //才可以响应数据回去给浏览器
            ps.println("CSDN");
            ps.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

4、TCP通信如何实现BS请求网页信息回来呢?

  • 客户端使用浏览器发起请求(不需要开发客户端)
  • 服务端必须按照浏览器的协议规则响应数据
  • 浏览器使用什么协议规则呢?   是 HTTP 协议

你可能感兴趣的:(#,网络编程,tcp/ip,服务器,网络协议,BS架构)