Go socket编程实践: UDP服务器和客户端实现

在上一篇文章Go socket编程实践: TCP服务器和客户端实现, 我们实现了一个ECHO服务器, 并且也实现了一个客户端来访问服务器。
这篇文章讲解如何实现一个UDP服务器和客户端。
这次我们使用的协议是 RFC 868
此协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的提供了一个32位的数字,是从1900年1月1日午夜到现在的秒数。
RFC 868定义时间协议使用端口37, TCP和UDP协议都可以。

另外还有两个关于时间/日期的RFC协议。
NTP (RFC 1305)是网络时间协议,提供了精确的时间同步。
daytime (RFC 867)在TCP端口13侦听,返回ACSII格式的日期和时间。

阅读全文

Go socket编程实践: TCP服务器和客户端实现

这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端。
服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议。
为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的请求数据发给这个客户端即可,其它什么功能都不做。

首先声明, 我绝对是一个Golang的初学者,十四、五年的编程时间我主要使用Java来做开发,这篇文章主要记录我学习go网络编程的体验。如果你认为这篇文章有错误或者不好的写法,请在回复中添加你的意见。

阅读全文

Java集合总览

这篇文章给出了所有标准的Java集合(Collection)的概要。根据它们不同的属性和使用场景进行了分类。还介绍了在不同的集合类型之间转换的方式。

阅读全文

Kafka和Spring集成实践

本文以单机的环境演示如何将Kafka和Spring集成。
单机的环境最容易搭建, 并且只需在自己的PC上运行即可, 不需要很多的硬件环境,便于学习。 况且,本文的目的不是搭建ZooKeeper的集群环境, 而是重点介绍Kafka和Spring的应用。
具体的软件环境如下:

  • OS: CentOS 6.4
  • Zookepper: zookeeper-3.4.6
  • Kafka: kafka_2.9.1-0.8.2-beta
  • Java: JDK 1.7.0_45-b18
  • Spring:4.0.6

本例子在我的这个环境中运行正常, 全部代码可以到 github 下载。

阅读全文

Java 8 Stream探秘

在现代的Java应用程序中很少不用到集合类和数组。 可以对集合进行增,删,改,插, 统计(聚合aggregate)。 这些操作的概念在SQL操作上也会用到。 但是对集合的操作却没有像SQL那样方便简捷。 为什么我们不能实现一种类似SQL语句一样方便的编程方式呢, 去取代一遍又一遍loop遍历的方式处理集合和数组中的数据?
另外,对于大数据量的集合, 能不能充分利用多核的优势, 并行的处理?
Stream是就是这种处理数据的风格, 一种流式风格。 这种风格在其它语言中也有实现, 比如Javascript (Node.js stream)。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

1
2
3
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+

一个简单的例子:

1
2
3
4
5
6
List<Integer> transactionsIds =
widgets.stream()
.filter(b -> b.getColor() == RED)
.sorted((x,y) -> x.getWeight() - y.getWeight())
.mapToInt(Widget::getWeight)
.sum();

阅读全文

gulp plugins 插件介绍

Gulp是一个构建工具, 功能类似grunt, 以及Java生态圈的ant, maven, gradle等。 其它的javascript生态圈的构建工具可以参考: List of JavaScript Build Tools
它采用了一种流式处理的方式, 编写起来简单直观。 相对于其它javascript构建工具, 母亲啊它的star数是仅次于grunt,流行度还是比较高的。
通过"代码优于配置" (code over configuration), 通过javascript编写构建任务, 充分利用javascript生态圈的组件, 可以实现简单灵活的任务管理。 通过node stream的方式,直接在内存中管道式处理流,不必缓存到硬盘上, 节省构建时间。

Gulp介绍请参考我转载的另一篇文章: Building With Gulp
另外有一篇很好的入门文章: Getting started with gulp, 繁体版, 简体中文硬翻版

从我的实践上来看, gulp要比grunt更好的管理构建过程。 编写简单,条理清晰,功能强大,学习无曲线。

Gulp是基于Node.js构建的,因此Gulp源文件和你用来定义任务的Gulp文件都被写进了JavaScript(或者CoffeeScript)里。 Gulp本身虽然不能完成很多任务,但它有大量插件可用,开发者可以访问插件页面或者在npm搜索gulpplugin或者gulpfriendly就能看到。例如,有些插件可以用来执行JSHint、编译CoffeeScript,执行Mocha测试,甚至更新版本号。现在有大约980个左右的插件可以使用。你可以到http://gulpjs.com/plugins/或者http://npmsearch.com/?q=keywords:gulpplugin查找所需的软件。
面对如此众多的插件, 想要全部了解并灵活运用它们几乎是不可能的事情。 实际开发中多参考别的项目的实现, 根据自己的需求寻找合适的插件, 总结并开发自己的插件, 逐步积累对gulp的认识。

本文列出常用的几个插件, 并在将来的开发中更新此文作为记录文档。 多个插件和grunt的插件功能类似。

阅读全文

java aio 编程

Java NIO (JSR 51)定义了Java new I/O API,提案2000年提出,2002年正式发布。 JDK 1.4起包含了相应的API实现。
JAVA NIO2 (JSR 203)定义了更多的 New I/O APIs, 提案2003提出,直到2011年才发布, 最终在JDK 7中才实现。
JSR 203除了提供更多的文件系统操作API(包括可插拔的自定义的文件系统), 还提供了对socket和文件的异步 I/O操作。 同时实现了JSR-51提案中的socket channel全部功能,包括对绑定, option配置的支持以及多播multicast的实现。

当前很多的项目还停留在JAVA NIO的实现上, 对JAVA AIO(asynchronous I/O)着墨不多。 本文整理了一些关于JAVA AIO的介绍,以及netty对AIO的支持。
以下内容只针对socket的I/O操作, 不涉及对文件的处理。

阅读全文

流量调整和限流技术

最近看到一些限流的文章,特地整理了一下相关的知识。
在早期的计算机领域,限流技术(time limiting)被用作控制网络接口收发通信数据的速率。 可以用来优化性能,减少延迟和提高带宽等。
现在在互联网领域,也借鉴了这个概念, 用来为服务控制请求的速率, 如果双十一的限流, 12306的抢票等。
即使在细粒度的软件架构中,也有类似的概念。 比如Java线程池可以用Bounded queues保存待执行的任务, 一旦超过queue的容量, 线程池可以根据配置的策略处理此请求。

阅读全文