小弟没写过几次基于SOCKET的网络程序,前几日帮同学做毕设,有点疑惑,虽然顺利完成了,但自我感觉方法不是很好,希望高手解答下第一个问题是关于JAVA和数据库的问题,服务器端在客户端登陆等情况下需要访问数据库,请问这个数据库是服务器端启动的时候就链接上直到服务器关闭好,还是在需要用到数据库是再进行连接-〉使用数据库-〉关闭数据库这种模式好?第二个问题是关于TCP协议的:已经知道TCP协议是可靠发送了,但是如果网络突然中断是否会导致程序阻塞呢?顺带问一句,原来写程序是在需要的地方插入SEND语句发送数据,我个人感觉这个方法不是特别好,看了前人的帖子,说是用一个发送队列来保存信息,然后单独建立一个发送线程来读取并发送,但是我担心这样操作会不会导致程序转发的时延增加?第三个问题是关于SOCKET连接关闭的问题:这个问题小弟一直处理不好,本来打算客户端断开连接之前给服务器端发送一条关闭命令,在服务器端关闭,但是无法做到与客户端同时关闭。。客户端会应为socket连接的关闭而捕获错误信息虽然可以用屏蔽捕获信息的方法,是客户端不报错,但个人感觉不是好的方法,请高手指点第四个问题还是关于SOCKET连接异常断开的问题:原来一直使用屏蔽的方式使SOCKET断开时不报错,但是还是希望能够在于服务器断开时处理下消息,请问应该判断捕获的信息,并处理,虽然知道参数   Exception e 包含了错误信息,但是不知道怎么处理,如果可以的话,能不能给我一个处理的实例本人刚大学毕业,即将跨入工作行列,对JAVA也只是出于可以用API写程序的程度,对于一些深层次的东西,不太理解,学校老师对于这些也不是很了解,无奈之下只能来请教各位大大了

解决方案 »

  1.   

    我遇到项目,一般设计成服务器端启动的时候建立一个连接DB的Pool,客户端的请求可以直接从pool里取一个DB连接用
    但是,如果你的项目需要的DB操作次数很少,可以考虑每次需要的时候再连接
    这些都是具体情况具体分析的基本上都是关于socket关闭的,个人认为想“和平”解决问题是不可能的,没法保证socket两端同时关闭
    Exception正是通知对方关闭的方式
    即使是c语言,也没有办法商量好同时关闭,也是一端关闭,另一端read到异常(只不过不是Exception而已)
    至于最后的问题,如果你的意思是想处理关闭时候的通知客户端为啥断开,例如server需要重启啊,master数据变更需要客户端重新连接啊,客户端长时间未操作服务器强行踢出等,可以采用自动发消息的方式
    当然了,这属于业务问题,而不是技术问题从技术层面讲,socket断开,就是一个Exception,仅此而已
    欢迎楼下继续分析
      

  2.   

    受教了
    请问下如何除了这个Exception呢?
      

  3.   

    请问下如何处理这个Exception呢?
      

  4.   

    catch住就行了,然后去处理客户端与服务端断开的业务,例如打log,清session,释放不必要的内存之类的,总之就是做扫尾工作不过,不建议直接catch Exception或者Throwable
    根据你的业务,分别catch各个小的Exception,这样才能区分出来哪里是断开的,哪里是出了其它问题(例如NullPointException,ClassNotFoundException)
      

  5.   

    C/S架构的程序,服务端的程序,是要响应多个客户端程序的。
    所以,程序设计的时候,也会按照这个思路来进行。第一个问题:数据库的链接,应该在服务端程序刚开始启动的初始化阶段,预先创建好的。
    一般会存在数据库连接池这种数据结构,针对数据库连接进行统一管理。第二个问题:发送过程,是否会处于阻塞状态。对于程序员来讲,两种方式,是可以自由选择的。通常情况下的程序代码,是采用阻塞方式来收发信息的。(但是,对于线程来讲,这样对线程的利用率会很低。像迅雷等支持BT下载的软件,都是一个线程处理几百上千的链接的读写操作。)
    至于是否创建发送缓冲区(即楼主说的队列),以及是否采用异步线程发送,这个也要根据具体情况来分析。两种方式都可行,线程切换所用的时间并不长。一个线程,一秒钟的时间,会有近100次的运行机会。第三个问题:服务端和客户端同时关闭Socket连接,这几乎是不可能的。
    客户端程序可以保存整个运行期间的阶段信息,比如,可以把整个运行周期,分成初始化、登陆、使用、退出等几个阶段。针对不同阶段,Socket断开了,采用不同的处理方式即可,没必要所有情况都将异常屏蔽。第四个问题:回答同上。
    (复杂一点,可以引入事件处理机制,针对不同类型的事件进行处理。)以上纯属愚见,
    静待楼下高手见解。