package BsServersocket;

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

 public class Client {
 /**
  * 模拟BS服务器:
  * 创建BS版本的TCP服务器
  *
  * //1.创建服务器ServerSocket,和系统要指定的端口号
  * //2.使用accept获取到请求的客户端对象(浏览器)
  * //3.使用Socket对下个中的getInputStream,获取到网络字节输入流InputStream对象
  * //4.使用网络字节输入流InputStream对象中的方法read获取客户端的请求信息
  * http://127.0.0.1:8080/文件目录
  * 服务器需要给客户端回写一个html页面(文件)
  * 我们需要读取index_html文件,就必须知道这个文件的地址
  * 这个文件的地址就是请求信息的第一行
  * 可以使用BufferedReader中的方法readLine读取一行
  * new BufferedReader(new InputStreamReader(is)把网络字节输入流转为字符缓冲输入流
  * 使用String类的方法split根据空格切割字符串获取中间部分
  * 使用String的方法subString(1)截取字符串获取到html文件路径
  * 服务器创建本地字节输入流根据获取到的文件路径读取html文件
  * 注意:
  *  写出时先固定写:
  *      //写入HTTP协议响应,固定方法
  *      out.write("HTTP/1.1 200 ok、\r\n".getBytes());
  *      out.write("Content-Type:text/html\r\n".getBytes());
  *      //必须要写入空行,否则浏览器不解析
  *      out.write("\r\n".getBytes());
  * 服务器端使用网络字节输出流把读取到的文件写到客户端
  *不显示图片:
  *  浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独在开启一个线程,读取服务器图片
  *  让服务器一直处于监听状态(while)
  *  使用线程
  *
  */

 public static void main(String[] args) throws IOException {
 //1.创建服务器ServerSocket,和系统要指定的端口号
     ServerSocket serverSocket = new ServerSocket(8080);
 //使用while循环让服务器一直跑
     while (true) {
         //2.使用accept获取到请求的客户端对象(浏览器)
         Socket socket = serverSocket.accept();
 //开启线程
 new Thread(new Runnable() {
     @Override
     public void run() {
         try{
             //3.使用Socket对下个中的getInputStream,获取到网络字节输入流InputStream对象
             InputStream is = socket.getInputStream();
 //4.使用网络字节输入流InputStream对象中的方法read获取客户端的请求信息
 /*byte[] bytes = new byte[1024];
     int len = is.read(bytes);
     String str = new String(bytes);*/
             //使用BufferedReader把网络字节输入流转换为缓冲输入流读取第一行
             BufferedReader br = new BufferedReader(new InputStreamReader(is));
             String s = br.readLine();
             //使用String类的split方法切割得到文件路径
             String[] s1 = s.split(" ");
             //使用String类的subString方法截取
             String htmlpath = s1[1].substring(1);
             //服务器创建本地字节输入流根据获取到的文件路径读取html文件
             FileInputStream fis = new FileInputStream(htmlpath);
             //务器端使用网络字节输出流把读取到的文件写到客户端
             OutputStream ous = socket.getOutputStream();
             //出时先固定写
             //写入HTTP协议响应,固定方法
             ous.write("HTTP/1.1 200 ok、\r\n".getBytes());
             ous.write("Content-Type:text/html\r\n".getBytes());
             //必须要写入空行,否则浏览器不解析
             ous.write("\r\n".getBytes());
             //一读一写回写
             int len = 0;
             byte[] bytes = new byte[1024];
             while ((len = fis.read(bytes)) != -1) {
                 ous.write(bytes, 0, len);
             }
             fis.close();
             socket.close();
         }catch (IOException e){
             e.printStackTrace();
         }

     }
 }).start();

     }

 }
 }

java_网络编程之BS(web案例)的更多相关文章

  1. GO语言的进阶之路-网络编程之socket

    GO语言的进阶之路-网络编程之socket 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是socket; 在说socket之前,我们要对两个概念要有所了解,就是IP和端口 ...

  2. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...

  3. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  4. 网络编程之Socket & ServerSocket

    网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP ...

  5. 网络编程之TCP/IP各层详解

    网络编程之TCP/IP各层详解 我们将应用层,表示层,会话层并作应用层,从TCP/IP五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议,就理解了整个物联网通信的原理. 首先,用户感知到的只 ...

  6. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  7. [深入浅出WP8.1(Runtime)]网络编程之HttpClient类

    12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...

  8. python3网络编程之socketserver

    本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...

  9. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

随机推荐

  1. 依赖背包优化——hdu1561

    傻逼依赖背包的优化 #include<bits/stdc++.h> using namespace std; #define N 205 ]; int head[N],tot,n,m,a[ ...

  2. NX二次开发-UFUN按类型遍历名字获取Tag函数UF_OBJ_cycle_by_name_and_type

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...

  3. NX二次开发-UFUN工程图表格注释section转tag函数UF_TABNOT_ask_tabular_note_of_section

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  4. [DataContract]引用

    项目->右键->添加引用->找到System.Runtime.Serialization 添加之

  5. 把swf反编译成fla的几种方法

    2007年著 第一种方法: 利用IMPERATOR FLA1.63 ,这个软件有演示版 和正式版 , 演示版不能反编译Action Scropt,在利用正式版反编译的过程中有时会丢失Action Sc ...

  6. plugin python was not installed: Cannot download ''

    problem: plugin python was not installed: Cannot download ''........ 1. the first method of resoluti ...

  7. 分享一套高级Java笔试题(实拍高清图)

    分享一套高级Java笔试题 微信群里群友分享的 刚好他在笔试 有些问题不会发到群里求助 如果你最近正好在面试 需要参考需要提升 这套试题或许对你有用 下面是部分分享原图 下面是微信群中群友的热议 非常 ...

  8. 终于,Spring 5.0正式发布了!

    Spring 5.0都有什么新功能? 1.最低要求支持JDK8+, J2EE 7+. 2.移除了一些包.类及方法. 3.核心功能加强:全面应用jdk8并兼容jdk9等. 4.SpringMVC:支持s ...

  9. 【ASP.Net Core】不编译视图文件

    原文:[ASP.Net Core]不编译视图文件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aqtata/article/details/818 ...

  10. Django 分页器模板

    返回链接: djang ORM 分页器模板: class Pagination(object): def __init__(self,current_page,all_count,per_page_n ...