游戏服务器开发

分类基础:java

1,moba:multiplayer online Battle Arena.多人在线战术竞技游戏;web

     例子:王者荣耀编程

2,FPS:first person shooting game,第一人称视角射击游戏数组

     例子:全军出击;服务器

3,RPG:Role-playing Game:角色扮演游戏;网络

webSocket编程:并发

解决痛点:全双工通讯,服务端主动推送,消耗资源少异步

 

网络同步异步:jvm

同步:用户进程触发io操做并等待或者轮询地去查看io操做是否就绪。socket

异步:用户进程触发io操做之后就能够去处理其它操做,当io操做已经完成的时候会获得io完成的通知。

阻塞和非阻塞是进程在访问数据的时候,io操做是否被挂起。

 

阻塞式io:每个客户端接入,服务器都要创建一个新的线程来进行处理(不开也能够,单线程处理,性能会很低就是),客户端链接数和服务端链接数以1:1方式呈现。因此,当客户端链接数增多,产生高并发的时候,整个bio网络程序将占用大量的jvm线程,服务器性能降低,线程数达到必定数量后,jvm抛出堆栈异常,形成宕机。

非阻塞式io:

高并发io特色

1,建立一个线程负责处理io事件和io事件的分发;

2,事件驱动机制非同步监视事件,而是事件到达以后触发。

3,线程之间经过wai,notify等方式通讯,减小没必要要的线程切换。

服务器实现模式:一个处理全部请求的webwocket线程;根据处理类型分到read,write,disconnect等对应线程去,减小线程切换开销。

缓冲器RecvBuffer:全部请求过来的数据,先丢到一个缓冲器buffer中,这个buffer实质是个字节数组ByteBuffer,若是RecvBuffer有对应的数据,则马上返回数据,若是没有,直接返回0,等到有数据的时候,直接返回,永远不会阻塞。

在nio中 socket的主要读写注册和接收函数,在等待就绪阶段都是非阻塞的,真正的I/O操做时同步阻塞的。

tcp主要事件:读就绪,写就绪,有新的链接来。咱们首先须要注册当这几个事件到来的时候所对应的处理器。而后在合适的时机告诉事件选择器:我对这个事件感兴趣。对于写操做,就是写不出去的时候对写事件感兴趣;对于读操做,就是完成链接和系统没有办法承载新读入的数据的时;对于accept,通常是服务器刚启动的时候;而对于connect,通常是connect失败须要重连或者直接异步调用connect的时候。

其次,用一个死循环选择就绪的事件,会执行系统调用(Linux 2.6以前是select、poll,2.6以后是epoll,Windows是IOCP),还会阻塞的等待新事件的到来。新事件到来的时候,会在selector上注册标记位,标示可读、可写或者有链接到来。

注意,select是阻塞的,不管是经过操做系统的通知(epoll)仍是不停的轮询(select,poll),这个函数是阻塞的。因此你能够放心大胆地在一个while(true)里面调用这个函数而不用担忧CPU空转。

因此咱们的程序大概的模样是:

interface ChannelHandler{
      void channelReadable(Channel channel);
      void channelWritable(Channel channel);
   }
   class Channel{
     Socket socket;
     Event event;//读,写或者链接
   }

   //IO线程主循环:
   class IoThread extends Thread{
   public void run(){
   Channel channel;
   while(channel=Selector.select()){//选择就绪的事件和对应的链接
      if(channel.event==accept){
         registerNewChannelHandler(channel);//若是是新链接,则注册一个新的读写处理器
      }
      if(channel.event==write){
         getChannelHandler(channel).channelWritable(channel);//若是能够写,则执行写事件
      }
      if(channel.event==read){
          getChannelHandler(channel).channelReadable(channel);//若是能够读,则执行读事件
      }
    }
   }
   Map<Channel,ChannelHandler> handlerMap;//全部channel的对应事件处理器
  }
相关文章
相关标签/搜索