zoukankan      html  css  js  c++  java
  • java20 创建服务器:ServerSocket

    创建服务器:ServerSocket
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 创建服务器,并启动
     */
    public class Server {
        private ServerSocket server;//创建服务器需要ServerSocket类。
    
        public static void main(String[] args) {
            Server server = new Server();//必须创建本类的对象调用该类的方法。
            server.start();
        }
        
        /**
         * 启动服务器方法
         */
        public void start(){        
            try {
                server = new ServerSocket(8888);//服务器启动起来了,
                this.receive();//等待接收客户端的信息,
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 接收客户端
         */
        private void receive(){
            try {
                Socket client =server.accept();//等待客户端的连接,当在浏览器中输入localhost:8888则会进入下面的方法。
                //接收客户端的请求信息
                StringBuilder sb =new StringBuilder();
                String msg =null;
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(client.getInputStream())
                        );
                while((msg=br.readLine()).length()>0){
                    sb.append(msg);
                    sb.append("
    ");
                }
    
                String requestInfo =sb.toString().trim();        
                System.out.println(requestInfo);
                /**下面就是http协议:
                 * 
                 *  GET / HTTP/1.1
                 *  Host: localhost:8888
                    Connection: keep-alive
                    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8
                    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
                    Accept-Encoding: gzip,deflate,sdch
                    Accept-Language: zh-CN,zh;q=0.8
                 */
    
            } catch (IOException e) {
            }
        }
        
        /**
         * 听着服务器
         */
        public void stop(){        
        }
    }
    
    
    
    html语言:超文本标记语言,因为它也是一个文本,实际上就是一个字符串,但是有标签和格式。
    <html>
        <head>
            <title>第一个表单</title>
        </head>
        <body>
            <pre>
            method:请求方式 get/post  
                get: 默认方式,数据量小,安全性不高
                post:量大,安全性相对高
            action:请求的服务器路径
            id:编号,前端区分唯一性 ,js中使用
            name:名称,后端(服务器)区分唯一性 ,获取值
            只要提交数据给后台,必须存在name
            </pre>
            <form method="post" action="http://localhost:8888/index.html">
                用户名:<input type="text" name="uname" id="uname"/>
                密码:<input type="password" name="pwd" id="pwd"/>
                <input type="submit" value="登录"/>
            </form>
        </body>
    </html>
    
    
    再建立一个java程序的服务器,上述表单提交后则会进入下面的Java代码。
    读取数据的第二种方式:用字节数组接收。
    
    private void receive(){
        ServerSocket server = new ServerSocket(8888);
        try {
            Socket client =server.accept();            
            byte[] data=new byte[20480];
            int len =client.getInputStream().read(data);//通过字节一次性读取        
            //接收客户端的请求信息
            String requestInfo=new String(data,0,len).trim();    
            System.out.println(requestInfo);
        } catch (IOException e) {
        }
    }
    
    
    
        
    协议:协议就是规范。
    应用层:HTTP FTP TELNET SNMP DNS 
    传输层:TCP UDP
    网络层:IP
    主机-网络层 以太网 IEEE802.3 令牌环网:IEEE802.4
    HTTP:超文本传输协议,是网络中应用层的协议,建立在tcp、ip的基础上,所以传输的时候就要借助socket,http协议是使用可靠的tcp连接,默认的端口是80,目前最新的版本是1.1,对应的RFC文档是RFC2068,下载网址www.ietf.org/rfc/rfc2068.txt.
    
    常见的HTTP客户端是浏览器,http遵循请求-相应模型(Request-Response)。HTTP协议规定了http客户端和服务器发送接收数据的严格格式。
    浏览器就是http客户端,发送的请求遵循严格的http协议要求的请求格式。
    请求格式如下:
    GET / HTTP/1.1(请求方式)
    Host: localhost:8888
    Connection: keep-alive
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
                    
    http协议规定,请求由3部分组成,分别是:
    -请求方式 URI(统一资源定位符,就是请求的资源名字) http协议版本
    -一系列请求的头信息
    -请求正文(post方式才有,get方式没有)
    请求头信息和请求正文必须有换行,换行符就是区分请求头个请求正文的。
    
    http响应格式:也是由3部分组成。
    -http协议的版本 状态代码 描述(200表示OK,500表示系统内部错误,404表示找不到)
    -响应头(正文长度是字节长度,比如112,表示只有112个字节,浏览器读到112个字节就不读了。)
    -响应正文
    
    
    /**
     * 创建服务器,并启动
     * 1、请求
     * 2、响应
     */
    public class Server3 {
        private ServerSocket server;
        public static final String CRLF="
    ";
        public static final String BLANK=" ";
        public static void main(String[] args) {
            Server3 server = new Server3();
            server.start();
        }
        /**
         * 启动方法
         */
        public void start(){        
            try {
                server = new ServerSocket(8888);
                this.receive();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        /**
         * 接收客户端
         */
        private void receive(){
            try {
                Socket client =server.accept();//此处会阻塞,浏览器中输入http://localhost:8888 即可进入这个方法进行访问。    
                byte[] data=new byte[20480];
                int len =client.getInputStream().read(data);                
                //接收客户端的请求信息
                String requestInfo=new String(data,0,len).trim();    
                System.out.println(requestInfo);
                /*
                 * GET / HTTP/1.1
                Host: localhost:8888
                Connection: keep-alive
                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8
                User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
                Accept-Encoding: gzip,deflate,sdch
                Accept-Language: zh-CN,zh;q=0.8*/
                //响应正文
                StringBuilder responseContext =new StringBuilder();
                responseContext.append("<html><head><title>HTTP响应示例</title>" +
                        "</head><body>Hello bjsxt!</body></html>");
                StringBuilder response =new StringBuilder();
                //1)  HTTP协议版本、状态代码、描述
                response.append("HTTP/1.1").append(BLANK).append("200").append(BLANK).append("OK").append(CRLF);
                //2)  响应头(Response Head)
                response.append("Server:bjsxt Server/0.0.1").append(CRLF);
                response.append("Date:").append(new Date()).append(CRLF);
                response.append("Content-type:text/html;charset=GBK").append(CRLF);
                //正文长度 :字节长度
                response.append("Content-Length:").append(responseContext.toString().getBytes().length).append(CRLF);
                //3)正文之前
                response.append(CRLF);
                //4)正文
                response.append(responseContext);
                System.out.println(responseContext);
                //输出流
                //前面的字符串是按照http响应的格式,所以这里浏览器会识别接收。
                //返回一个流给浏览器,只要这个流中的字符串满足http响应的格式就能被浏览器解析,因为浏览器是http的客户端。
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                bw.write(response.toString());//把response写出去。
                bw.flush();
                bw.close();
            } catch (IOException e) {
            }
        }
        
        /**
         * 听着服务器
         */
        public void stop(){
        }
    }
    
    
    
    HTTP响应分析:
    http应答码由3位数字构成,首位定义了应答码的类型。、
    -1XX 表示收到web浏览器请求,正在进一步处理;
    -2XX 成功
    -3XX 表示请求没有成功,客户必须采取进一步动作;
    -4XX 客户端错误,404没找到
    -5XX 服务器错误,不能完成对请求的处理;
    
    
    响应头:例如服务器类型、日期时间、正文类型、正文长度。
    
    正文类型、正文长度很重要,类型如下:
    Content-type:text/html;charset=GBK(超文本)
    Content-type:text/plain;charset=GBK(普通文本)
    content-type:application/octet-stream(流,用于下载)
    
    响应头和响应正文之间必须用
    分开。
  • 相关阅读:
    Win7中隐藏的上帝模式——GodMode
    C# 中有关 using 关键字
    数据结构 实验三  二叉树
    数据结构 实验二 栈
    指针知识(六):指针的指针
    指针知识(五):指针(pointer)和常量(const)
    指针知识(四):指针数学计算
    指针知识(三):指针与数组
    指针知识(二):指针初始化
    指针知识(一):指针声明
  • 原文地址:https://www.cnblogs.com/yaowen/p/4833647.html
Copyright © 2011-2022 走看看