请教一个JAVA NIO的问题,急急!!

coolcpz 2014-06-10 12:59:36
public void register(Socket_Handle_Intf handle, int event) throws IOException {
try {
SelectionKey key = handle.get_channel().keyFor(socket_selector);
if (null == key) {
key = handle.get_channel().register(socket_selector, event);
if (null != key) {
key.attach(handle);
System.out.println("end to attach network event\n");
}
}
else {
key.interestOps(event);
}

} catch (ClosedChannelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

在进行事件注册时调用key = handle.get_channel().register(socket_selector, event);后一直没有返回。请各位大侠帮帮忙指点下是什么问题,小弟感激不尽…………
...全文
145 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolcpz 2014-06-16
  • 打赏
  • 举报
回复
感觉像是select的时候进行register会阻塞,直到select返回,但是奇怪的是我select是有超时返回的,还是会出现很长时间阻塞在register函数,后来通过判断select的返回值,如果是没有事件则延时500毫秒,问题解决,但这样对于网络事件处理的性能影响很大,但没办法了,想不到是什么原因导致,只能够这样先解决了。
coolcpz 2014-06-10
  • 打赏
  • 举报
回复
在注册事件的时候其它地方没有执行register操作,只是开了一个线程进行SELECT ----------------------------------------------- connection.connect(remote_addr); msg_processer = processer; if (connection.isConnected()) { connection.configureBlocking(false); poller.register(this, Socket_Event_Poller.Socket_Event_Read); return SMS_ErrorCode.SMS_ERR_SUCCESS; } ------------------------------------------------- public void run() { // TODO Auto-generated method stub try { while (true){ int retVal = socket_selector.select(3); if (retVal > 0) { Iterator it = socket_selector.selectedKeys().iterator(); while (it.hasNext()){ SelectionKey sk = (SelectionKey) it.next(); it.remove(); Socket_Handle_Intf intf = (Socket_Handle_Intf) sk.attachment(); if (null == intf) { continue; } if (!sk.isValid() || (sk.interestOps() == 0)) { continue; } if (sk.isReadable()) { System.out.println("Socket OnRecive()\n"); intf.on_receive(); } else if (sk.isConnectable()) { intf.on_connect(); } else if (sk.isWritable()) { System.out.println("Socket OnWrite()\n"); intf.on_write(); } else if (sk.isAcceptable()) { intf.on_accept(); } } } else if (retVal < 0) { break; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } -----------------------------------------------------
xlight2023 2014-06-10
  • 打赏
  • 举报
回复
API原文: This method may be invoked at any time. If this method is invoked while another invocation of this method or of the configureBlocking method is in progress then it will first block until the other operation is complete. This method will then synchronize on the selector's key set and therefore may block if invoked concurrently with another registration or selection operation involving the same selector.
内容概要:本文详细介绍了一个基于C++语言开发的疫苗接种和儿童体检系统的设计与实现全过程,涵盖项目背景、目标意义、架构设计、核心功能模块、数据库实现、API接口规范、前后端代码实现及部署应用等多个方面。系统采用分层架构与模块化设计,实现了儿童信息管理、疫苗接种记录、体检数据录入、多用户权限控制、数据统计分析、异常预警、安全加密与日志审计等核心功能,并通过MySQL数据库进行数据持久化,结合Qt实现图形化界面,支持高并发、数据脱敏、多平台对接与自动化部署。项目强调数据安全、隐私保护与系统可扩展性,适用于社区医疗、疾控中心、学校及医院等场景。; 适合人群:具备C++编程基础,熟悉数据库操作和基本软件工程流程的开发人员、计算机及相关专业学生、医疗信息化项目开发者,以及希望了解完整医疗管理系统开发流程的技术人员。; 使用场景及目标:①学习如何使用C++构建完整的医疗信息管理系统;②掌握数据库设计、前后端交互、权限控制、多线程处理和GUI开发等关键技术;③应用于社区卫生服务、学校健康管理、疾控数据统计等实际业务场景,提升儿童健康管理水平;④作为课程设计、毕业设计或实际项目的参考模板。; 阅读建议:建议读者结合文档中的代码示例与数据库脚本,搭建本地开发环境进行实践操作,重点关注系统架构设计、模块解耦、安全机制与前后端交互逻辑,深入理解各功能模块的实现原理,并尝试在此基础上进行功能扩展,如接入移动端或增加AI分析模块。

51,402

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧