当前位置: 首页 > news >正文

南通有哪些网站行业网站

南通有哪些网站,行业网站,商城网站要怎样设计,cms网站怎么建1.jforgame-socket开发背景 1.1socket介绍 Socket是用于在计算机网络中实现通信的编程接口。它提供了一种通过网络在不同计算机之间传输数据的方式。不同http基于请求-响应模式#xff0c;socket是全双工的#xff0c;允许服务器、客户端同时向另外一端发送数据。由于socke…1.jforgame-socket开发背景 1.1socket介绍 Socket是用于在计算机网络中实现通信的编程接口。它提供了一种通过网络在不同计算机之间传输数据的方式。不同http基于请求-响应模式socket是全双工的允许服务器、客户端同时向另外一端发送数据。由于socket工作在TCP/IP协议中的运输层而不是像http这种工作在应用层因此使用socket通信需要建立自己的私有协议栈。通过私有协议栈定义网络传输的字节流的具体意义。 1.2原生netty/mina复杂性与缺陷 Netty/Mina都是用于构建高性能、可扩展网络应用程序的Java框架。它们提供了一套抽象的、事件驱动的异步网络编程模型使得开发者可以轻松地构建各种网络应用例如服务器、客户端、代理等。 尽管Netty/Mina是一个强大而灵活的框架但是对于初学者来说可能会感到一些复杂性。下面是一些可能与Netty相关的复杂性因素 编解码器和处理器Netty/Mina提供了一套强大的编解码器和处理器用于处理不同的协议和数据格式。选择合适的编解码器和处理器并正确配置它们可能需要一些学习和实践。特别是处理数据流粘包/拆包问题。 业务消息路由器Netty/Mina只提供关于网络消息IO方面的内容对于业务消息的路由处理类似于SpringMVC的DispatchServlet机制需要项目自行封装。 更高层次的统一当项目引入Netty或者Mina之后业务代码就与框架强耦合。如果中途需要切换顶层网关需要修改项目的很多代码。 2.jforgame-socket框架介绍 jforgame-socket是一个通用的网络工具底层对Netty/Mina进行了封装屏蔽了私有协议栈定制消息编解码消息粘包/拆包问题。jforgame-socket传输层使用了TCP协议。可用于任何需要socket通信的应用。例如游戏服务器聊天服务器等等。 2.1jforgame-socket结构 jforgame-socket主要有三个组件组成分别是 jforgame-socket-api 底层通用接口封装了Session接口服务器/客户端通信接口消息路由客户端rpc接口等重要接口。jforgame-socket-minasocket的mina实现提供了服务器/客户端大部分默认组件以及私有协议栈设计提供TcpSocketServerBuilder工具类用于快速启动游戏服务器jforgame-socket-nettysocket的netty实现提供了服务器/客户端大部分默认组件以及私有协议栈设计提供TcpSocketServerBuilder工具类用于快速启动游戏服务器 2.2jforgame-socket其他依赖组件 jforgame-socket提供了默认的私有协议栈但对于一个完整消息的编解码是没有强制绑定的运行客户端代码自行设计例如可以使用protobufjsonxmlprotostuf等等。 jforgame项目提供了两种默认编解码工具 jforgame-codec-protobuf:使用protobuf进行消息编解码为了省略.protobuf文件的编写引入JProtobuf基于注解的编解码。jforgame-codec-struct:基于jdk反射实现的编解码对于一个简单的javabean该工具基于反射解析该类每个字段的类型以及顺序动态生成消息实体以及注入属性。使用简单方便推荐 3.使用案例 3.1添加中央仓库地址国内其他云镜像仓库可能还未同步 repositoryidrepo2/idnameMirror from Maven Repo2/nameurlhttp://repo2.maven.org/maven2//url /repository 3.2添加socket依赖以jforgame-socket-netty为例 dependencygroupIdio.github.jforgame/groupIdartifactIdjforgame-socket-netty/artifactIdversion1.0.0/version /dependency 3.3添加消息编解码依赖(以jforgame-codec-struct为例) dependencygroupIdio.github.jforgame/groupIdartifactIdjforgame-codec-struct/artifactIdversion1.0.0/version /dependency 3.4自行设计线程模型1.1将提供默认实现 游戏业务由于类型非常多像棋牌MMORPG策略游戏h5小游戏等所用的业务线程模型是不一致的作为socket框架无法提供通用实现。 public class DispatchThreadModel implements ThreadModel {private static final Logger logger LoggerFactory.getLogger(DispatchThreadModel.class);private final int CORE_SIZE Runtime.getRuntime().availableProcessors();/*** task worker pool*/private final Worker[] workerPool new Worker[CORE_SIZE];private static final AtomicBoolean running new AtomicBoolean(true);public DispatchThreadModel() {ThreadFactory threadFactory new NamedThreadFactory(message-business);for (int i 0; i CORE_SIZE; i) {Worker w new Worker();workerPool[i] w;threadFactory.newThread(w).start();}}private static class Worker implements Runnable {LinkedBlockingQueueBaseGameTask taskQueue new LinkedBlockingQueue();void receive(BaseGameTask task) {taskQueue.add(task);}Overridepublic void run() {while (running.get()) {try {BaseGameTask task taskQueue.take();task.run();} catch (InterruptedException e) {// TODO other way?Thread.currentThread().interrupt();} catch (Exception e) {logger.error(, e);}}}}/*** when receiving a task, the executor will calculate the thread index based on the {link BaseGameTask#getDispatchKey()}* for example, if the executor group has N threads, the task will be dispatched to the thread which index is (dispatchKey() % N)* param task command task*/Overridepublic void accept(BaseGameTask task) {if (task null) {throw new NullPointerException(task is null);}if (!running.get()) {return;}int distributeKey (int) (task.getDispatchKey() % CORE_SIZE);workerPool[distributeKey].receive(task);}/*** when this executor shuts down, it will no longer accept new task* and the remained tasks will be abandoned either.*/Overridepublic void shutDown() {running.compareAndSet(true, false);}} 3.5消息分发器 对网络session的创建摧毁消息接受等提供一个钩子接口允许必须业务代码自行设计。如此方可适用于所有socket应用。 public class MessageIoDispatcher extends ChainedMessageDispatcher {private MessageHandlerRegister handlerRegister;private MessageParameterConverter msgParameterConverter;private MessageFactory messageFactory GameMessageFactory.getInstance();public MessageIoDispatcher(String scanPath) {this.msgParameterConverter new DefaultMessageParameterConverter(messageFactory);this.handlerRegister new CommonMessageHandlerRegister(scanPath, messageFactory);MessageHandler messageHandler (session, message) - {int cmd GameMessageFactory.getInstance().getMessageId(message.getClass());MessageExecutor cmdExecutor handlerRegister.getMessageExecutor(cmd);if (cmdExecutor null) {logger.error(message executor missed, cmd{}, cmd);return true;}Object[] params msgParameterConverter.convertToMethodParams(session, cmdExecutor.getParams(), message);Object controller cmdExecutor.getHandler();int sessionId (int) session.getAttribute(SessionProperties.DISTRIBUTE_KEY);MessageTask task MessageTask.valueOf(session, sessionId, controller, cmdExecutor.getMethod(), params);task.setRequest(message);// 丢到任务消息队列不在io线程进行业务处理GameServer.getMonitorGameExecutor().accept(task);return true;};addMessageHandler(messageHandler);}Overridepublic void onSessionCreated(IdSession session) {session.setAttribute(SessionProperties.DISTRIBUTE_KEY, SessionManager.INSTANCE.getNextSessionId());}Overridepublic void onSessionClosed(IdSession session) {long playerId SessionManager.INSTANCE.getPlayerIdBy(session);if (playerId 0) {logger.info(角色[{}]close session, playerId);PlayerEnt player GameContext.playerManager.get(playerId);BaseGameTask closeTask new BaseGameTask() {Overridepublic void action() {GameContext.playerManager.playerLogout(playerId);}};GameServer.getMonitorGameExecutor().accept(closeTask);}}} 3.6一句话启动服务器 除了自行设计两个无法提供默认实现的组件之外其他的功能jforgame-socet框架都帮你完成啦。只需引入builder工具类即可。 TcpSocketServerBuilder.newBuilder().bindingPort(HostAndPort.valueOf(ServerConfig.getInstance().getServerPort())).setMessageFactory(GameMessageFactory.getInstance()).setMessageCodec(new StructMessageCodec()).setSocketIoDispatcher(new MessageIoDispatcher(ServerScanPaths.MESSAGE_PATH)).build().start(); 好了开始你的网络通信项目吧。
http://www.pierceye.com/news/833079/

相关文章:

  • 网站制作费用多少网页制作公司接单
  • ps做网站效果图房产网站cms
  • 在线教育网站建设公司互联网公司网站建设ppt模板下载
  • 泰国一家做男模的网站深圳福田有什么好玩的地方
  • 网站顶部图片素材个人备案号 可以做游戏网站吗
  • hk域名网站深圳龙华住房和建设局网站
  • 涞源网站建设搭建wordpress配置
  • 英文网站推广工作深圳制作网站有几家
  • 旅游推荐网站怎么做亚马逊关键词搜索工具
  • 网站建设技术部职责如何做公司网页制作
  • 广告公司怎么设置网站关键字网页鉴赏
  • 阳江网站开发网站设计 cdc
  • 密云建设银行招聘网站万网网站备份
  • 企业网站建设网站优化推广站群网站建设推广
  • 深圳市多语言网站建设公司营销网站建设公司哪家好
  • 网站推广是怎么做的仿腾讯网站源码
  • 北京市建设工程信息网站网站建设需要域名吗?
  • 做金融的网站有哪些阳江房地产信息网官方网站
  • h5能做网站开发吗黑链 对网站的影响
  • 专门做设计文案的网站wordpress 建站服务
  • 网站快速排名公司wordpress 插件 原理
  • 网站制作需要学什么公司网站管理属于什么职位
  • 南通专业企业门户网站设计学校怎么创建网站
  • 网站策划与建设阶段的推广方法中国建设教育协会安全员证
  • 建设银行网站用户名更改分销微信小程序开发
  • 荣成做网站的公司百度地图 wordpress
  • 扁平设计网站湖南健康二维码app下载安装
  • 大连成久建设工程有限公司网站针对爬虫爬取做的优化
  • 建设官方网站企业网银登录网站版面设计
  • 网站建设学什么软件怎样创建自己的公众号