HTTP 学习笔记

HTTP 协议、安全、应用

HTTP协议,即Hypertext transfer protocol,是 World Wide Web Consortium和Internet Engineering Task Force合作的结果, 是一种WWW服务器之间通信的数据传输协议, 由请求和相应组成,应用于网页等Web应用。
HTTP默认的端口号为80,HTTPS的端口号为443

主要特点

  • 支持B/S模式:支持不同的认证方式
  • 支持不同的消息类型: Content-Type可以指定
  • HTTP v0.9和v1.0使用非连续连接:限制每次链接只处理一个请求; v1.1使用连续连接:一个连接可以传送多个对象
  • 无状态:协议对于事务没有记忆能力
  • HTTP v1.1起,默认开启Keep-Alive,下次请求继续使用已建立的连接; 可以设置保持时间

Example

  • 请求头域与响应头域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /img/ridox.jpg HTTP/1.1\r\n
HOST: img0.promise.com\r\n
Connection: keep-alive\r\n
\r\n

# 响应
HTTP/1.1 200 ok\r\n
Server: JSPO2/1.0.27\r\n
Connection: keep-alive\r\n
Content-Type:image/gif\r\n
Content-Length: 228\r\n
ETag: "1693457"\r\n
Expires: Fri,18 Jul 2014 05:44:45\r\n
Cache-Control: max-age=604800\r\n
\r\n

请求动作

方法区分大小写,Request Line中是全大写

  • options:服务器返回针对特定资源支持的方法,测试服务请的功能
  • head:^H服务器像^H相应get请求一样返回消息头中的元信息
  • get : 资源请求
  • post:向指定资源发起,可能产生新资源或者资源修改
  • put: 向指定资源位置上传最新内容
  • delete: 让服务器删除URI指定的资源
  • trace: 回显服务器收到的请求,用于测试连接
  • connect: 预留给能够将连接改为管道的代理服务器
  • patch : 用来将局部修改应用于某一资源,添加于规范RFC5789

URL详解

基本格式:schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]

详细例子: http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff

  • schema: http,ftp,https
  • host:IP或者域名
  • port#:使用端口,默认80可以省略
  • url-params
  • query-string
  • anchor

常见使用技巧

  • If-Modified-Since: 请求头,服务器把该时间与文件最后修改时间对比,一致,则返回304, 否则返回200和新的文件内容
  • If-None-Match:请求头,取值为Etag,服务器验证对应的Etag值是否一致,一致,则返回304,否则返回200和新的文件内容
  • Pragma:请求头,取值no-cache,表示服务器必须返回刷新后的文档,即使(代理)服务器已经有了本地拷贝
  • Cache-Control: 取值包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage
    *Authorization:授权信息
    *Range:请求实体的一个或者多个子范围,但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)
    • 表示头500个字节:bytes=0-499
    • 表示第二个500字节:bytes=500-999
    • 表示最后500个字节:bytes=-500
    • 表示500字节以后的范围:bytes=500-
    • 第一个和最后一个字节:bytes=0-0,-1
    • 同时指定几个范围:bytes=500-600,601-999
  • Allow: 服务器支持的请求方法(如Get)
  • Set-Cookie:服务器返回的Cookie;每写入一个,就生成一个Set-Cookie
  • ETag: 配合If-None-Match使用
  • Last-Modified:使用setDataHeader设置
  • Server:服务器软件信息
  • Location:重定向位置,通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。
  • Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计
  • WWW-Authenticate:该响应报头域必须被包含在401(未授权的)响应消息中
  • 保存请求状态的方法:
    • 通过Cookies
    • 通过Session
      • 利用Cookie保存JSESSIONID
      • 使用URL回写
      • 通过表单变量
      • 通过QueryString
  • telnet测试HTTP:
    • telnet www.baidu.com 80

状态码

  • 1** 信息类
    • 100 客户继续发送请求
    • 101 转换HTTP协议版本
  • 2** 响应成功,被理解、接收、接受
    • 200 完成
    • 201 提示知道新文件的URL
    • 202 接受和处理,但处理未完成
    • 203 返回信息不完善
    • 204 请求收到,但返回消息为空
    • 205 服务器已完成请求,用户代理必须复位当前已浏览过的文件
    • 206 服务器已完成了部分用户的get请求
  • 3** 重定向 为了完成指定动作,必须进一步处理
    • 300 请求的资源可在多处获得
    • 301 本网页被永久性转移到另一个URL
    • 302 请求的网页被转移到一个新的URL,但客户仍继续通过原URL访问,新的URL会在response的location中
    • 303 建议客户访问其他URL
    • 304 网页内容未改,缓存继续使用
    • 305 请求的资源必须从服务器指定的地址得到
    • 306 前一版本HTTP中使用的代码,现行版本中不再使用
    • 307 申明请求的资源临时性删除
  • 4** 客户端错误类 请求包含错误语法,或者不能正确执行
    • 400 客户端请求有语法错误,不能被服务器理解
    • 401 请求未授权,这个状态必须与WWW-Authenticate报头一起使用
      • 401.1 未授权,登陆失败
      • 401.2 未授权,服务器配置问题导致登陆失败
      • 401.3 ACL禁止访问资源
      • 401.4 未授权:授权被筛选器拒绝
      • 401.5 未授权:ISAPI或者CGI授权失败
    • 402 保留有效ChargeTo 头响应
    • 403 禁止访问,服务器收到请求,但是拒绝提供服务
      • 403.1 禁止可执行访问
      • 403.2 禁止读访问
      • 403.3 - 禁止访问:禁止写访问
      • 403.4 - 禁止访问:要求 SSL
      • 403.5 - 禁止访问:要求 SSL 128
      • 403.6 - 禁止访问:IP 地址被拒绝
      • 403.7 - 禁止访问:要求客户证书
      • 403.8 - 禁止访问:禁止站点访问
      • 403.9 - 禁止访问:连接的用户过多
      • 403.10 - 禁止访问:配置无效
      • 403.11 - 禁止访问:密码更改
      • 403.12 - 禁止访问:映射器拒绝访问
      • 403.13 - 禁止访问:客户证书已被吊销
      • 403.15 - 禁止访问:客户访问许可过多
      • 403.16 - 禁止访问:客户证书不可信或者无效
      • 403.17 - 禁止访问:客户证书已经到期或者尚未生效
    • 404 客户端连接到服务器,但是服务器无法取得所请求的网页
    • 405 用户在Request Line请求的方法不存在
    • 406 根据用户发送的Accept,请求资源不可访问
    • 407 类似401,用户必须在代理服务器上的到授权
    • 408 客户端没有在用户指定的时间内完成请求
    • 409 对当前的资源状态,请求不能完成
    • 410 服务器上不再用此资源,且无进一步的参考地址
    • 411 服务器拒绝用户定义的Content-Length请求
    • 412 一个或多个请求头字段错误
    • 413 请求的资源大于服务器要求的大小
    • 414 请求的资源URL长于服务器允许的长度
    • 415 请求资源不支持请求项目格式
    • 416 请求包含Range字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
    • 417 服务器不能满足Expect请求头指定的值
  • 5** 服务端错误类 服务器不能正确执行一个正确的请求
    • 500 服务器遇到错误,无法完成请求
      • 500.10 内部复位器错误 ASP错误
      • 500.11 服务器关闭
      • 500.12 服务器重启
      • 500.13 服务器太忙
      • 500.14 应用程序无效
      • 500.15 不允许请求global.asa
    • 501 未实现
    • 502 BadGateway 网关错误
    • 503 由于超载或者停机维护,服务器目前无法使用,一段时间后可能恢复正常
    • 504 GateWay Timeout 服务器作为代理,未及时从上游服务器获得响应
    • 505 Http Version Not Supported

应用

  • 断点续传
    • GET请求支持只请求某个资源的某一部分,Range 指明请求资源范围
    • 206 Partial Content 部分内容响应
    • Content-Range 响应的资源范围
    • 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传
    • 分块请求资源实例
    • Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分
    • Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节
    • 客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的
    • 目前流行的FlashGet和迅雷基本都是这个原理
  • 多线程下载
    • 下载工具开启多个发出HTTP请求的线程
    • 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000
    • 合并每个线程下载的文件
  • http代理
    • 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息
    • 代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器
    • 大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率
    • Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。
    • 主要功能:
      • 突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站;
      • 访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;
      • 突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试;
      • 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;
      • 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击

认证方式

基本认证

  • HTTP请求报头: Authorization
  • HTTP响应报头: 认证失败-》WWW-Authenticate;认证成功返回指定内容
  • Oauth认证:增强版,放在Authorization中的token使用了更强的加密算法
  • 阮一峰讲 Oauth
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 请求服务器使用基本认证保护资源
GET /private/index.html HTTP/1.0
Host: localhost
# 应答
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311
# 客户端加上用户名密码后重新请求,浏览器使用BASE64Encode(UserName:PassWork)生成token
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
# 服务器认证通过,返回请求内容
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476

摘要认证

  • Http1.1开始提供
  • 引入安全增强选项:qop
  • HA1 = MD5(A1) = MD5(username:realm:password)
  • qop = auth or undefined: HA2 = MD5(A2) = MD5(method:digestURI)
  • qop = auth-int : HA2 = MD5(A2) = MD5(method:digetURI:MD5(entityBody))
  • qop = auth or auth-int: response = MD5(HA1:nonce:nonceCount:clientNone:qop:HA2)
  • qop = undefined: reponse = MD5(HA1:nonce:HA2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#客户端请求 (无认证):
GET /dir/index.html HTTP/1.0
Host: localhost
#服务端返回401
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",//认证域
qop="auth,auth-int", //保护质量
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", //服务器密码随机数
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311
#客户端重新发出请求 (用户名 "Mufasa", 密码 "Circle Of Life"):
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001, //请求计数
cnonce="0a4f113b", //客户端密码随机数
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
#服务器响应:
HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984

HTTPS 原理

  • Hypertext Transfer Protocol over Secure Socket Layer: HTTPS的基础上SSL
  • 两种基本加密类型:
    • 对称加密:使用一个密钥,加解密速度快,例子:DES、AES
    • 非对称加密:密钥和公钥成对出现=》密钥加密,公钥解密;公钥加密,密钥解密

Https过程如下:

①客户端发起SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件列表(加密算法及密码长度)

②服务端通过SSL通信,将SSL版本及加密算法版本中的一组发送至客户端.

③服务端发送客户端Certificate报文,报文中包含公开密钥证书.

④客户端验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示;
如果证书受信任,或者用户接受了不受信的证书,客户端会生成一个Pre-master secret的随机密码串,并且通过接受到公钥加密.

⑤服务端会通过私钥解密出Pre-master sercret随机密码串,通过Pre-master sercret解密密发来的握手信息,并验证Hash是否与浏览器发来的一致.之后通过密码加密一段握手信息,发给客户端.

⑥客户端解密并计算握手信息的Hash,如果与Server发来的Hash一致,此时握手过程结束,利用对称加密算法进行加密.

参考地址

Java 简史

Java 8、9、10的新特性

Java 10

JDK 10 发布于 2018年3月20日。主要更新是局部变量推断和垃圾回收及编译算法提高。 JDK 10是个短期的版本,将要于今天九月份发布的JDK 11是个LTS版本。

主要特点:

  • Local variable type inference: 使用初始化语句推段变量类型
  • G1 支持并行化: 提高 worst-case 延迟
  • 优化 class-data sharing
  • 试验版just-in-time compier:Graal
  • Docker awareness:在linux 平台,JVM可以知道 Container-specifi-information
  • 三个新的JVM参数,用户Docker可以控制系统内存
  • jShell REPL tool 启动优化
  • 不可变集合实例化:Set.copyof,Map.copyOf,Collectors类的新方法:toUnmodifiableList/toUnmodifiableSet/toUnmodifableMap
  • GC 接口更新,用于更方便地增加新的collector
  • G1并行化
  • HotSpot支持把对象堆分配到指定的内存设备上
  • Grall
  • JDK 代码库整理
  • application class-data sharing
  • thread-local handshakes?
  • 默认官方根证书

Oracle在下个版本中声明的特性:

Java 9

Java 9发布于2017年9月21日。最重要的更新是Java平台模块系统的引入
IBM Blog

Java平台模块系统

  • Project Jigsaw把模块化开发实践引入到了Java平台
  • 通过jlink工具,创建出只包含所依赖的JDK模块的自定义运行时镜像
  • 模块的重要特征是其工件(artifact)的根目录中包含了一个描述模块的module-info.class 文件(由module-info.java编译),模块的内容包括:
    • 模块导出的包
    • 模块的依赖关系 requires or requires transitive
    • 服务的提供和使用 ServiceLocator or uses or provides with
    • getModule()
  • 工件的格式是JAR文件或者JMOD文件
  • JVM提供了相应的API和模块系统进行交互
1
2
3
4
5
6
module com.mycompany.sample { //模块声明定义
exports com.mycompany.sample;
requires com.mycompany.common;
provides com.mycompany.common.DemoService with
com.mycompany.sample.DemoServiceImpl;
}

Jshell

Jshell提供的功能类似于NodeJS和Python中的Read-Evaluation-PrintLoop 功能。

  • 基本的表达式计算
  • 创建Java 类和方法
  • 执行代码片段
  • 详细介绍请执行 jshell => /help /list

集合、Stream、Optional、进程

  • List.of()\Set.of()\Map.of()\Map.ofEntries()等工厂方法返回不可变集合
  • Stream新增API:filtering、flatMapping todo
  • Optional 类新增API: ifPresentOrElse、or、stream
  • 进程API:接口ProcessHandle可以对原生进程进行管理
  • 平台日志API:System.LoggerFinder 来管理日志记录器实现
1
2
3
4
5
6
public class Main { 
private static final System.Logger LOGGER = System.getLogger("Main");
public static void main(final String[] args) {
LOGGER.log(Level.INFO, "Run!");
}
}
  • Reactive Streams: java.util.concurrent.Flow, 核心接口:
    • Flow.Publisher
    • Flow.Subscriber
    • Flow.Subscription
    • Flow.Processor
  • 变量句柄: VariableHandler java.lang.invoke.VarHandle
  • 改进方法句柄: java.lang.MethodHandles
  • CompletableFuture orTimeout
  • Java8引入的JS引擎Nashorn增强:实现了ES6的新特性
  • IO: readAllBytes,readNBytes,transferTo
  • 新增SHA-3 哈希算法,java.security.SecureRandom生成使用DRBG算法的强随机数
1
2
3
4
5
6
7
8
import org.apache.commons.codec.binary.Hex; 
public class SHA3 {
    public static void main(final String[] args) throws NoSuchAlgorithmException {
        final MessageDigest instance = MessageDigest.getInstance("SHA3-224");
        final byte[] digest = instance.digest("".getBytes());
        System.out.println(Hex.encodeHexString(digest));
    }
}
  • 统一JVM日志: -Xlog控制JVM日志输出的标签、级别、修饰符、输出目标
  • 新增jcmd调用的诊断命令
  • 接口支持私有方法

Java 8

Java 8 发布于2014年3月18日。

  • 函数式接口: @FunctionalInterface
  • Lambda表达式
  • 接口增强:
    • default 修饰的非抽象方法:可以在子类中直接使用
    • 增加静态方法,可以直接通过接口调用
  • Streaming API:实现集合的并行处理和函数式操作,根据操作返回结果的不同,流式操作分为中间操作和最终操作,前者返回流本身,后者返回一特定类型的结果,实现了集合的过滤、排序、映射等
    • stream.sequential() 返回串行流

    • int count= (int) ((Stream) list.stream().sequential()).sorted().count();

    • stream.parallel() 返回并行流

    • int count = (int)((Stream) list.stream().parallel()).sorted().count();

    • 中间操作:filter/sorted/map/distinct/subStream list.stream() .filter((s) -> s.startsWith("s")) .forEach(System.out::println);

    • 终止操作:forEach/toArray/findFirst/anyMatch

  • 注解的更新:
    • 增加了类型注解:ElementType.TYPE_USE/ElementType.TPYE_PARAMETER
    • 使用Checker Framework等第三方工具在编译期检查出运行时错误
    • 支持重复注解:@Repeatable(XX.class)
  • 安全增强:
    • 基于AES的加密算法:PEBWithSHA256AndAES_128
    • 客户端默认启动TLS1.2和TLS1.1、系统属性jdk.tls.client.protocols
    • Keystore增强
    • 支持安全的随机数生成器:SecureRandom.getInstanceStrong
    • JSSE服务端支持SNI
    • 默认禁用安全性差的加密算法:例如DES相关的Kerberos5
  • NIO改进:
    • 改进了java.nio.charset.Charset实现
    • 优化了String.getBytes性能
    • 新增API:BufferedReader.line()/File.lines(Path,Charset)/File.list(Path)/File.walk(Path,int,FileVisitOption)/Find.find(…)
  • 全球化功能:
    • 支持新的Unicode 6.2.0标准
    • 新增日历和本地化API
    • 改进了日期时间的管理
  • IDE:
    • Eclipse Kepler 4.3.2 默认支持Java8

即时通讯框架T-IO学习

t-io学习笔记

常见应用场景

  • IM(官方提供了im例子,含web端)
  • 实时监控
  • 推送服务(已内置API)
  • RPC
  • 游戏
  • 物联网(已有很多案例)
  • 其它实时通讯类型的场景,不一一列举

用t-io做的web im

maven坐标

1
2
3
4
5
<dependency>
<groupId>org.t-io</groupId>
<artifactId>tio-core</artifactId>
<version>1.7.2.v20170705-RELEASE</version>
</dependency>

对开发人员极体贴的内置功能

  • 内置心跳检测
  • 内置心跳发送
  • 各种便捷的绑定API
  • 各种便捷的发送API
  • 一行代码拥有自动重连功能
  • 各项消息统计等功能,全部一键内置搞定,省却各种烦恼

各种传送门

了解代码目录结构

所有工程都是maven工程,后续目录有可能稍有变动,不定期更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
├─bin----------------脚本目录(方便快速操作)
│ clean.bat----------------清空所有工程的target目录
│ clean.sh
│ deploy.bat----------------作者用来发布到maven中心仓库的脚本,放出来主要是供大家参考
│ deploy.sh
│ dist-examples.bat----------------把所有的例子打包到dist目录,方便用户直接执行
│ dist-examples.sh
│ install.bat----------------安装工程到本地仓库
│ install.sh
| start-http-server.bat----------------启动tio-httpserver
│ start-helloworld-client.bat----------------启动helloworld的客户端
│ start-helloworld-client.sh
│ start-helloworld-server.bat----------------启动helloworld的服务端
│ start-helloworld-server.sh
│ start-im-client.bat----------------启动im的客户端
│ start-im-client.sh
│ start-im-server.bat----------------启动im的服务端
│ start-im-server.sh
│ start-showcase-client.bat----------------启动showcase的客户端
│ start-showcase-client.sh
│ start-showcase-server.bat----------------启动showcase的服务端
│ start-showcase-server.sh
├─docs
│ │
│ ├─blog----------------本人博客草稿(大部分博客是在线编辑,所以此处就没有了)
│ │
│ ├─performance----------------一些性能测试截图(随着版本的增多,有些截图已经过时,但仍保留)
│ │
│ ├─release----------------新版本发布时的log
│
├─dist----------------成品
│ └─examples----------------用t-io写的例子成品
│ ├─helloworld
│ │ ├─client----------------helloworld的客户端
│ │ └─server----------------helloworld的服务端
│ ├─im
│ │ ├─client----------------im的客户端
│ │ └─server----------------im的服务端
│ └─showcase
│ ├─client----------------showcase的客户端
│ └─server----------------showcase的服务端
└─src
├─core----------------t-io的核心代码
├─zoo----------------t-io的生态圈
│ ├─http----------------用t-io实现的http服务器
│ ├─websocket----------------用t-io实现的websocket服务器
├─example----------------用t-io写的例子的源代码
│ ├─parent----------------例子的maven parent
│ ├─helloworld----------------helloworld的源代码
│ │ ├─client
│ │ ├─common
│ │ └─server
│ ├─im----------------im的源代码
│ │ ├─client
│ │ ├─common
│ │ └─server
│ └─showcase----------------showcase的源代码,这个例子是为了帮助用户学习t-io专门写的
│ ├─client
│ ├─common
│ └─server
└─parent----------------maven工程的parent

学习万能的helloworld例子

花30分钟看一下t-io官方提供的helloworld,了解一下TCP编程的大概流程,文档传送门: t-io的hello world

学习用于进阶的showcase例子

showcase一词是从springside借来的,放这很应景,天蓬元帅就是这样学习的,可以和他交流,他后面会出详细的教程。

InAction

  • 执行测试用例失败: mvn -Dmaven.test.skip=false -Dtest=DemoTest -DfailIfNoTests=false test

HuTool

提供常用的工具,设计哲学:

  • 方法优于对象,使用静态方法,无需创建对象
  • 自动识别优于用户定义
  • 适配器模式: 最大范围的做到兼容
  • 可选依赖: jar都是optional的,使用者需要自己添加依赖

常用工具推荐

  • WatchMonitor:跟踪一个文件,监听其变化
  • 配置文件加载工具:ClassPathResource

列一下推荐的国产开源软件

  1. https://www.oschina.net/p/weixin-java-tools-new (使用一年)
  2. http://layim.layui.com(2017年5月11号开始使用)
  3. https://www.oschina.net/p/ztree (使用五年以上吧)
  4. https://www.oschina.net/p/echarts (使用两年以上吧)
  5. http://git.oschina.net/tywo45/talent-validate (使用十年了,开源出来有五年以上吧,原来是博客开源,现在移到开源中国了)
  6. https://www.oschina.net/p/hutool(懒 人必备,强烈推荐,使用两个月)
  7. https://www.oschina.net/p/t-io(使用五年了,开源出来半年)
  8. https://www.oschina.net/p/druid(使用三年以上吧)
  9. https://www.oschina.net/p/dubbo(使用两年)
  10. https://git.oschina.net/jfinal/jfinal-weixin(使用一年左右)
  11. https://www.oschina.net/p/fastjson(使用三年以上)