首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > 工作小结
【标  题】:工作小结
【关键字】:
【来  源】:http://www.cublog.cn/u/21990/showart.php?id=277540

工作小结

又周末了,转眼来了两周了,刚好刚才程序从功能上全部达标(不知道经得起野蛮的测试不,汗!),歇一下,顺便总结总结。

NBS(Node Balance System)为在线句典写的一个负载均衡程序,写得相当郁闷。想起来难点主要有三个:
1、好久没写程序了,Java都丢了十个月了,然后马上就开始使用,而且上来就使用了Socket和多线程。也许吧,本来我就这水平。

2、对Socket的机制理解不透,主要表现为:
     1)一开始就迷糊的是它的InputStream的read方法到底何时返回-1。JavaDoc解释说当读到流的末尾时返回-1,这又是什么意思?不是读完流后再读就阻塞么?既然如此,究竟什么时候返回-1?当Socket断开时是抛出异常也不是返回它。

     2)有这么个需求:用户输入的是以\r\n分隔的query,我不知道用户一次会递交多少个query,因此也不知道读取的数据有多长,也不知道啥时候结束,那么,我到底什么时候结束读取请求,从而能够将来自node的响应中转给用户?在NBS的一个版本中我采用的是开两个线程,一个负责读请求到缓冲区,读一点向node发送一点,直到某次读取时缓冲区没读满或者Socket断开;而与此同时,另一个线程一直在监听来自node的消息,监听到随时中转给客户。

对于这种作法老大不甚满意,因为每个node要开两个线程,开销太大。但是我表示没有办法,因为Socket上的IO都是阻塞式的,不能一个线程能边读还能边回写数据。老大问有没有非阻塞的IO。这在nio包里的确有,类似linux里的select机制,但是那是一个线程监听多个端口用的,不符合这里的需求。再说了,我尝试从用户读数据未果后我该干啥?我没啥可干,我总不能一直尝试吧,那CPU还不得乖乖100%,所以非阻塞方式不行。

不过现在的版本倒是解决了这个问题,只使用一个线程,读取一个query后马上去将来自node的回应数据中转给客户。这其实相当简单(唉,事后诸葛亮而已,当时我咋就要郁闷这么久呢),就把客户Socket上的流用BufferedReader包装一下,它自会为你缓存用户的请求,你一次读取一行就立马能返回,如果Socket断开则返回null,既不阻塞又能知道啥时候结束服务。但是,这又带来一个问题:如果客户忘了关Socket呢,那么,我这个node就是他的私人服务器了,这是极其危险的事。唉,这个问题留待下一版本吧。

3、对多线程理解不透。老大要求使用线程池,不能一个用户请求来了再开线程,那开销太大了。我之前对线程本身都没理解,也没怎么用过,现在要用线程池!据说JDK有现成的,本着“不重复造车轮”的思想,我去读JavaDoc,结果失望地发现不符合我的需求,我要求对线程池里的线程有复杂紧密的控制,包括其行为和生命期。事实上,我发现我的需要并不真正是一个线程池,而是N个线程,有node加进了,就新开线程,node挂了,该线程就得结束。

未完-----------没车了!
dedecms4的utf8改版中文截取出错解决函数:【上一篇】
CommunityServer2007改变授权策略, 不再有免费的午餐了:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • detete 删除数据
  • Cisco Secure PIX Firewall Exam (CSPFA 642-521)
  • 清空iis log 中自己登录ip的vbs
  • 用Visual C++编程实现局域网多播
  • MySQL-python-1.2.0 安装
  • PHP自动更新新闻DIY 
  • 自动上传Auto-FTP&Mirror的介绍与使用
  • 最近做开发时写的文件和字串处理函数..............
  • 将一个网页嵌入到邮件里,也就是将网页当个正文显示在邮件里
  • 以最强烈的愤恨控诉流氓软件的罪行
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.