博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java20 创建服务器:ServerSocket
阅读量:7251 次
发布时间:2019-06-29

本文共 6733 字,大约阅读时间需要 22 分钟。

创建服务器:ServerSocketimport 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("\r\n");            }            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语言:超文本标记语言,因为它也是一个文本,实际上就是一个字符串,但是有标签和格式。            第一个表单                
        method:请求方式 get/post              get: 默认方式,数据量小,安全性不高            post:量大,安全性相对高        action:请求的服务器路径        id:编号,前端区分唯一性 ,js中使用        name:名称,后端(服务器)区分唯一性 ,获取值        只要提交数据给后台,必须存在name        
用户名:
密码:
再建立一个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.4HTTP:超文本传输协议,是网络中应用层的协议,建立在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:8888Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36Accept-Encoding: gzip,deflate,sdchAccept-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="\r\n"; 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("HTTP响应示例" + "Hello bjsxt!"); 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(流,用于下载)响应头和响应正文之间必须用\r\n分开。

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4833647.html,如需转载请自行联系原作者

你可能感兴趣的文章
图学ES6-3.变量的解构赋值
查看>>
web3j的maven插件
查看>>
帮你理清React的生命周期
查看>>
堆和堆排序
查看>>
新手也能看懂,消息队列其实很简单
查看>>
全网稀缺的快应用开源项目-熊宝儿歌故事QuickApp
查看>>
【大数据实践】KSQL流处理——如何将多个STREAM输出到一个TOPIC
查看>>
Vue组件通信的几种方式
查看>>
09.Java数据算法
查看>>
git日常使用经验总结
查看>>
ELF文件解析(一):Segment和Section
查看>>
一个由于Function.name造成的兼容性bug
查看>>
比特币钱包隔离认证开发指南
查看>>
《从0到1学习Flink》—— Data Sink 介绍
查看>>
Vue.js 渲染简写样式存在的问题
查看>>
cocos2d-x (js-binding)游戏开发解决方案设计稿
查看>>
改善Python程序的91个建议
查看>>
简单说说 angular.json 文件
查看>>
js-数据运算
查看>>
解决阿里云ECS运行前后台分离项目调用QQ互联导致: redirect uri is illegal(100010)问题...
查看>>