当前位置:编程学习 > JAVA >>

socket 编程

  我用JAVA来作服务,socket编程,接收多个客户端发来的数据,有平板的,有单片机的,刚开始还可以正常工作,可是工作了几天后就开始出问题了,客户端可以正常连接到服务器,因为受单片机能耗的问题,此间客户端会频繁的连接服务器,基本上是5分钟连接一次,但服务器克接收不到客户端的信息,也得不到客户端的连接信息上,重启一下这个服务端,就一切正常,我听朋友说,有可能是因为程序处理不当造成资源耗尽的问题,但小弟现在实在是无从下手,有没有什么好的工具或者其它办法来测试这个问题, --------------------编程问答-------------------- 通讯可以试着用成熟的框架,如Netty,Mina。
这样就可以减少因为自己的因素而出错。
毕竟框架是很多大牛努力的结晶。 --------------------编程问答--------------------
引用 1 楼 Inhibitory 的回复:
通讯可以试着用成熟的框架,如Netty,Mina。
这样就可以减少因为自己的因素而出错。
毕竟框架是很多大牛努力的结晶。


正解,框架都是千锤百炼的了...除非是需求很特殊才会独立去写,不然用别人写的框架,出错的概率也会降低,当然开源的框架是更好的选择,因为有时候我们遇到特殊问题要重写一些方法等等... --------------------编程问答-------------------- 是不是阻塞了啊
socket编程要考虑的还是挺多的 --------------------编程问答-------------------- 首先:
◎ 下次出现这种情况时,先把线程堆栈dump出来看看;
◎ 把服务器上的网络连接情况抓下来,Windows跟Linux命令不同,要自己去Google下;

其次:
◎ 重启服务端指的仅仅是Java本身还是整台服务器?
◎ 服务器端的代码有无关于超时控制的机制? --------------------编程问答-------------------- 目测是连接数超了
如果时间赶,可以设置连接池数量 设置大点 另外就是响应时间设置长点
长远考虑 最好就是用LS说的通信框架 这样可以尽量减少线程并发带来的消耗和堵塞 --------------------编程问答-------------------- 这种情形服务器端应该出异常了,检查日志 --------------------编程问答-------------------- 目测应该是服务端某些资源没有及时释放造成的。

这些资源有可能是:数据库连接、TCP连接、处理线程。等。

数据库(尤其是采用连接池时)连接在频繁被获得、进行操作后,未能进行释放,造成处理线程阻塞,进而客户端无响应。

TCP连接(尤其是NIO方式)在频繁创建、传输消息后,未能进行释放,造成客户端无法连接服务端。

处理线程,在处理过程中,未能正常结束,导致线程无法正常回收,在系统中存在大量的僵尸线程,严重影响系统效率。如果是在应用服务框架中(比如Tomcat等),会达到最大线程数,造成服务端拒绝访问。
--------------------编程问答--------------------
引用 1 楼 Inhibitory 的回复:
通讯可以试着用成熟的框架,如Netty,Mina。
这样就可以减少因为自己的因素而出错。
毕竟框架是很多大牛努力的结晶。


++ --------------------编程问答-------------------- 我这没有什么好的工具可以提供给你,我这只有一些土办法。
首先,去进程列表里面,看看当前的Java进程里面,一共有多少个线程。

其次,如果是Web项目,你编写一个JSP页面,这个页面,也可以列举出当前JVM进程中的所有线程,以及线程名。编写JSP页面,列举某个线程的堆栈信息,具体线程ID通过参数传递进来。这样,就可以观察指定线程的当前堆栈情况了。

通过线程的堆栈信息,可以找出一些具有特点的地方。可以基本定位某些问题。 --------------------编程问答--------------------
引用 1 楼 Inhibitory 的回复:
通讯可以试着用成熟的框架,如Netty,Mina。
这样就可以减少因为自己的因素而出错。
毕竟框架是很多大牛努力的结晶。

谢谢,我这边已经准备用Mina框架来重新做了, --------------------编程问答--------------------
引用 3 楼 aotian16 的回复:
是不是阻塞了啊
socket编程要考虑的还是挺多的

是阻塞了,服务器开的时间越长,我只开了100个线程,应该是达到限额了 --------------------编程问答--------------------
引用 4 楼 ldh911 的回复:
首先:
◎ 下次出现这种情况时,先把线程堆栈dump出来看看;
◎ 把服务器上的网络连接情况抓下来,Windows跟Linux命令不同,要自己去Google下;

其次:
◎ 重启服务端指的仅仅是Java本身还是整台服务器?
◎ 服务器端的代码有无关于超时控制的机制?

已经在看堆栈信息,重启的只是JAVA本身,
电脑是没有问题的,
设置的有100秒的超时处理 --------------------编程问答-------------------- 查看一下僵尸线程的堆栈情况。里面不是资源没释放就是死锁了。 --------------------编程问答--------------------
引用 13 楼 preferme 的回复:
查看一下僵尸线程的堆栈情况。里面不是资源没释放就是死锁了。

感觉也像是线程没释放的问题,连接数多了,服务器就收不到数据了,但是客户端提示是正常连接着的 --------------------编程问答-------------------- 除
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,