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("\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语言:超文本标记语言,因为它也是一个文本,实际上就是一个字符串,但是有标签和格式。
<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="\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("<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(流,用于下载)

响应头和响应正文之间必须用\r\n分开。
复制代码

 


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

相关文章
|
2月前
|
存储 监控 Java
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
30 0
|
2月前
|
监控 算法 Java
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Gauge和Histogram篇)
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Gauge和Histogram篇)
32 0
|
21小时前
|
网络协议 Ubuntu Java
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏
8 0
|
6天前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
33 0
|
9天前
|
弹性计算 运维 Java
Serverless 应用引擎产品使用之在Serverless 应用引擎中,将 Java 应用从 ECS 迁移到 SAE如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
39 2
|
14天前
|
Java 应用服务中间件 PHP
企业Java应用服务器之JBoss7.1与Apahce整合
企业Java应用服务器之JBoss7.1与Apahce整合
|
18天前
|
网络协议 Java Windows
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
101 0
|
26天前
|
安全 Java 应用服务中间件
轻量级奇迹:Java 18迎来迷你Web服务器的时代
轻量级奇迹:Java 18迎来迷你Web服务器的时代
20 0
轻量级奇迹:Java 18迎来迷你Web服务器的时代
|
2月前
|
Java 关系型数据库 MySQL
Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
【2月更文挑战第33天】Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
66 2
|
3月前
|
Java
java上传、下载、预览、删除ftp服务器上的文件
java上传、下载、预览、删除ftp服务器上的文件