精华内容
下载资源
问答
  • 手写服务器完成.pdf

    2020-02-09 20:11:43
    手写服务器简易代码与步骤try { serversocket = new ServerSocket(8870); isRunning = true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System....
  • 手写服务器.zip

    2019-07-27 19:19:30
    手写服务器项目,整个项目包含了java大部分的知识点,可以用来升华对java的理解,以及对以后的网络编程,前端等的学习有一定的帮助
  • 所以,在手写服务器之前,是需要了解这部分内容的。希望这个系列完成后,我们都能有一定的收获。 1. 写一个简单的TCP小程序并启动 package com.zlyx.easy.server; import java.io.IOException; import java.io....

         我们都知道,客户端与服务端之间的连接是基于TCP的可靠传输。所以,在手写服务器之前,是需要了解这部分内容的。希望这个系列完成后,我们都能有一定的收获。

     1. 写一个简单的TCP小程序并启动

    package com.zlyx.easy.server;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class MainServer {
    
    	/**
    	 * server port
    	 */
    	private static int port = 8080;
    
    	public static void main(String[] args) throws IOException {
    		ServerSocket ss = null;
    		try {
    			ss = new ServerSocket(port);
    			while (true) {
    				Socket socket = ss.accept();
    				while (true) {
    					byte[] bytes = new byte[1024];
    					InputStream in = socket.getInputStream();
    					while (in.read(bytes) != -1) {
    						System.out.println(new String(bytes));
    					}
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			ss.close();
    		}
    	}
    }

    2. 下载NetAssist网络调试工具(使用很久了,强烈推介)

    配置好协议类型和端口,点击连接后连接图标变红色。

    3. 发送一条消息,在控制台输出了内容:

    到这里,一个简单的TCP小程序就完成了。

     

     

    展开全文
  • 手写服务器源代码.rar

    2019-07-27 19:06:57
    这是一个简单的登录服务器,很小但是还是可以学习到知识的,一切加油。
  • 一、S02E199_01手写服务器httpserver_封装Response二、S02E200_01手写服务器httpserver_封装Request_method_url三、S02E201_01手写服务器httpserver_封装Request_储存参数_处理中文

    来源:http://www.bjsxt.com/
    一、S02E199_01手写服务器httpserver_封装Response

    <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="name"/>
                密码:<input type="password" name="pwd" id="pass"/>
                兴趣:<input type="checkbox" name="fav" value="0"/>篮球
                <input type="checkbox" name="fav" value="1"/>足球
                <input type="checkbox" name="fav" value="2"/>乒乓球
                <input type="submit" value="登录">
            </form>
        </body>
    </html>
    package com.test.server;
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.util.Date;
    /**
     * 封装响应信息
     */
    public class Response {
        //两个常量
        public static final String CRLF = "\r\n";
        public static final String BLANK = " ";
        //流
        private BufferedWriter bw;
        //正文
        private StringBuilder content;
        //存储头信息
        private StringBuilder headInfo;
        //存储正文长度
        private int len = 0;
    
        public Response(){
            headInfo = new StringBuilder();
            content = new StringBuilder();
            len = 0;
        }
        public Response(OutputStream os){
            this();
            bw = new BufferedWriter(new OutputStreamWriter(os));
        }
        public Response(Socket client){
            this();
            try {
                bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
            } catch (IOException e) {
                headInfo = null;
            }
        }
        /**
         * 构建正文
         */
        public Response print(String info){
            content.append(info);
            len += (info + CRLF).getBytes().length;
            return this;
        }
        /**
         * 构建正文+回车
         */
        public Response println(String info){
            content.append(info).append(CRLF);
            len += (info + CRLF).getBytes().length;
            return this;
        }
    
        /**
         * 构建响应头
         */
        private void createHeadInfo(int code){
            //1)HTTP协议版本、状态代码、描述
            headInfo.append("HTTP/1.1").append(BLANK).append(code).append(BLANK);
            switch(code){
                case 200:
                    headInfo.append("OK");
                    break;
                case 404:
                    headInfo.append("NOT FOUND");
                    break;
                case 500:
                    headInfo.append("Server Error");
                    break;
            }
            headInfo.append(CRLF);
            //2)响应头(Response Head)
            headInfo.append("Server:test Server/0.0.1").append(CRLF);
            headInfo.append("Date:").append(new Date()).append(CRLF);
            headInfo.append("Content-type:text/html;charset=GBK").append(CRLF);
            //正文长度:字节长度
            headInfo.append("Content-type:").append(len).append(CRLF);
            headInfo.append(CRLF);
        }
    
        /**
         * 推送到客户端
         * @throws IOException 
         */
        void pushToClient(int code) throws IOException{
            if(null==headInfo){
                code = 500;
            }
            createHeadInfo(code);
            //头信息+分割符
            bw.append(headInfo.toString());
            //正文
            bw.append(content.toString());
            bw.flush();
            bw.close();
        }
    }
    package com.test.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 创建服务器,并启动
     * 1、请求
     * 2、响应
     */
    public class ServerForResponse2 {
        private ServerSocket server;
    
        public static void main(String[] args) {
            ServerForResponse2 server = new ServerForResponse2();
            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();
    
                byte[] date = new byte[20480];
                int len = client.getInputStream().read(date);
    
                //接收客户端的请求信息
                String requestInfo = new String(date,0,len).trim();     
                System.out.println(requestInfo);
    
                //响应
                Response rep = new Response(client.getOutputStream());
                rep.println("<html><head><title>HTTP响应示例</title>");
                rep.println("</head><body>Hello 你好!</body></html>");
                rep.pushToClient(200);
    
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
        /**
         * 停止服务器
         */
        public void stop(){
    
        }
    }

    二、S02E200_01手写服务器httpserver_封装Request_method_url
    三、S02E201_01手写服务器httpserver_封装Request_储存参数_处理中文

    package com.test.server;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.StringTokenizer;
    /**
     * 封装request
     */
    public class Request {
        //请求方式
        private String method;
        //请求资源
        private String url;
        //请求参数
        private Map<String,List<String>> parameterMapValues;
    
        //内部
        public static final String CRLF = "\r\n";
        private InputStream is;
        private String requestInfo;
    
        public Request(){
            method = "";
            url = "";
            parameterMapValues = new HashMap<String,List<String>>();
            requestInfo = "";
        }
        public Request(InputStream is){
            this();
            this.is = is;
            try {
                byte[] data = new byte[204800];
                int len = is.read(data);
                requestInfo = new String(data,0,len);
            } catch (IOException e) {
                return;
            }
            //分析请求信息
            parseRequestInfo();
        }
    
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        /**
         * 分析请求信息
         */
        private void parseRequestInfo(){
            if((null==requestInfo) || (requestInfo=requestInfo.trim()).equals("")){
                return;
            }
    
            /**
             * ====================================
             * 从信息的首行分解出:请求方式  请求路径  请求参数(get可能存在)
             *   如:GET /index.html?uname=intputUname&pwd=inputPassword HTTP/1.1
             * 
             * 如果为post方式,请求参数可能在最后正文中
             * ====================================
             */
            String paramString = "";//接收请求参数
    
            //1、获取请求方式
            String firstLine = requestInfo.substring(0,requestInfo.indexOf(CRLF));
            int idx = requestInfo.indexOf("/");// /的位置
            this.method = firstLine.substring(0,idx).trim();
            String urlStr = firstLine.substring(idx,firstLine.indexOf("HTTP/")).trim();
            if(this.method.equalsIgnoreCase("post")){//post方式
                this.url = urlStr;
                paramString = requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();
            }else if(this.method.equalsIgnoreCase("get")){//get方式
                if(urlStr.contains("?")){
                    String[] urlArray = urlStr.split("\\?");
                    this.url = urlArray[0];
                    paramString = urlArray[1];//接收请求参数
                }else{
                    this.url = urlStr;
                }
            }
    
            //2、将请求参数封装到Map中
            parseParams(paramString);
        }
        /**
         * 将请求参数封装到Map中
         * @param paramString
         */
        private void parseParams(String paramString){
            //分割,将字符串转成数组
            StringTokenizer token = new StringTokenizer(paramString,"&");
            while(token.hasMoreTokens()){
                String keyValue = token.nextToken();
                String[] keyValues = keyValue.split("=");
                if(keyValues.length == 1){
                    keyValues = Arrays.copyOf(keyValues, 2);
                    keyValues[1] = null;
                }
    
                String key = keyValues[0].trim();
                String value = null==keyValues[1]?null:decode(keyValues[1].trim(),"gbk");
                //分拣,转换成Map
                if(!parameterMapValues.containsKey(key)){
                    parameterMapValues.put(key, new ArrayList<String>());
                }
    
                List<String> values = parameterMapValues.get(key);
                values.add(value);
            }
        }
        /**
         * 解决中文
         * @param value
         * @param code
         * @return
         */
        private String decode(String value,String code){
            try {
                return java.net.URLDecoder.decode(value, code);
            } catch (UnsupportedEncodingException e) {
                //e.printStackTrace();
            }
            return null;
        }
        /**
         * 根据页面的name获取对应的多个值
         */
        public String[] getParameterValues(String name){
            List<String> values = null;
            if( (values=parameterMapValues.get(name))==null ){
                return null;
            }else{
                return values.toArray(new String[0]);
            }
        }
        /**
         * 根据页面的name获取对应的单个值
         */
        public String getParameterValue(String name){
            String[] values = getParameterValues(name);
            if(null==values){
                return null;
            }
            return values[0];
        }
    }
    package com.test.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 创建服务器,并启动
     * 1、请求
     * 2、响应
     */
    public class ServerForResAndReq {
        private ServerSocket server;
    
        public static void main(String[] args) {
            ServerForResAndReq server = new ServerForResAndReq();
            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();
                //请求
                Request req = new Request(client.getInputStream());
    
                //响应
                Response rep = new Response(client.getOutputStream());
                rep.println("<html><head><title>HTTP响应示例</title>");
                rep.println("</head><body>");
                rep.println("欢迎:").println(req.getParameterValue("uname")).println("回来");
                rep.println("</body></html>");
                rep.pushToClient(200);
    
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
        /**
         * 停止服务器
         */
        public void stop(){
    
        }
    }
    展开全文
  • 手写服务器httpserver_准备_Socket入门_htmlJAVA195-196

    来源:http://www.bjsxt.com/
    一、S02E195_01手写服务器httpserver_准备_Socket入门

    package com.test.server;
    
    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;
    
        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();
                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("\r\n");
                    if(null==msg){
                        break;
                    }
                }
                //接收客户端的请求信息
                String requestInfo =sb.toString().trim();       
                System.out.println(requestInfo);
    
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
        /**
         * 停止服务器
         */
        public void stop(){
    
        }
    }
    
    //输出信息:
    GET / HTTP/1.1
    Host: localhost:8888
    Connection: keep-alive
    Cache-Control: max-age=0
    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/31.0.1650.63 Safari/537.36
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8

    二、S02E196_01手写服务器httpserver_准备_html

    1、get方式提交

    <html>
        <head>
            <title>第一个表单</title>
        </head>
        <body>
            <pre>
                method:请求方式 get/post
                    get:默认方式,数据量小,安全性不高
                    post:量大,安全性相对高
                action:请求的服务器路径
                id:编号,前端(用户的浏览器)区分唯一性,js中使用
                name:名称,后端(服务器)区分唯一性,获取值
                只要提交数据给后台,必须存在name
            </pre>
            <form method="get" action="http://localhost:8888/index.html">
                用户名:<input type="text" name="uname" id="name">
                密码:<input type="password" name="pwd" id="pass">
                <input type="submit" value="登录">
            </form>
        </body>
    </html>

    用户请求get出去

    //输出信息:(第一句包含uname=intputUname&pwd=inputPassword)
    GET /index.html?uname=intputUname&pwd=inputPassword 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/31.0.1650.63 Safari/537.36
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8

    2、post方式提交
    (method=”get” 改为method=”post”)

    <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="name">
                密码:<input type="password" name="pwd" id="pass">
                <input type="submit" value="登录">
            </form>
        </body>
    </html>

    修改代码输出post方式的请求

    package com.test.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
     * 创建服务器,并启动
     */
    public class ServerForPost {
        private ServerSocket server;
    
        public static void main(String[] args) {
            ServerForPost server = new ServerForPost();
            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();
                StringBuilder sb =new StringBuilder();
    
                byte[] date = new byte[20480];
                int len = client.getInputStream().read(date);
    
                //接收客户端的请求信息
                String requestInfo = new String(date,0,len).trim();     
                System.out.println(requestInfo);
    
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
        /**
         * 停止服务器
         */
        public void stop(){
    
        }
    }
    
    //输出信息:(最后一句包含uname=intputUname&pwd=inputPassword)
    POST /index.html HTTP/1.1
    Host: localhost:8888
    Connection: keep-alive
    Content-Length: 35
    Cache-Control: max-age=0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Origin: null
    User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
    
    uname=intputUname&pwd=inputPassword
    展开全文
  • 一、S02E197_01手写服务器httpserver_准备_http协议二、S02E198_01手写服务器httpserver_准备_http工具

    来源:http://www.bjsxt.com/
    一、S02E197_01手写服务器httpserver_准备_http协议

    http协议

    HTTP协议简介

    HTTP协议规定

    请求方法

    请求头

    请求正文

    HTTP响应格式

    package com.test.server;
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    /**
     * 创建服务器,并启动
     * 1、请求
     * 2、响应
     */
    public class ServerForResponse {
        private ServerSocket server;
        private static final String CRLF = "\r\n";
        private static final String BLANK = " ";
    
        public static void main(String[] args) {
            ServerForResponse server = new ServerForResponse();
            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();
                StringBuilder sb =new StringBuilder();
    
                byte[] date = new byte[20480];
                int len = client.getInputStream().read(date);
    
                //接收客户端的请求信息
                String requestInfo = new String(date,0,len).trim();     
                System.out.println(requestInfo);
    
                //响应
                StringBuilder responseContext = new StringBuilder();
                responseContext.append("<html><head><title>HTTP响应示例</title>" + 
                        "</head><body>Hello World!</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:test 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);
    
                //输出流
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                bw.write(response.toString());
                bw.flush();
                bw.close();
            } catch (IOException e) {
                //e.printStackTrace();
            }
        }
        /**
         * 停止服务器
         */
        public void stop(){
    
        }
    }

    二、S02E198_01手写服务器httpserver_准备_http工具

    HTTP响应分析

    这里写图片描述

    这里写图片描述

    这里写图片描述

    HTTP工具:HttpWatch——捕捉信息,便于查看请求响应内容

    展开全文
  • JAVA-手写服务器

    千次阅读 2015-03-31 14:04:33
    花了3天时间搞了这么个服务器程序,基于Socket与Thread等JAVA基本东西. 基本知识. HTTP协议,这个是浏览器与服务器交互的"暗语".一般常见的交互方式是Get/Post 下面是请求文件信息Request: GET /index....
  • <?xml version="1.0" encoding="UTF-8" ?> <persons> <person> <name>至尊宝</name> <age>9000</age> </person> <person> <...
  • 手写服务器httpserver_封装分发器_多请求处理_多态_反射JAVA202-204
  • name:名称,后端(服务器)区分唯一性,获取值,只要提交数据给后台(服务器)必须存在 name id:(用户的的浏览器在文档里区分唯一性)前端区分唯一性,js 中。 4、在服务器查看请求正文的数据(演示)
  • 手写TomCat服务器

    2021-04-16 12:42:49
    我们很多时候都想知道Web容器Tomcat是如何工作的?... 通过手写Tomcat服务器,让学员了解服务器的底层代码,方便学员后期的深入学习,而不是停留在表面API的调用层面。   课程讲义截图:  
  • 手写Http服务器

    2018-05-14 15:16:33
    Http协议: 对浏览器客户端 和 服务器端 之间数据传输的格式规范 Http是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断...
  • mywebserver 手写网络服务器 以及整合实现mybatis手写的功能
  • 手写简单的服务器

    2019-07-19 19:34:37
    #手写简单的服务器
  • 手写WebServer服务器

    千次阅读 多人点赞 2019-02-16 21:03:58
    文章目录项目介绍具体实现初步搭建类和结构测试浏览器与服务端的连接服务端的三步曲解析请求处理请求发送响应优化并处理转态码DOM4J读取xml文件结合服务器实战ATM项目心得总结 项目介绍 基于:Java EE、多线程、...
  • http服务器摘要一、什么是http服务器二、如何自己简单实现一个http服务器三、自己实现的http服务器四、Http服务器实现(Java) 摘要 web开发一直是行业热门技术,而要做web程序就离不开http服务器,现在主流的http...
  • 手写基于tcp通信的服务器,巩固和扩展java网络编程技术。 详细介绍内容可以查看我的博客《BS版本的TCP服务器》。 在javaSE中通过浏览器的url访问html页面。实现客户端与服务器端的交互功能。 这只是网络编程的...
  • 自己手写的一个web服务器,实现了304,Cookie和Session。对于初学web服务器的很有帮助
  • Java代码,手写的一个简易服务器,可以实现Tomcat中的一些基本功能。注意:这个里面只有代码,不是一个完整的工程文件
  • 本课程是JavaSE的进阶课程,全程带领...通过手写Web服务器,让学员了解服务器的底层代码,方便学员后期的深入学习,而不是停留在表面API的调用层面。   本课程全程附讲义和源码,部分截图:      
  • 手写一个Tomcat服务器

    2019-05-15 20:19:46
    作为java开发者,都知道Tomcat是一个家户喻晓的Web服务器手写一个Tomcat对我们理解Tomcat的工作原理,还有servlet的执行流程有很大的帮助,下面是我手写一个简要版Tomcat的总结和收获! 首先,先还原Tomcat的本质...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,109
精华内容 14,843
关键字:

手写服务器