自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

叉叉哥的BLOG

Python毁一生,Java穷三代,两者皆不沾,必成高富帅!

  • 博客(109)
  • 资源 (8)
  • 问答 (1)
  • 收藏
  • 关注

原创 Nginx配置网站适配PC和手机

考虑到网站的在多种设备下的兼容性,有很多网站会有手机版和电脑版两个版本。访问同一个网站URL,当服务端识别出用户使用电脑访问,就打开电脑版的页面,用户如果使用手机访问,则会得到手机版的页面。

2015-06-29 14:59:00 15738 1

原创 Nginx的一些基本功能极速入门

本文主要介绍一些Nginx的最基本功能以及简单配置,但不包括Nginx的安装部署以及实现原理。废话不多,直接开始。1、静态HTTP服务器首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。配置:server { listen 80; # 端口号 location / { root /usr/share/nginx/html; #

2015-05-17 22:20:05 5780 6

原创 Spring MVC的Controller统一异常处理:HandlerExceptionResolver

出现异常并不可怕,可怕的是出现了异常,你却不知道,也没有进行异常处理。 Spring MVC的Controller出现异常的默认处理是响应一个500状态码,再把错误信息显示在页面上,如果用户看到这样的页面,一定会觉得你这个网站太LOW了。 要解决Controller的异常问题,当然也不能在每个处理请求的方法中加上异常处理,那样太繁琐。Spring MVC提供了一个HandlerException

2015-05-01 22:08:50 31695 1

原创 Jetty集群配置Session存储到MySQL、MongoDB

在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息。Session一般情况下是保存在服务器内存中。如果服务器重启,Session就会丢失。另外,如果是集群环境,一个Web应用部署在多台服务器上,一个用户多次请求可能会由不同的服务器来处理,Session如果保存在各自的服务器上,就无法共享了。

2015-01-30 09:20:48 4675

原创 Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件、网络游戏聊天、Web聊天及Web消息推送、移动设备的消息推送等场景,例如Google的GTalk、《英雄联盟LOL》游戏聊天模块。由于在Web浏览器上的JavaScript不能直接处理TCP协议,所以XMPP服务器通常会提供BOSH(Bidirectional-streams Over Synchronous HTTP)接口,通过H

2015-01-13 10:51:35 18081 29

原创 Linux搭建XMPP服务器Tigase(Spark客户端测试)

Tigase是一个基于Java开发的XMPP服务器,类似于Openfire,可用于搭建一个即时通讯(Instant Messaging,简称IM)的平台。1、准备在安装Tigase之前,首先需要准备Java环境以及数据库(本文使用MySQL)。Tigase下载:https://projects.tigase.org/projects/tigase-server/files下载:tigase-ser

2014-11-07 13:41:28 11345 7

原创 Mina、Netty、Twisted一起学(十):线程模型

要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要。MINA、Netty、Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器。但是如果不了解它们的线程模型,就很难写出高性能的代码。框架本身效率再高,程序写的太差,那么服务器整体的性能也不会太高。就像一个电脑,CPU再好,内存小硬盘慢散热差,整体的性能也不会太高。玩过Android开发的同学会

2014-10-16 13:14:01 5272 11

原创 Mina、Netty、Twisted一起学(九):异步IO和回调函数

用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax、jQuery的动画等。在异步网络编程中,由于IO操作是异步的,也就是一个IO操作不会阻塞去等待操作结果,程序就会继续向下执行。在MINA、Netty、Twisted中,很多网络IO操作都是异步的,比如向网络的另一端write写数据、客户端连接服务器的connect操作等。例如Netty的write方法(以及writeAndFlush方法),执行完write语句后并不表示数据已

2014-10-12 16:59:04 5477

原创 Mina、Netty、Twisted一起学(八):HTTP服务器

HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输。HTTP协议也是基于TCP协议,所以也有服务器和客户端。HTTP客户端一般是浏览器,当然还有可能是其他东西。HTTP服务器,也就是Web服务器,目前已经有很多成熟的产品,例如Apache HTTP Server、Tomcat、Nginx、IIS等。本文的内容不是讲解如何使用以上的HTTP服务器,而是

2014-09-23 17:32:27 6500 4

原创 Mina、Netty、Twisted一起学(七):发布/订阅(Publish/Subscribe)

消息传递有很多种方式,请求/响应(Request/Reply)是最常用的。在前面的博文的例子中,很多都是采用请求/响应的方式,当服务器接收到消息后,会立即write回写一条消息到客户端。HTTP协议也是基于请求/响应的方式。但是请求/响应并不能满足所有的消息传递的需求,有些需求可能需要服务端主动推送消息到客户端,而不是被动的等待请求后再给出响应。发布/订阅(Publish/Subscribe)是一

2014-09-19 13:35:25 4946

原创 Mina、Netty、Twisted一起学(六):session

在同步阻塞的网络编程中,代码都是按照TCP操作顺序编写的,即创建连接、多次读写、关闭连接,这样很容易判断这一系列操作是否是同一个连接。而在事件驱动的异步网络编程框架中,IO操作都会触发一个事件调用相应的事件函数,例如接收到客户端的新数据,会调用messageReceived(MINA)、channelRead(Netty)、dataReceived(Twisted),同一个TCP连接的多次请求和多个客户端请求都是一样的。那么如何判断多次请求到底是不是同一个TCP连接,如何保存连接相关的信息?针对这个问题,

2014-09-10 13:51:18 6291 2

原创 Mina、Netty、Twisted一起学(五):整合protobuf

protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化、反序列化),一般应用于网络传输,可支持多种编程语言。protobuf如何使用这里不再介绍,本文主要介绍在MINA、Netty、Twisted中如何使用protobuf,不了解protobuf的同学可以去参考我的另一篇博文。在前面的一篇博文中,有介绍到一种用一个固定为4字节的前缀Header来

2014-08-27 09:25:41 6782

原创 Mina、Netty、Twisted一起学(四):定制自己的协议

在前面的博文中,介绍一些消息分割的方案,以及MINA、Netty、Twisted针对这些方案提供的相关API。例如MINA的TextLineCodecFactory、PrefixedStringCodecFactory,Netty的LineBasedFrameDecoder、LengthFieldBasedFrameDecoder,Twisted的LineOnlyReceiver、Int32StringReceiver。除了这些方案,还有很多其他方案,当然也可以自己定义。在这里,我们定制一个自己的方案,并

2014-08-25 13:03:48 4236

原创 Mina、Netty、Twisted一起学(三):TCP消息固定大小的前缀(Header)

在上一篇博文中,有介绍到用换行符分割消息的方法。但是这种方法有个小问题,如果消息中本身就包含换行符,那将会将这条消息分割成两条,结果就不对了。本文介绍另外一种消息分割方式,即上一篇博文中讲的第2条:use a fixed length header that indicates the length of the body,用一个固定字节数的Header前缀来指定Body的字节数,以此来分割消息。

2014-08-22 10:41:48 4215 1

原创 Mina、Netty、Twisted一起学(二):TCP消息边界问题及按行分割消息

在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息。理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次read。但是,现实不总是按照剧本来走。

2014-08-21 13:51:42 5009

原创 Mina、Netty、Twisted一起学(一):实现简单的TCP服务器

MINA、Netty、Twisted为什么放在一起学习?它们的共同特点:event-driven以及asynchronous。它们都是事件驱动、异步的网络编程框架。由此可见,它们之间的共同点还是很明显的。所以我这里将这三个框架放在一起,实现相同的功能,不但可以用少量的精力学三样东西,而且还可以对它们之间进行各方面的对比。

2014-08-15 10:53:19 9524

原创 使用Tomcat实现基于iframe streaming的Comet聊天室

这是一个基于Comet实现的聊天室Demo,功能类似于QQ群聊。聊天过程中如果有新想消息,那么就需要服务器推送消息到浏览器,所以这里可以使用Comet技术。Comet一般有两种实现方式:长轮询(long-polling)、流(streaming)。而本文中的这个Demo的实现方式是基于流(streaming),前端使用了一个隐藏的iframe,这也是比较常用的一种方式。不过由于使用iframe流,导致浏览器上面的进度一直在转,这是因为iframe一直在加载的原因,先不要在意这些细节。Tomcat提供了C

2014-08-11 09:48:25 5490 35

原创 Comet入门及最简单的Java Demo

在浏览网页的时候,如果有新的消息,如何接收到?HTTP协议不能由服务器主动给客户端发送消息。1、刷微博、逛论坛贴吧,想看最新的信息怎么办?F5刷新一下就OK了!2、上面一种方式是被动的,如果用户不去刷新页面,就看不到消息。如何让服务器主动推送消息给客户端浏览器,一种方式是用setInterval来Ajax定时刷新。这样一来,刷新操作不是由用户来操作,而是由浏览器去自动发起请求,用户无法察觉到,给用

2014-08-01 10:13:05 8144 1

原创 CAS Java客户端登录相关过滤器的处理流程

首先了解一下CAS登录原理:CAS结构中一般包含CAS服务器、应用服务器、客户端三个部分。客户端向应用服务器发出请求,由于未登录,会被跳转到CAS服务器登录。登录成功后跳转回应用服务器的登录前的URL,但是CAS服务器会给URL加上一个ticket参数。应用服务器拿着ticket去CAS服务器验证,验证成功后即加入一个session表示已登录,以后就不用再次登录了。在web.xml配置中,Auth

2014-07-24 13:09:45 15727 5

原创 protobuf extensions(extend)的消息定义及Java使用方法

在定义protobuf消息时,有时候需要用到extensions来对原有的消息类型进行扩展,有利于消息定义的重复使用。1、下面写一个最简单的例子,定义一个message BaseData,并对其进行扩展:Example.proto:// 定义一个message BaseData,100~199之间的tag可供扩展message BaseData { required int32 code =

2014-07-16 11:22:53 24472

原创 Java使用Protocol Buffers入门四步骤

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差。类似的还有json、Java的Serializable等。protobuf支持各种语言。本文以Java为例,简单介绍protobuf如何使用。其他语言使用方法类似。

2014-07-03 12:56:31 59044 10

原创 Java读源码学设计模式:适配器Adapter

适配器模式相关源码:slf4j-1.6.1、hibernate-3.6.7。大家都知道,log4j是一个广泛使用的日志工具,除此之外,土鳖sun公司在JDK中也有自己的日志工具,也就是java.util.logging.Logger。当然还有其他一些日志工具。多种日志工具功能和使用方式类似,一般都包含debug、info、warn、error等日志级别的方法,但却没有实现共同的接口。slf4j提供了一个共同的接口,并实现了不同日志工具的适配器。

2014-06-20 09:54:53 3251

原创 js实现图片拖动改变顺序

在web页面中,需要改变多个元素的位置,可以通过元素拖动来实现。HTML5中加入了一个全局属性draggable,通过设置true/false来控制元素是否可拖动。下面以图片拖动为例,用jQuery来实现:页面上有多个图片,把一个图片拖动到其他两个图片中间,就可以将这个图片的位置插入到两图之间。

2014-05-13 11:06:48 14051 2

原创 js在web页面上绘制圆形

在web页面上,想要画出一个圆形,方法有很多,SVG、canvas都可以绘图。但是本文不采用这两种方式,而是使用一个div。div一般是一个矩形,但是如果设置一个圆角样式border-radius就可以将div变成圆形。用jQuery实现这样一个交互:用鼠标在画布上按下左键拖动的方式来绘制圆,圆心是鼠标按下的位置,鼠标左键松开圆绘制完成。

2014-05-12 10:09:28 28154

原创 Struts 2三种方式实现Ajax

Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的。所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml、json等结构化的数据,还可能是一个简单的字符串。所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也可能调用jsp视图),而是通过一些其他的方式。下面介绍了三种方法,用于Action实现Ajax请求。

2014-03-24 09:47:51 12156 3

原创 Struts 2实现类似ThinkPHP的MVC开发方式

ThinkPHP是PHP的一个MVC开源框架,Struts 2是Java的MVC开源框架。虽然编程语言不同,但是他们都是解决同样的问题。用过ThinkPHP的同学应该都知道,ThinkPHP是一个非常简单的框架,使用起来很舒服。相对来说Struts 2则没有这么简单。本文介绍如何配置Struts 2,让它使用起来像ThinkPHP一样简单。

2014-03-12 09:43:34 3096 3

原创 Java使用Jetty实现嵌入式Web服务器及Servlet容器

Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty。本文介绍如何在Java应用程序中嵌入Jetty。

2014-03-07 09:49:44 11513 2

原创 Java使用Apache FtpServer实现嵌入式FTP服务器

Apache FtpServer是一个纯Java实现的FTP服务器,基于大名鼎鼎的网络框架apache MINA实现。它既可以作为一个完整的FTP服务器单独使用,也可以在Java程序中调用,类似于Jetty可以作为嵌入式的HTTP服务器。

2014-02-24 10:31:00 23368 22

原创 Java解析魔兽争霸3录像W3G文件(五):Action和APM计算

在游戏进行中,玩家会进行各种操作,例如编队、移动、技能、造建筑等,这些操作就是Action。APM(Actions Per Minute),表示每分钟的操作次数,APM可以很好的反映玩家的手速和实力,当然也有高APM的菜鸟和低APM的高手。在魔兽录像文件中,需要记录下玩家的操作,这些操作是记录在游戏时间段(TimeSlot)数据块中的,这在上一篇博文中有提到。

2014-02-17 10:29:04 7744 66

原创 Java解析魔兽争霸3录像W3G文件(四):解析游戏进行时的信息

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。通过解析压缩数据块解压缩后的数据的前一部分,可以获取到游戏开始前的一些信息,紧接着游戏开始前的信息之后,就是游戏进行时的信息了,其中包括玩家游戏中的操作,例如造建筑,出兵,攻击,移动等,还包括玩家游戏中的聊天信息,

2014-01-16 10:17:01 4243

原创 Java解析魔兽争霸3录像W3G文件(三):解析游戏开始前的信息

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。解压缩数据主要包括两大类信息:一类是游戏开始前的信息,例如游戏地图,游戏玩家,队伍、种族情况,高级选项等等,这些信息都是在进入游戏之前已经确定的东西;另一类是游戏进行时的信息,这块包括玩家游戏过程中的操作、游戏中的

2014-01-13 12:09:22 4092 1

原创 Java解析魔兽争霸3录像W3G文件(二):压缩数据块解压合并

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。在上一篇博文中,分析了魔兽争霸3录像W3G文件的Header部分的解析。Header部分占文件的前68个字节,紧接着Header之后,也就是从68字节之后,就是多个压缩数据块。压缩数据块的个数保存在Header中,

2014-01-08 10:29:39 3509

原创 Java解析魔兽争霸3录像W3G文件(一):Header

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、中国的鬼王ted、刚猛的fly、飘逸的th000等选手。遗憾的是WCG2013是魔兽争霸3的最后一届,我自己也去现场观看了魔兽的总决赛。此外,还有DOTA、真三、澄海3C等著名的地图。魔兽争霸的录像大家都知道,是用来回放的,文件后缀名是.w3g,保存在魔兽争霸下的REPLAY目录下。现在很多软件可以分析魔兽争霸录像,直接可以查看录像的玩家、地图,以及玩家的APM等信息。最近在YY对战平台打魔

2014-01-05 13:39:22 8589 2

原创 Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系

HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的。例如,第一次请求时已经登录了,第二次再请求服务器会“忘了”你已经登录过。为了解决这个问题,就有了Cookie和Session。它们的出现是为了让服务器“记住”之前这个客户端的一些数据,让HTTP保持状态。下面通过Java Socket实现的HTTP客户端来理解二者之间的原理,以及它们的区别和联系。

2013-12-13 10:52:12 8964 1

原创 Java Socket实现HTTP客户端来理解Redirect和Forward区别

在JSP/Servlet开发中,经常会有页面跳转。而常用的两种方式,一种是Forward(转发),还有一种是Redirect(重定向)。两者也有很多不同点。两种方式的区别不再多说,本文重点是两者的原理、实现方式的区别。

2013-12-05 11:37:48 4295

原创 Java自己实现HTTP服务器来理解GET和POST区别

GET请求和POST请求有什么区别?GET请求的参数在URL的问号后面显示,而POST参数不在URL上;POST可以比GET请求更大的数据…一般的回答都是这样。但是作为一个高端大气上档次的程序员,这样回答就弱爆了。为了搞清楚GET和POST的区别,下面写了一个Java程序来接收HTTP请求。

2013-11-27 10:50:26 9277 9

原创 PostgreSQL:Java使用CopyManager实现客户端文件COPY导入

在MySQL中,可以使用LOAD DATA INFILE和LOAD DATA LOCAL INFILE两种方式导入文本文件中的数据到数据库表中,速度非常快。其中LOAD DATA INFILE使用的文件要位于MySQL所在服务器上,LOAD DATA LOCAL INFILE则使用的是客户端的文件。在PostgreSQL中也可以导入相同类型的文本文件,使用的是COPY命令。但是这个语句只能导入PostgreSQL所在服务器上的文件,要想导入客户端文件,就需要使用下面的语句:COPY table_name F

2013-09-27 13:38:50 12879 2

原创 Java位运算在程序设计中的使用:位掩码(BitMask)

在Java中,位运算符有很多,例如与(&)、非(~)、或(|)、异或(^)、移位(<<和>>)等。这些运算符在日常编码中很少会用到。在下面的一个例子中,会用到位掩码(BitMask),其中包含大量的位运算。不只是在Java中,其他编写语言中也是可以使用的。例如,在一个系统中,用户一般有查询(Select)、新增(Insert)、修改(Update)、删除(Selete)四种权限,四种权限有多种组合方式,也就是有16中不同的权限状态(2的4次方)。

2013-09-15 11:40:02 12642 8

原创 Android理解:IntentService

IntentService继承自Service类,至于为什么要用IntentService,因为它真的很好用。Android的Service分两种,Started和Bound,分别是通过startService()和bindService()创建的,两者用途也有所区别,这个在这里就不作详解。IntentService是针对Started Service设计的,由于它默认实现的onBind()方法返回值是null,所以不适合bindService()。如果直接继承Service,不能把耗时或阻塞的代码写在

2013-09-11 20:21:38 18835 1

原创 Android理解:Activity状态和生命周期

要想理解Activity的生命周期,必先理解Activity的状态。一、Activity状态Android官方文档中把Activity分为下面三种状态:1、Resumed(活动状态)或者叫Running状态,这个Activity正在屏幕上显示,并且有用户焦点。这个很好理解,就是用户正在操作的那个界面。2、Paused(暂停状态)这是一个比较不常见的状态。

2013-09-09 09:45:29 5747 2

JDeploy自动化部署平台

JDeploy是Java + Shell实现的基于Linux系统的自动化、可视化的项目部署平台,能部署Java服务、Java Web项目,可以简化项目部署操作,无需繁琐的黑窗口SSH指令及Jenkins复杂的配置。

2015-10-20

protobuf-2.5.0 jar包及代码生成工具

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。

2014-07-03

protobuf-2.5.0

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化、反序列化,经常用于网络传输。 包含:protobuf-2.5.0.zip和protoc-2.5.0-win32.zip。

2014-07-03

六大UML类图关系

详细的接收java六大类UML类图的画法,请大家多多指教

2013-04-24

邮件系统javamail

基于javamail实现的邮件发送接收的系统javamail

2013-04-24

企业管理软件缩写

企业管理软件缩写,ERP,CRM,OA等缩写的解释。

2011-12-06

51单片机数字时钟—源程序+仿真电路(带闹钟)

51单片机数字钟课程设计(带闹钟,还有数字串在数码管上滚动显示的案例),C语言源程序+PROTEUS仿真电路图。

2011-04-25

JAVA+ACCESS学生成绩信息管理系统

JAVA+ACCESS学生成绩学籍信息管理系统

2011-01-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除