精华内容
下载资源
问答
  • Java语言有哪些特点?

    万次阅读 2019-08-28 16:05:07
    1)简单性 2)面向对象 3)分布式 4)健壮性 5)安全性 6)体系结构中立 7)可移植性 8)解释型 9)高性能 ...Java的面向对象特性与C++旗鼓相当,Java与C++的主要不同点在于多继承,在Java中,取而代之的...

    1)简单性
    2)面向对象
    3)分布式
    4)健壮性
    5)安全性
    6)体系结构中立
    7)可移植性
    8)解释型
    9)高性能
    10)多线程
    11)动态性

    1.简单性:
    Java语言是C++语言的一个“纯净”版本。没有头文件、指针运算、结构、联合、操作符重载、虚基类等。
    2.面向对象
    面向对象即面向数据。Java的面向对象特性与C++旗鼓相当,Java与C++的主要不同点在于多继承,在Java中,取而代之的是更简单的接口概念。
    3.分布式
    Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就像访问本地文件一样。
    4.健壮性
    Java编写的程序具有多方面的可靠性。Java编译器能够检测许多在其他语言中仅在运行时才能检测出来的问题。
    5.安全性
    Java适用于网络/分布式环境。从一开始,Java程序能够防范各种攻击,其中包括:
    运行时堆栈溢出。
    破坏自己进程空间之外的内存。
    未经授权读写文件。
    6.体系结构中立
    编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要有Java运行时系统,这些编译后的代码可以在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。
    7.可移植性
    例:Java中的int永远为32位的整数,而C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。这样的优点便消除了代码移植的问题。
    8.解释型
    Java解释器可以在任何一只了解释器的机器上执行Java字节码。
    9.高性能
    字节码可以(在运行时刻)动态地翻译成对应运行这个应用特定CPU的机器码。
    10.多线程
    多线程可以带来更好的交互响应和实时行为。如今大家非常关注并发性,我们不在追求更快的处理器,而是更多的处理器,Java是第一个支持并发的主流语言。
    11.动态性
    库中可以自由地添加新方法和实例变量,而对客户段没有任何影响。

    展开全文
  • JavaHTTP协议实现

    2013-06-20 21:57:14
    描述了Java中使用HTTP协议的方式,分别使用了GET方法下载服务端的图片,以及使用POST实现一个登陆操作。
  • java有哪些技术领域

    千次阅读 2018-12-07 23:10:36
    1、Java中间件,分布式系统、分布式缓存...分布式系统-dubbo-spring cloud:一定是多个节点组成的系统,一般一个节点就是一台服务器,节点之间是相互连通协作的,这些连通的节点上部署了我们的组件,共同服务于一...

    1、Java中间件,分布式系统、分布式缓存、消息队列

    JAVA中间件:包括服务框架中间件:解决集群间的访问通信问题。消息中间件:解决应用之间的消息传递、解耦、异步的问题。数据访问中间件:解决应用访问数据库的共性问题。

    分布式系统-dubbo-spring cloud:一定是有多个节点组成的系统,一般一个节点就是一台服务器,节点之间是相互连通协作的,这些连通的节点上部署了我们的组件,共同服务于一个大型系统。比如淘宝网,在对浏览器发送请求的背后,是一个大型的分布式系统为我们服务,整个系统有的负责请求处理,有的负责存储,有的负责计算,最终通过相互的协作把请求的结果返回给浏览器,并呈现给我们。

    分布式缓存 redis-memcached:就是把数据存放在不同的物理机器上,利用分布式缓存中间件进行处理数据。Redis和memcached缓存系统都是以key-value的形式存储和访问数据,在内存中维护一张巨大的HashTable。但是redis比memcached支持的数据类型更多,有五种数据类型:String、Hash、List、Set、ZSet(有序集合)。注意:分布式缓存系统需要用到一致哈希算法,它的的好处在于节点个数发生变化(减少或增加)时无需重新计算哈希值,避免大量key的重新映射,保证数据储存或读取时可以正确、快速地找到对应的节点。

    消息队列(中间件)-MQ:负责消息的收发管理,利用高效可靠的异步消息传递机制集成到分布式系统。五大优点:解耦、异步、横向扩展、安全可靠、顺序保证。常见的有activeMQ(支持多语言,实现jms1.1),RabbitMQ(支持更多语言,基于AMQP规范),kafka(高吞吐量,分布式,分区,O(1)磁盘顺序提供消息持久化)

    2、常用的开源项目框架理解

    Spring

    Spring是轻量级的IoC和AOP的容器框架,是进行对象管理、对象关联、解耦的一个中间层框架。是面向Bean的编程,实现了组件的解耦。

    • IoC(DI)依赖注入实现的技术反射机制工厂模式。其中pring的BeanFactory主要实现步骤如下,
    1. 解析配置文件(bean.xml)
    2. 使用反射机制动态加载每个class节点中配置的类
    3. 为每个class节点中配置的类实例化一个对象
    4. 使用反射机制调用各个对象的seter方法,将配置文件中的属性值设置进对应的对象
    5. 将这些对象放在一个存储空间(beanMap)中
    6. 使用getBean方法从存储空间(beanMap)中取出指定的JavaBean
    • AOP实现的技术: JDK动态代理技术 CGLIB技术(动态字节码增强技术) 。尽管实现技术不一样,但都是基于代理模式 , 都是生成一个代理对象
    1. JDK动态代理技术:主要使用到 InvocationHandler 接口和 java.lang.reflect.Proxy类的newProxyInstance() 方法。通过使用接口,使系统松耦合。
    2. CGLIB(动态字节码增强)技术:是继承被代理对象,然后Override需要被代理的方法。使用继承,代码写起来更简单。

     

    Struts2

    Struts2是基于servlet、MVC设计模式的Web应用框架,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    • Struts2框架采用Filter(StrutsPrepareAndExecuteFilter)作为核心控制器实现。是类级别的拦截,每次请求对应实例一个新的Action,然后调用setter getter方法把request中的数据注入。一个Action对象对应一个request上下文。
    • Struts2流程分析:

    ①当在浏览器中输入相应网址,会加载web.xml中的核心控制器

    ②核心控制器会拦截所有请求,加载struts.xml的配置文件,找到和请求名字相同的action

    ③创建Class属性指定类的对象

    ④执行method属性指定的方法,返回一个字符串结果

    ⑤找Name等于此字符串的result,转到相应页面或action

    ⑥在页面中执行相关代码:通过EL表达式或者OGNL表达式取当前类属性的值

     

    SpringMVC

    SpringMVC是基于Servlet 、MVC设计模式的一个松耦合的web应用框架,使用前端控制器模式来进行设计,再根据请求映射规则分发给相应的后端控制器进行处理。

    • SpringMVC框架采用Servlet作为核心控制器实现。是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去。一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。、
    • 开发效率对比:

    由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2

    • SpringMVC的工作流程如下:
    1. 用户发送请求至前端控制器(DispatcherServlet)
    2. DispatcherServlet收到请求调用处理器映射器(HandlerMapping)
    3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器对象一并返回给DispatcherServlet
    4. DispatcherServlet通过处理器适配器(HandlerAdapter)调用具体的处理器(Controller)
    5. 处理器即后端控制器(Controller)执行具体的业务操作,完成后返回ModelAndView
    6. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    7. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    8. ViewReslover解析后返回具体View
    9. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
    10. DispatcherServlet响应用户

     

    MyBatis

    MyBatis 是一个基于 Java 的 持久层 框架, MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。 把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现。

    MyBatis的特点:

    基于SQL语法,SQL语句封装在配置文件中,便于统一管理与维护。

    自动化程度低、手工映射SQL,灵活程度高。

     

    Hibernate

    Hibernate是优秀的Java 持久化层解决方案、对象-关系映射(ORM)工具、简化了JDBC 繁琐的编码。

    Hibernate特点:

    Hibernate对象-关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。

    编写程序的时候,HQL语句操作,以面向对象的方式处理数据。而保存数据的时候,却以关系型数据库的方式存储。

     

    SpringBoot

    SpringBoot是基于Spring4.0的一套快速搭建Spring框架的整合包。方便对各种框架的整合,让他们集成在一起更加简单,简化了我们在集成过程中的模板化配置。遵循”约定大于配置”,实现零配置。

    特点:

    1.  创建独立的Spring应用程序
    2.  嵌入的Tomcat,无需部署WAR文件
    3.  简化Maven配置
    4.  自动配置Spring
    5.  提供生产就绪型功能,如指标,健康检查和外部配置

     

    微服务

    微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行和部署的架构思想。微服务架构是让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。目的是有效的拆分应用,实现敏捷开发和部署。

    关键思想就是:拆分、单一、独立、组件化。把原本一个庞大、复杂的项目按业务边界拆分一个一个独立运行的小项目,通过接口的方式组装成一个大的项目。

     

    Dubbo

    首先了解一下ESB(企业数据总线):一般采用集中式转发请求,适合大量异构系统集成,侧重任务的编排,性能问题可通过异构的方式来进行规避,无法支持特别大的并发。

    Dubbo(服务注册管理),采用的是分布式调用,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其侧重服务的治理,将各个服务颗粒化,各个子业务系统在程序逻辑上完成业务的编排。是远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)

    其核心部分包含:

    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。

    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    服务注册中心:Zookeeper     服务调用方式: RPC

     

    Spring Cloud

    Spring cloud是基于spring boot以及结合Netflix 相关思想和代码对微服务理念的java实现。提供了一些可以用于快速构建分布式系统通用模式的工具(例如:配置管理、服务注册与发现、断路器、智能路由、微代理、控制总线),在本质上是一种分布式的解决方案。

    五大核心组件:

    1. 服务注册发现 - Netflix Eureka
    2. 配置中心 - spring cloud config
    3. 负载均衡-Netflix Ribbon
    4. 断路器 - Netflix Hystrix
    5. 路由(网关) - Netflix Zuu

    服务注册中心:Netflix Eureka     服务调用方式:REST API

     

    Zookeeper

    ZooKeeper是一种分布式应用程序协调服务,用于管理大型主机。它是集群的管理者,监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

    Zookeeper作用:

    1.命名服务   2.配置管理   3.集群管理   4.分布式锁  5.队列管理

    Zookeeper设计目的:

    1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。

    2.可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。

    3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

    4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。

    5.原子性:更新只能成功或者失败,没有中间状态。

    6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。

     

    Docker

    Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

    总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

    Docker 主要用途。

    (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

    (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

    (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

     

    Redis

    Redis 是一个开源的,基于高级的key-value存储在内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

    Redis优点

    (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

    (2) 支持丰富数据类型,支持string,list,set,sorted set,hash

    (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行;不推荐使用,性能问题。

    (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

     

    Memcached

    Memcached基于一个存储键/值对的hashmap。Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

    • Memcached特征:
    1. 协议简单
    2. 基于libevent的事件处理
    3. 内置内存存储方式
    4. memcached不互相通信的分布式
    • Memcache与Redis的区别都有哪些?    

    1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。

    2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。

    3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

     

    3、远程服务调用 RPC、REST API

    RPC 即远程过程调用(Remote Procedure Call Protocol,简称RPC),像调用本地服务(方法)一样调用服务器的服务(方法)。通常的实现有 XML-RPC , JSON-RPC , 通信方式基本相同, 不同的只是传输数据的格式。

    RPC架构里包含如下4个组件:

    1、 客户端(Client):服务调用方

    2、 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方

    3、 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务

    4、 服务端(Server):真正的服务提供者。

    RPC架构目的是把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题:

    • 服务端提供的服务如何发布,客户端如何发现服务;
    • 如何对请求对象和返回结果进行序列化和反序列化;
    • 如何更高效进行网络通信。

     

    REST 即表述性状态传递(Representational State Transfer,简称REST),是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

    REST通过资源的角度观察网络( 通过HTTP协议定义的通用动词方法(GET、PUT、DELETE、POST) ),以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。

    REST使用HTTP+URI+XML 来实现其要求的架构风格:HTTP协议和URI用于统一接口和定位资源,文本、二进制流、XML、JSON等格式用来作为资源的表述。

    满足REST约束条件和原则的架构或接口,就被称为是RESTful架构或RESTful接口。就像URL都是URI(统一资源标识)的表现形式一样,RESTful是符合REST原则的表现形式。

     

     

    展开全文
  • Java 实现HTTP协议

    千次阅读 2017-10-23 17:32:14
    实例import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels....

    实例

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    import java.util.Iterator;
    
    public class HttpServer {
    
        public static void main(String[] args) throws Exception {
            // 创建ServerSocketChannel,监听8080端口
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.socket().bind(new InetSocketAddress(8080));
            // 设置为非阻塞模式
            ssc.configureBlocking(false);
            // 为ssc注册选择器
            Selector selector = Selector.open();
            ssc.register(selector, SelectionKey.OP_ACCEPT);
            // 创建处理器
            while (true) {
                // 等待请求,每次等待阻塞3s,超过3s后线程继续向下运行,如果传入0或者不传参数将一直阻塞
                if (selector.select(3000) == 0) {
                    continue;
                }
                // 获取待处理的SelectionKey
                Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
    
                while (keyIter.hasNext()) {
                    SelectionKey key = keyIter.next();
                    // 启动新线程处理SelectionKey
                    new Thread(new HttpHandler(key)).run();
                    // 处理完后,从待处理的SelectionKey迭代器中移除当前所使用的key
                    keyIter.remove();
                }
            }
        }
    
        private static class HttpHandler implements Runnable {
            private int bufferSize = 1024;
            private String localCharset = "UTF-8";
            private SelectionKey key;
    
            public HttpHandler(SelectionKey key) {
                this.key = key;
            }
    
            public void handleAccept() throws IOException {
                SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
                clientChannel.configureBlocking(false);
                clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));
            }
    
            public void handleRead() throws IOException {
                // 获取channel
                SocketChannel sc = (SocketChannel) key.channel();
                // 获取buffer并重置
                ByteBuffer buffer = (ByteBuffer) key.attachment();
                buffer.clear();
                // 没有读到内容则关闭
                if (sc.read(buffer) == -1) {
                    sc.close();
                } else {
                    // 接收请求数据
                    buffer.flip();
                    String receivedString = Charset.forName(localCharset).newDecoder().decode(buffer).toString();
    
                    // 控制台打印请求报文头
                    String[] requestMessage = receivedString.split("\r\n");
                    for (String s : requestMessage) {
                        System.out.println(s);
                        // 遇到空行说明报文头已经打印完
                        if (s.isEmpty()) {
                            break;
                        }
                    }
    
                    // 控制台打印首行信息
                    String[] firstLine = requestMessage[0].split(" ");
                    System.out.println();
                    System.out.println("Method:\t" + firstLine[0]);
                    System.out.println("url:\t" + firstLine[1]);
                    System.out.println("HTTP Version:\t" + firstLine[2]);
                    System.out.println();
    
                    // 返回客户端
                    StringBuilder sendString = new StringBuilder();
                    sendString.append("HTTP/1.1 200 OK\r\n");//响应报文首行,200表示处理成功
                    sendString.append("Content-Type:text/html;charset=" + localCharset + "\r\n");
                    sendString.append("\r\n");// 报文头结束后加一个空行
    
                    sendString.append("<!DOCTYPE html>");
                    sendString.append("<html lang=\"en\">");
                    sendString.append("<head>");
                    sendString.append("    <meta charset=\"UTF-8\">");
                    sendString.append("    <title>Title</title>");
                    sendString.append("</head>");
                    sendString.append("<body>");
                    sendString.append("    <h4>hello world! </h4>");
                    sendString.append("</body>");
                    sendString.append("</html>");
    
                    buffer = ByteBuffer.wrap(sendString.toString().getBytes(localCharset));
                    sc.write(buffer);
                    sc.close();
                }
            }
    
            @Override
            public void run() {
                try {
                    // 接收到连接请求时
                    if (key.isAcceptable()) {
                        handleAccept();
                    }
                    // 读数据
                    if (key.isReadable()) {
                        handleRead();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

    测试

    GET: http://localhost:8080

    这里写图片描述

    展开全文
  • Java实现自定义HTTP协议

    千次阅读 2019-06-12 17:08:37
    Java实现HTTP协议 代码: package com.we; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels....

    Java实现自定义HTTP协议

    代码:

    package com.we;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    import java.util.Iterator;
    
    public class HttpServer {
    	public static void main(String[] args) throws IOException {
    		
    		 // 创建 ServerSocketChanne1,监听8080端口
    		 ServerSocketChannel ssc = ServerSocketChannel.open(); 
    		 ssc.socket().bind(new InetSocketAddress(8080));
    		 // 设置为非阻塞模式
    		 ssc.configureBlocking(false);
    		 // 为ssc注册选择器
    		 Selector selector = Selector.open();
    		 ssc.register(selector, SelectionKey.OP_ACCEPT);
    		 // 创建处理器
    		 while (true) {
    			// 等待请求,每次等待阻塞3s,超过3s后线程继续向下运行,如果传入0或者不传参数将直阻塞
    			if (selector.select(3000) == 0) {
    				continue;
    			}
    		    // 获取待处理的 SelectionKey
    			Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
    			
    			while (keyIter.hasNext()) {
    				SelectionKey key  = keyIter.next();
    				// 启动新线程处理SelectionKey
    				new Thread(new HttpHandler(key)).run();
    				// 处理完后, 从待处理的SelectionKey迭代器中移除当前所使用的key
    				keyIter.remove();
    			}
    		 } 
    	}
    	
    	private static class HttpHandler implements Runnable {
    		private int bufferSize = 1024;
    		private String localCharest = "UTF-8";
    		private SelectionKey key;
    		
    		public HttpHandler(SelectionKey key) {
    			this.key = key;
    		}
    		
    		public void handleAccept() throws IOException {
    			SocketChannel clientChannel = ((ServerSocketChannel)key.channel()).accept();
    			clientChannel.configureBlocking(false);
    			clientChannel.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufferSize));
    		}
    		
    		public void handleRead() throws IOException {
    			// 获取channel
    			SocketChannel sc = (SocketChannel)key.channel();
    			// 获取buffer并重置
    			ByteBuffer buffer = (ByteBuffer)key.attachment();
    			buffer.clear();
    			// 没有读到内容则关闭
    			if (sc.read(buffer) == -1) {
    				sc.close();
    			} else {
    				// 接收请求数据
    				buffer.flip();
    				String  receivedString = Charset.forName(localCharest).newDecoder().decode(buffer).toString();
    			    // 控制台打印请求报文头
    				String[] requestMessage = receivedString.split("\r\n");
    				for (String s : requestMessage) {
    					System.out.println(s);
    					// 遇到空行说明报文头已经打完
    					if (s.isEmpty()) {
    						break;
    					}	
    				}
    				
    				// 控制台打印首行信息
    				String[] firstLine = requestMessage[0].split(" ");
    				System.out.println();
    				System.out.println("Method:\t" + firstLine[0]);
    				System.out.println("url:\t" + firstLine[1]);
    				System.out.println("HTTP Version:\t" + firstLine[2]);
    				System.out.println();
    				
    				// 返回客户端
    				StringBuilder sendString = new StringBuilder();
    				sendString.append("HTTP/1.1 200 OK\r\n");// 响应报文首行,200表示处理成功
    				sendString.append("Content-Type:text/html;charset=" + localCharest + "\r\n");
    				sendString.append("\r\n");// 报文头结束后加一个空行
    				
    				sendString.append("<html><head><title>显示报文</title></head></body>");
    				sendString.append("接收到的请求报文是:<br/>" );
    				
    				for (String s : requestMessage) {
    					sendString.append(s + "<br/>");
    				}
    				sendString.append("</body></html>");
    				buffer = ByteBuffer.wrap(sendString.toString().getBytes(localCharest));
    				sc.write(buffer);
    				sc.close();
    			}		
    		}
    
    		@Override
    		public void run() {
    			try {
    				// 接收到连接请求时
    				if (key.isAcceptable()) {
    					handleAccept();
    				}
    				// 读数据
    				if (key.isReadable()) {
    					handleRead();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}			
    		}
    	}
    }
    
    

    我们首先启动程序,然后在浏览器中输入http://localhost:8080/发起请求,这时控制台就会打印如下信息:

    控制台输出:

    GET / HTTP/1.1
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    Cookie: username-localhost-8888="2|1:0|10:1559731820|23:username-localhost-8888|44:ZmI3YWUxN2Y5NGFhNDdjMjg5YzRkNjk5NTMyZDViZjQ=|db2ab862ddca20277b71e254ce930dd60c5ff36dfac213b2f9d1c4916ba39677"; _xsrf=2|9e047beb|520cad25f907324f06794aa09fdac60f|1559182548; username-localhost-8889="2|1:0|10:1559655488|23:username-localhost-8889|44:OTI0NWJiMzMxYjdlNDllODg1Mjg0NjllZTdjMDc2Yzk=|64d0535d8a2ab5016e5c24ac34ca4935e921945c4aad4a39b3cdcb33c6dacd4e"
    Upgrade-Insecure-Requests: 1
    
    Method:	GET
    url:	/
    HTTP Version:	HTTP/1.1
    

    浏览器的显示:
    在这里插入图片描述

    展开全文
  • tr069 协议 java 开发

    热门讨论 2012-05-23 11:43:50
    tr069 协议 java 开发 包括acs与ape的基础知识的研究 1.基于TR069协议的运营商终端管理.pdf 2.TR069协议实现研究.pdf 3.TR-069Amendment2.pdf 4.ACSDemo+for+TR069.rar
  • java技术有哪些优点优势

    万次阅读 2017-04-19 15:52:21
    Java技术下列优点:简单、面向对象、分布式、解释执行、鲁棒、安全、体系结构中立、可移植、高性能、多线程以及动态性。 1. 简单 Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,...
  • sip协议java实现

    2015-07-28 20:41:45
    关于sip协议java实现,对于学习的学者肯定帮助
  • java URL协议处理

    千次阅读 2014-04-02 10:54:42
    URLConnection是一个协议处理器中的一个类,它是表示指向URL所指定的资源的活动连接。...另一个方面是Java协议处理器机制的一部分。所谓的协议处理器就是将处理协议的细节从处理特定数据类型中分离出,会涉及到客
  • 冰河就趁着周末,只用了几个Java类就简单的实现了Http协议,爽!!
  • 环保212协议解析java

    热门讨论 2018-09-13 15:05:02
    eclipse idea 导入可以直接使用,解析环保212协议代码,已经封装好,亲测可用。
  • java实现https协议

    千次阅读 2015-10-23 16:34:26
    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http...
  • java 自定义通讯协议

    千次阅读 2017-07-12 17:58:09
    JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类:  1.java.net.URL:URL资源  2.java.net.URLConnection:各种URL...
  • 通过java发送websocket协议

    万次阅读 2017-10-26 09:14:22
    前段时间完成公司某个软件的自动化发现协议是websocket 特在下面贴出通过java来模拟websocket的请求端   package service.util; import java.net.URI; import java.nio.ByteBuffer; import java.security.cert....
  • Java与网络协议

    千次阅读 2014-08-11 14:23:38
    近期一直在从事通过网络协议从设备上获取数据的
  • Java使用Exchange协议发送邮件

    热门讨论 2013-06-18 17:29:43
    java自身不支持exchange协议的邮件,本示例采用微软官方发布的jar包,解决java程序无法收发exchange协议邮件的问题。
  • java使用TCP协议

    千次阅读 2017-12-18 11:27:58
    使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。 服务器端 import java.io.OutputStream;  ...
  • loadrunner的java vuser协议

    千次阅读 2012-01-06 16:11:13
    这段时间做一个java产品的性能测试。...如果是破解版的loadrunner,需将license换成100,不要用10000那个,否则不支持java。 1,新建 java vuser协议。 init和end里的内容不用做任何修改。因为action里包含了这两
  • Java通过http协议发送Get和Post请求

    万次阅读 多人点赞 2019-07-02 14:21:07
    Java通过http协议发送Get和Post请求 本文是基于Windows 10系统环境,利用MyEclipse构建一个java项目,并通过http协议发送Get和Post请求 Windows 10 MyEclipse 一、准备工作 (1) 下载需要用的工具jar包 二、Post...
  • BACnet 协议栈浅析(Java 版)之 BACnet 协议简介

    千次阅读 热门讨论 2016-12-08 12:33:45
    BACnet 协议是楼宇自动化中的一种常用协议,本节会首先对 BACnet 技术做一个简介,然后将介绍 Java 版的 BACnet 协议栈的学习思路。
  • java socket通信自定义消息协议

    热门讨论 2010-05-26 16:26:34
    java socket通信自定义消息协议,socket以字节码的方式通信传递,客户端与服务器端分别进行转换与解析的过程实现简单的消息协议
  • java实现HTTP协议:POST协议代码实现

    千次阅读 2020-06-16 10:26:59
    本节我们使用代码实现HTTP的POST协议流程。任何HTTP服务器都会支持客户端将文件上传,该功能的实现往往要走POST协议流程。为了使用代码实现该协议,首先...我们先通过抓包的方式了解POST协议数据包的结构,在执行文件
  • 支持OData协议Java jar包

    千次阅读 2017-01-04 10:52:15
    开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful...oData协议被很多平台开发语言多实现了,包括C++,javascript,.NET,Phthon,那么对于Java来说,有哪些Java的开源框架支持OData呢?
  • JT809协议 java 加解密

    2016-08-15 16:16:37
    JT809协议 java 加解密
  • Xmodem和Ymodem 传输协议JAVA实现
  • JAVA 集成ADFS SAML 协议

    千次阅读 2019-05-07 19:42:37
    JAVA 集成ADFS SAML 协议ADFS SAML (Nginx + Tomcat +spring-security-saml)对接方式如下:不仅会给到JAVA 源码 和 对接的文档,还包含 ADFS 的配置图文混合方式。非免费提供如需要请联系: ADFS SAML (Nginx +...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类何不同?Java应用程序与小程序之间那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的...
  • java中使用mqtt协议

    千次阅读 2019-09-22 14:41:03
    MQTT介绍: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点...
  • Java通过Exchange协议发送和接收邮件

    热门讨论 2014-03-14 14:15:01
    本段程序实现java通过exchange协议发送和接收邮件功能。实现了发送邮件、接收未读邮件和已读邮件的功能。采用微软官方提供的EWSJavaAPI_1.2.jar包完成此项功能。
  • java通信协议初步解析

    千次阅读 2010-12-06 22:46:00
    最近看一些资料感觉许多感觉比较混淆。...在传输中应用层的协议及规范主要:RMI(java原生的),用java自身的序列化技术。xml-rpc 用xml+httpBinary-RPC 用二进制+httpsoap,可以说是xml-rpc的一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 640,135
精华内容 256,054
关键字:

java协议有哪些

java 订阅