wucao / xxg-blog-message-board Goto Github PK
View Code? Open in Web Editor NEW博客评论
博客评论
https://xxgblog.com/2014/03/07/jetty-embed/
Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty。 下面介绍如何在Java应用程序中嵌入Jetty。 Jetty下载地址,本文写作时的最新版本是9.1.2,下载jetty-distribution-9.1.2.v20140210.zip: http:/
https://xxgblog.com/2014/07/03/java-protobuf/
Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。 这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差。类似的还有json、Java的Serializable等。 protobuf支持各种语言。本文以Java为例,简单介绍protobuf如何使用。其
https://xxgblog.com/2013/09/15/java-bitmask/
在Java中,位运算符有很多,例如与(&)、非(~)、或(|)、异或(^)、移位(<<和>>)等。这些运算符在日常编码中很少会用到。 在下面的一个例子中,会用到位掩码(BitMask),其中包含大量的位运算。不只是在Java中,其他编写语言中也是可以使用的。 例如,在一个系统中,用户一般有查询(Select)、新增(Insert)、修改(Update)、删除(Del
https://xxgblog.com/2014/03/24/struts2-ajax/
Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的。 所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml、json等结构化的数据,还可能是一个简单的字符串。 所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也
https://xxgblog.com/2017/02/27/mina-netty-twisted-11/
什么是SSL/TLS不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。SSL/TLS协议就是为了解决这些安全问题而设计的。SSL/TLS协议位于TCP/IP协议之上,各个应用层协议之下,使网络传输的内容通过加密算法加密,并且只有服务器和客户端可以加密解密,中间人即使抓到数据包也无法解密获取传输的内容,从而避免安全问题。例如广泛使用的HTTP
https://xxgblog.com/2014/02/24/apache-ftpserver-embed/
Apache FtpServer是一个纯Java实现的FTP服务器,基于大名鼎鼎的网络框架apache MINA实现。它既可以作为一个完整的FTP服务器单独使用,也可以在Java程序中调用,类似于Jetty可以作为嵌入式的HTTP服务器。 下面介绍如何在Java中启动FTP服务器。 Apache FtpServer下载地址,目前最新版是1.0.6: http://mina.apache.org/f
https://xxgblog.com/2014/11/07/linux-tigase/
Tigase是一个基于Java开发的XMPP服务器,类似于Openfire,可用于搭建一个即时通讯(Instant Messaging,简称IM)的平台。 准备在安装Tigase之前,首先需要准备Java环境以及数据库(本文使用MySQL)。 Tigase下载:https://projects.tigase.org/projects/tigase-server/files 本文下载的是tigase
https://xxgblog.com/2014/08/11/tomcat-comet-web-chat/
首先,无图无真相,先上图:这是一个基于Comet实现的聊天室Demo,功能类似于QQ群聊。聊天过程中如果有新想消息,那么就需要服务器推送消息到浏览器,所以这里可以使用Comet技术。 Comet一般有两种实现方式:长轮询(long-polling)、流(streaming)。而本文中的这个Demo的实现方式是基于流(streaming),前端使用了一个隐藏的iframe,这也是比较常用的一种方式。
https://xxgblog.com/2016/09/23/maven-repo-github-qiniu-upyun/
在上一篇博文中,主要介绍了Maven仓库搭建原理,除了Nexus外,随意使用一个HTTP服务器,例如Tomcat或Nginx,都可搭建一个自己的Maven仓库。 无论是用Nexus还是HTTP服务器搭建Maven仓库,总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nexus一般是公司用的比较多,个人不推荐使用。本文就是介绍一些适合个人搭建Maven仓库的方式,相对来说比Nexu
https://xxgblog.com/2013/05/16/java-thread-safe/
ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线程安全的,Vector是线程安全的;HashMap是非线程安全的,HashTable是线程安全的;StringBuilder是非线程安全的,StringBuff
https://xxgblog.com/2015/12/22/nodejs-async-mysql/
由于JavaScript语言异步特性,在使用Node.js执行很多操作时都会使用到回调函数,其中就包括访问数据库。如果代码中的业务逻辑稍微复杂一点,回调一层层嵌套,那么代码很容易进入Callback Hell,无论对写代码的人还是阅读代码的人,都是精神上的折磨。 例如对MySQL的一个事务操作,插入一条posts并插入一条log:1234567891011121314151617181920212
https://xxgblog.com/2015/10/23/wagon-maven-plugin/
通常情况下,程序开发完成后部署到线上Linux服务器,可能需要经历打包、将包文件传到服务器、SSH连上服务器、敲命令启动程序等一系列繁琐的步骤。实际上这些步骤都可以通过Maven的一个插件wagon-maven-plugin来自动完成。 文件上传到服务器Maven项目可使用mvn package指令打包,打包完成后包位于target目录下,要想在远程服务器上部署,首先要将包上传到服务器。 在项目的
https://xxgblog.com/2014/10/12/mina-netty-twisted-9/
用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax、jQuery的动画等。1234$.get(url, function() { doSomething1(); // (3)}); // (1)doSomething2(); // (2) 上面的代码是jQuery的Ajax,由于Ajax是异步的,所以
https://xxgblog.com/2016/09/29/spring-session-redis/
通常情况下,Tomcat、Jetty等Servlet容器,会默认将Session保存在内存中。如果是单个服务器实例的应用,将Session保存在服务器内存中是一个非常好的方案。但是这种方案有一个缺点,就是不利于扩展。 目前越来越多的应用采用分布式部署,用于实现高可用性和负载均衡等。那么问题来了,如果将同一个应用部署在多个服务器上通过负载均衡对外提供访问,如何实现Session共享? 实际上实现Se
https://xxgblog.com/2017/06/23/jetty-tomcat-nginx-proxy-config/
问题Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的域名、协议、端口都是Nginx访问Web应用时的域名、协议、端口,而非客户端浏览器地址栏上的真实域名、协议、端口。 例如在某一台IP为10.4.64.22的服务器上,Jetty或者Tomcat端口
https://xxgblog.com/2014/03/12/struts2-thinkphp/
ThinkPHP是PHP的一个MVC开源框架,Struts 2是Java的MVC开源框架。虽然编程语言不同,但是他们都是解决同样的问题。 用过ThinkPHP的同学应该都知道,ThinkPHP是一个非常简单的框架,使用起来很舒服。相对来说Struts 2则没有这么简单。 本文介绍如何配置Struts 2,让它使用起来像ThinkPHP一样简单。 在介绍Struts 2之前,首先了解一下ThinkP
https://xxgblog.com/2018/08/30/dbutils-spring/
Commons DbUtils是Apache提供的一个对JDBC进行简单封装的开源工具类库,能够简化JDBC相关的开发。Commons DbUtils可以非常方便的整合Spring Framework,比较轻量级,执行SQL语句非常方便(特别是查询语句),可以代替Spring JdbcTemplate、MyBatis等数据库访问层技术。 配置DbUtils通过QueryRunner类来执行SQL,
https://xxgblog.com/2014/07/16/java-protobuf-extend/
在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。 1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展: Example.proto: 12345678910// 定义一个message BaseData,100~199之间的tag可供扩展message BaseData { requi
https://xxgblog.com/2015/09/06/spring-security-start/
在使用Spring Security配置Web应用之前,首先要准备一个基于Maven的Spring框架创建的Web应用(Spring MVC不是必须的),本文的内容都是基于这个前提下的。 pom.xml添加依赖除了Spring框架本身的一些依赖包,还需要在pom.xml中添加Spring Security的依赖包:12345678910<dependency> <group
https://xxgblog.com/2014/08/25/mina-netty-twisted-4/
在前面的博文中,介绍一些消息分割的方案,以及MINA、Netty、Twisted针对这些方案提供的相关API。例如MINA的TextLineCodecFactory、PrefixedStringCodecFactory,Netty的LineBasedFrameDecoder、LengthFieldBasedFrameDecoder,Twisted的LineOnlyReceiver、Int32Str
https://xxgblog.com/2018/10/12/x-forwarded-for-header-trick/
问题背景在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。 如何获取客户端IP在Java中,获取客户端IP最直接的方式就是使用request.getRemoteAddr()。这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网Web应用很少会将应用服务器直接对外提供服务,一
https://xxgblog.com/2016/05/05/maven-profile-antrun/
在Java项目中通常会有各种配置文件,例如有xml、properties。在不同的环境下配置文件的内容可能会不一样,例如正式环境、测试环境、开发环境连的不是同一个数据库,访问的接口不一样,或者日志的级别不同。如果每次部署不同环境时都要改配置文件的各种配置是非常麻烦的。在这种情况下,可以将这些配置文为每个环境复制一个,分别配置不同的内容,打包部署时不同环境的包中打入对应的配置文件。下面是一个通过Ma
https://xxgblog.com/2014/08/22/mina-netty-twisted-3/
在上一篇博文中,有介绍到用换行符分割消息的方法。但是这种方法有个小问题,如果消息中本身就包含换行符,那将会将这条消息分割成两条,结果就不对了。 本文介绍另外一种消息分割方式,即上一篇博文中讲的第2条:use a fixed length header that indicates the length of the body,用一个固定字节数的Header前缀来指定Body的字节数,以此来分割消息
https://xxgblog.com/2015/01/30/jetty-session-storage/
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录、购物车等。 Session一般情况下是保存在服务器内存中。如果服务器重启,Session就会丢失。另外,如果是集群环境,Web应用部署在多台服务器上,Session如果保存在各自的服务器上,就无法共享了。 针对这个问
https://xxgblog.com/2015/01/13/strophe-xmpp/
XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件、网络游戏聊天、Web聊天及Web消息推送、移动设备的消息推送等场景,例如Google的GTalk、《英雄联盟LOL》游戏聊天模块。 由于在Web浏览器上的JavaScript不能直接处理TCP协议,所以XMPP服务器通常会
https://xxgblog.com/2013/07/01/java-thread-wait/
123456789101112public class TestThread extends Thread { public void run() { System.out.println(this.getName() + "子线程开始"); try { // 子线程休眠五秒 Thread.sleep(5000); } catch (Inter
https://xxgblog.com/2017/02/28/mina-netty-twisted-12/
由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成。 HTTPS介绍上一篇博文中介绍了SSL/TLS协议,我们平时接触最多的SSL/TLS协议的应用就是HTTPS协议了,现在可以看到越来越多的网站已经是https开头了,百度搜索也由曾经的http改为https。有关百度为什
https://xxgblog.com/2014/08/21/mina-netty-twisted-2/
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总是按照剧本来走。 MINA官方文档节选: TCP guarantess delivery of all packets in the correct order. But ther
https://xxgblog.com/2016/05/05/maven-profile-antrun/
在Java项目中通常会有各种配置文件,例如有xml、properties。在不同的环境下配置文件的内容可能会不一样,例如正式环境、测试环境、开发环境连的不是同一个数据库,访问的接口不一样,或者日志的级别不同。如果每次部署不同环境时都要改配置文件的各种配置是非常麻烦的。在这种情况下,可以将这些配置文为每个环境复制一个,分别配置不同的内容,打包部署时不同环境的包中打入对应的配置文件。下面是一个通过Ma
https://xxgblog.com/2014/08/27/mina-netty-twisted-5/
protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化、反序列化),一般应用于网络传输,可支持多种编程语言。 protobuf如何使用这里不再介绍,本文主要介绍在MINA、Netty、Twisted中如何使用protobuf,不了解protobuf的同学可以去参考我的另一篇博文。 在前一篇博文中,有介绍到一种用一个固定为4字节的前缀Header来
https://xxgblog.com/2013/09/27/postgresql-java-copy/
在MySQL中,可以使用LOAD DATA INFILE和LOAD DATA LOCAL INFILE两种方式导入文本文件中的数据到数据库表中,速度非常快。其中LOAD DATA INFILE使用的文件要位于MySQL所在服务器上,LOAD DATA LOCAL INFILE则使用的是客户端的文件。12LOAD DATA INFILE 'data.txt' INTO TABLE table_nam
https://xxgblog.com/2013/09/11/android-intentservice/
IntentService继承自Service类,至于为什么要用IntentService,因为它真的很好用。 Android的Service分两种,Started和Bound,分别是通过startService()和bindService()创建的,两者用途也有所区别,这个在这里就不作详解。IntentService是针对Started Service设计的,由于它默认实现的onBind()方法
https://xxgblog.com/2015/11/25/java-websocket-tail/
在Linux操作系统中,经常需要查看日志文件的实时输出内容,通常会使用tail -f或者tailf命令。查看实时日志可能会需要首先SSH连上Linux主机,步骤很麻烦不说,如果是生产环境的服务器,可能还会控制各种权限。此时可以考虑基于Web显示实时日志。 由于传统的HTTP协议是请求/响应模式,而实时日志需要不定时的持续的输出,有新的日志内容时需要由服务器主动推送给客户端浏览器。所以这里使用的是H
https://xxgblog.com/2016/09/22/http-server-maven-repository/
作为一个Java老程序员,多多少少都会有一些自己写的各种常用代码,如果每写一个项目都把这些代码拷贝一份到新项目比较麻烦的,打成jar包引入到项目会方便很多。如果想让这些jar包能通过Maven引入进项目,那就需要搭建Maven仓库。 说到Maven仓库搭建,很多人第一想到的一般都是Nexus。Nexus的确是非常好的方案,但是总归需要一台服务器,一台服务器需要花钱买和花时间维护,成本比较大。Nex
https://xxgblog.com/2016/05/06/mybatis-generator-mysql-pagination/
MyBatis Generator是一个非常方便的代码生成工具,它能够根据表结构生成CRUD代码,可以满足大部分需求。但是唯一让人不爽的是,生成的代码中的数据库查询没有分页功能。本文介绍如何让MyBatis Generator生成的代码具有分页功能。 MyBatis Generator结合Maven的配置和使用在实现分页之前,首先简单介绍MyBatis Generator如何使用。 MyBatis
https://xxgblog.com/2014/08/15/mina-netty-twisted-1/
MINA、Netty、Twisted为什么放在一起学习?首先,不妨先分别看一下它们官方网站对其的介绍: MINA: Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. I
https://xxgblog.com/2014/09/19/mina-netty-twisted-7/
消息传递有很多种方式,请求/响应(Request/Reply)是最常用的。在前面的博文的例子中,很多都是采用请求/响应的方式,当服务器接收到消息后,会立即write回写一条消息到客户端。HTTP协议也是基于请求/响应的方式。 但是请求/响应并不能满足所有的消息传递的需求,有些需求可能需要服务端主动推送消息到客户端,而不是被动的等待请求后再给出响应。 发布/订阅(Publish/Subscribe)
https://xxgblog.com/2016/04/02/traverse-list-thread-safe/
遍历List的多种方式在讲如何线程安全地遍历List之前,先看看通常我们遍历一个List会采用哪些方式。 方式一:123for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i));} 方式二:1234Iterator iterator = list.iterator();while(iter
https://xxgblog.com/2013/09/08/android-intent/
Intent是Android初学者比较难理解的一个东西。我这里以通俗易懂的语言和通俗易懂的代码,让初学者简单感受一下Intent。 intent就是意图的意思。Intent分两种:显式(Explicit intent)和隐式(Implicit intent)。 显式(设置Component)显式,即直接指定需要打开的Activity对应的类。 以下多种方式都是一样的,实际上都是设置Componen
https://xxgblog.com/2019/02/17/java-ipv6-system-properties/index.html
IPv6背景介绍目前被广泛使用的IPv4,它的最大问题是网络地址资源有限。IPv4仅有32二进制位,满打满算也仅有不到43亿个IP地址,已经完全不能满足目前需求。IPv6有128二进制位,地址数量非常庞大。目前主流操作系统早已支持IPv6,Google、Facebook和Yahoo等网站也早已支持IPv6。2017年底****办公厅、国务院办公厅印发《推进互联网协议第六版(IPv6)规模部署行动计
https://xxgblog.com/2015/10/16/web-service-client/
搭建一个简单的Web Service服务器要想跑Web Service客户端,前提是要有个Web Service服务器。如果你已经有Web Service服务器,那么可以跳过这一步。如果没有,可以使用JAX-WS搭建一个简单的Web Service服务器。12345678910111213@WebServicepublic class HelloWorld { publi
https://xxgblog.com/2018/05/12/spring-jms-activemq/
JMS即Java消息服务(Java Message Service),是Java平台上的一套关于消息中间件的规范,或者说是一套统一的API。支持JMS的消息中间件有很多,ActiveMQ算是其中最常用的一个。 JMS两种模型JMS支持以下两种模型,本文将会对这两种模型分别介绍如何整合Spring: 点对点(Point-to-Point),对应的destination是Queue 发布订阅(Pub
https://xxgblog.com/2013/07/04/java-urlclassloader-plugin/
插件(Plugin)是什么不用多说。常用的软件,例如Eclipse、Photoshop、VisualStudio,都支持插件扩展。插件可以动态给软件添加一些功能,也可以随时删除,这样的好处是任何人都可以给这个软件进行功能上的扩展,而不用去改软件本身的代码。 适用场景比如需要开发一个系统,用来将一些有数据推送给客户,至于是什么数据不是重点。有三个客户:A客户需要把数据组织成一个xml格式的文件,通过
https://xxgblog.com/2015/08/07/maven-create-executable-jar/
Maven可以使用mvn package指令对项目进行打包生成jar文件,如果直接使用java -jar xxx.jar指令运行jar文件,会出现”no main manifest attribute, in xxx.jar”(没有设置Main-Class)、ClassNotFoundException(找不到依赖包)等错误。 要想jar包能直接通过java -jar xxx.jar运行,需要满足
https://xxgblog.com/2015/05/17/nginx-start/
本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理。废话不多,直接开始。 1、静态HTTP服务器首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。 配置:123456server { listen 80; # 端口号 location / { root /usr/share
https://xxgblog.com/2014/09/10/mina-netty-twisted-6/
开发过Web应用的同学应该都会使用session。由于HTTP协议本身是无状态的,所以一个客户端多次访问这个web应用的多个页面,服务器无法判断多次访问的客户端是否是同一个客户端。有了session就可以设置一些和客户端相关的属性,用于保持这种连接状态。例如用户登录系统后,设置session标记这个客户端已登录,那么访问别的页面时就不用再次登录了。 不过本文的内容不是Web应用的session,而
https://xxgblog.com/2014/09/23/mina-netty-twisted-8/
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输。 HTTP协议也是基于TCP协议,所以也有服务器和客户端。HTTP客户端一般是浏览器,当然还有可能是其他东西。HTTP服务器,也就是Web服务器,目前已经有很多成熟的产品,例如Apache HTTP Server、Tomcat、Nginx、IIS等。 本文的内容不是讲解如何使用以上的HTTP服务器,
https://xxgblog.com/2014/10/16/mina-netty-twisted-10/
要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要。MINA、Netty、Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器。但是如果不了解它们的线程模型,就很难写出高性能的代码。框架本身效率再高,程序写的太差,那么服务器整体的性能也不会太高。就像一个电脑,CPU再好,内存小硬盘慢散热差,整体的性能也不会太高。 玩过Android开发的同学
https://xxgblog.com/2016/06/01/maven-spring-profile/
在Maven和Spring中,都有profile这个概念。profile是用于区分各种环境的,例如开发环境、测试环境、正式环境等。Maven的profile用于在打包时根据指定环境替换不同环境的配置文件配置,如数据库配置。Spring的Profile可以用于在不同的环境下加载不同的bean,例如@Profile注解。两者一个是Maven编译和打包时生效,另一个是运行时生效,默认是没有关联的,本文会
https://xxgblog.com/2018/05/22/spring-security-pre-authentication/
Spring Security官方文档对Pre-Authentication是这样解释的: There are situations where you want to use Spring Security for authorization, but the user has already been reliably authenticated by some external syste
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.