122、(案例)模拟BS案例

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/*
服务器端:实现可以通过浏览器访问
注意:
1、要把web文件夹拷贝到工程和src同一个级别
2、访问网址输入http://127.0.0.1:8080/Day15/web/index.html
3、浏览器解析服务器会写的html页面,如果页面中有图片,那么浏览器就会单独开启一个线程,读取服务器的图片,
每一张图片,就请求一次。所以我们就要让服务器一直处于监听状态,客户端请求一次,服务器就会写一次
 */
public class BSServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8080);

        while(true){
            try{
                Socket accept = ss.accept();
                InputStream inputStream = accept.getInputStream();

                /*int len = 0;
                byte[] bytes = new byte[1024];
                while((len = inputStream.read(bytes)) != -1){
                    System.out.println(new String(bytes,0,len));
                }*/
                //把网络字节输入流对象,转换为字符缓冲输入流
                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                /*把客户端请求信息的第一行读出来,里面包含了请求数据的位置信息,例如:
                 GET /Day15/web/index.html HTTP/1.1 但是该信息里面有一些不必要的信息,我们要进行切割
                 */
                String line = br.readLine();

                //把读取的信息的中间部分取出来,以空格为切割:/Day15/web/index.html
                String[] s = line.split(" ");

                //把路径前面的/去掉,进行截取获得:Day15/web/index.html
                String substring = s[1].substring(1);
                //打印每次请求路径
                System.out.println(substring);

                //一获取的字符串为路径去本地文件获取数据
                FileInputStream fis = new FileInputStream(substring);

                //使用socket中的方法getOutputStream获取网络字节输出outputStream对象
                OutputStream os = accept.getOutputStream();

                /***********  以下三步是固定写法   ********/
                //写入HTTP协议响应头,固定写法
                os.write("HTTP/1.1 200 OK\r\n".getBytes());
                os.write("Content-Type:text/html\r\n".getBytes());
                //必须写入空行,否则浏览器不解析
                os.write("\r\n".getBytes());

                //一读一些复制文件
                int len = 0;
                byte[] bytes = new byte[1024];
                while((len = fis.read(bytes)) != -1){
                    os.write(bytes,0,len);
                }

                //释放资源
                os.close();
                fis.close();
                accept.close();
            }catch (IOException E){
                E.printStackTrace();
            }
        }

        //ss.close();
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值