java 软件中加入socket 致死

云翳无名 2013-05-06 02:50:25
软件开发中加入网络通信功能,但一点击网络连接,软件就死了。网络通信部分是用线程池做的server部分.

用java开发的。网络通信部分基本上是独立的,不存在占用其它共用资源造成死锁问题,有没有遇到过类似问题的人,求解答。附部分server代码。

public class Server {
private static Logger logger = Logger.getLogger(Server.class);
private int tryBindTimes = 0; //初始的绑定端口的次数设定为0
private ServerSocket serverSocket; //服务套接字等待对方的连接和文件发送
private ExecutorService executorService; //线程池
private final int POOL_SIZE = 4; //单个CPU的线程池大小
private BaseSock bsock;

public Server() throws Exception{

this.bsock=new BaseSock();
try {
this.bingToServerPort(this.bsock.getPort());
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("开辟线程数 : " + Runtime.getRuntime().availableProcessors() * POOL_SIZE);
} catch (Exception e) {
logger.info("绑定端口不成功!");
throw new Exception("绑定端口不成功!");
}
}
private void bingToServerPort(int port) throws Exception{
try {
serverSocket = new ServerSocket(port);
//System.out.println(port);
System.out.println("服务启动!");
logger.info("服务启动!");
} catch (Exception e) {
this.tryBindTimes = this.tryBindTimes + 1;
port = port + this.tryBindTimes;
if(this.tryBindTimes >= 20){
logger.info("已经尝试很多次了,但是仍无法绑定到指定的端口!请重新选择绑定的默认端口号!");
throw new Exception("您已经尝试很多次了,但是仍无法绑定到指定的端口!请重新选择绑定的默认端口号");
}
//递归绑定端口
this.bingToServerPort(port);
}
}
//开启服务
public boolean service(){
Socket socket = null;
while (true) {
try {
socket = serverSocket.accept();
executorService.execute(new HandServer(socket));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

//内部类(继承Runnable),处理数据接收
class HandServer implements Runnable{
private Socket socket;

public HandServer(Socket socket){
this.socket = socket;
}
public void run() {

System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
logger.info("已建立新的连接。");
DataInputStream dis = null;
DataOutputStream dos = null;
.
.
.
//数据接收的部分代码

}

}
...全文
40 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
云翳无名 2013-05-12
  • 打赏
  • 举报
回复
谢谢,已经解决了,和你说的一样,另开了线程。
fei1710 2013-05-06
  • 打赏
  • 举报
回复
什么叫死了?主线程程序一直在等待网络连接。 如果你希望主线程以及返回的话,再起一个线程进行网络监听。

50,526

社区成员

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

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