我的游戏之路——服务器之IO篇

来源:互联网 发布:o2o在线预约商城源码 编辑:程序博客网 时间:2024/05/21 08:15

        也算是考虑了很久的吧,从大学毕业做过网络的维护,写过CRM,OA这些企业后端,弄过网络爬虫,验证码识别。。。几个月前无意进入了游戏服务器开发领域,感觉打开了一扇新的大门。(这里应该有xxx感慨就略过了),主要原因就三个,一是我真的非常非常非常讨厌写前端的代码!!!虽然js,css,jquery,node.js这些东西或多或少都会吧,但是就是比别人写得丑,天生没有艺术细菌啊。二就是只有当做游戏时,才能体会到那种我就是上帝的感觉,这样的喜悦和玩游戏是完全不一样的,也就是成就感吧?三游戏服务器开发很时候我这样的懒人啊╮(╯▽╰)╭。

         大致规划为:通信,交换(数据格式),数据(缓存,持久化),逻辑(游戏逻辑),安全,服务器设计几个部分。其中通信包含:IO,NIO,NIO2,NETTY,MINA。交换就是常用的三种交互格的使用:json,xml,以及基于二进制的protobuf。数据则是常见关系数据库和memcache,redis,mongpdb等。这些东西有空就写一点吧。

        本着一贯懒人的特性,能直接上代码,就不BB了。

public class IOServer {public static void run(int port) {Socket socket = null;byte[] message = new byte[512];try {ServerSocket serversocket = new ServerSocket(port);//这里会阻塞socket = serversocket.accept();System.out.println("服务器启动!");//读取时候也会阻塞!InputStream in = socket.getInputStream();while(true) {int read = in.read(message);if(read >= 0) {System.out.println("服务器接收消息:" + new String(message, 0, read));}else {in.close();}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("socket关闭");}}public static void main(String[] args) {run(1234);}}

上面的代码就是使用传统的IO编写的服务器代码。流程很简单:
ServerSocket serversocket = new ServerSocket(port);//new一个ServerSocket,绑定一个端口
socket = serversocket.accept();//阻塞监听,请求
InputStream in = socket.getInputStream();//获取输入流(相应的也可以获取输出流)

这里要说的是传统IO实现效率是非常低的,为什么呢?先看下面几个概念:

同步:用户发送请求后(IO操作)等待或者轮询IO是否就绪。

异步:用户发送请求后,可以去干其它事。当IO完成时会得到完成的通知

这里可以看到同步异步是对于IO操作而言的(划重点)

阻塞:指调用请求后在结果返回之前,当前线程会被挂起,只有在得到结果后才返回。

非阻塞:在不能立刻得到结果之前,该调用不会阻塞当前线程。

很明显同步/异步,阻塞/非阻塞的区别点在于一个是IO,一个是线程的挂起。

而java传统IO,属于同步阻塞型IO。在accept(),获取输入流时都会阻塞极大影响了效率。而且默认单线程,当然也可以自己加入线程池。但这也意味这一个请求一个线程,对资源的消耗是非常大的。所以现在已经基本很少采用这种方式了

原创粉丝点击