收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 


mianhua520的笔记
状态: 离线
人气:26622
访问用户量:21
笔记经验:
总积分:175
级别:普通会员
搜索本笔记
ta的交流分类
ta的交流主题贴(5)
ta的所有交流贴(5)
ta的全部笔记
全部笔记(5)
未分类笔记(3)
web前端开发(1)
java(1)
存档
2014-06(2)
2014-05(3)

2017-03-19 15:30:07
java socket连接池的问题
浏览(4960)|评论(1)   交流分类:Java|笔记分类: java

java socket连接池的问题

应用场景:

前端使用JSF作为表现层,浏览器客户端发出请求时我必须先通过socket与集群服务器进行通信之后在将服务器的响应信息进行解析再展现给客户端,为了减少系统开销,我打算在socket这一层使用socket连接池的方式实现。

但是目前遇到一个问题,我从池中取出一个socket后不能判断出该socket是否已经被服务器端关闭了连接,如果服务器端已经关闭了连接,我必须创建一个新的socket,然后对上一次发送失败的请求进行重发处理。

但是,在判断socket是否已经被服务器端关闭这一点,开始是实在做不到

JAVA API中的socket.isClosed(),socket.isConnected(),以及socket.sendUrgentData()检测的方式都不起作用。

解答:

 

java代码:
package com.duoguo.util;  
import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.Socket;  
import java.util.LinkedList;  
import java.util.List;  
/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/  
public class ConnectionPoolHandler implements Runnable {  
private Socket socket;  
@SuppressWarnings("unchecked")  
private static List pool = new LinkedList();  
/**
* 处理连接
*/  
public void handleConnection() {  
try {  
PrintWriter out = new PrintWriter(socket.getOutputStream());  
BufferedReader in = new BufferedReader(new InputStreamReader(socket  
.getInputStream()));  
String line = in.readLine();  
BufferedReader bufferedReader = new BufferedReader(new FileReader(  
line));  
String value = null;  
while ((value = bufferedReader.readLine()) != null) {  
out.println(value);  
}  
bufferedReader.close();  
out.close();  
in.close();  
} catch (IOException e) {  
e.printStackTrace();  
}  
}  
@SuppressWarnings("unchecked")  
public static void processRequest(Socket socket) {  
synchronized (pool) {  
pool.add(pool.size(), socket);  
pool.notifyAll();  
}  
}  
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/  
@Override  
public void run() {  
while (true) {  
synchronized (pool) {  
while (pool.isEmpty()) {  
try {  
pool.wait();  
} catch (InterruptedException e) {  
e.printStackTrace();  
}  
}  
socket = (Socket) pool.remove(0);  
}  
handleConnection();  
}  
}  
}  
    
/**
*
*/  
package com.duoguo.socket;  
import java.io.IOException;  
import java.net.ServerSocket;  
import java.net.Socket;  
import com.duoguo.util.ConnectionPoolHandler;  
/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/  
public class PoolMultiServer {  
private int maxConnecti;// 最大连接数  
private int listenerPort;// 监听端口号  
private ServerSocket serverSocket;  
/**
* 构造方法
*
* @param maxConnecti
* :最大连接数
* @param listenerPort
* :监听端口号
*/  
public PoolMultiServer(int maxConnecti, int listenerPort) {  
this.maxConnecti = maxConnecti;  
this.listenerPort = listenerPort;  
}  
/**
* 接受连接
*/  
public void acceptConnection() {  
try {  
serverSocket = new ServerSocket(listenerPort, maxConnecti);  
while (true) {  
Socket socket = serverSocket.accept();  
handleConnection(socket);  
}  
} catch (IOException e) {  
e.printStackTrace();  
}  
}  
/**
* 处理连接
*
* @param socket
* :套接字
*/  
public void handleConnection(Socket socket) {  
ConnectionPoolHandler.processRequest(socket);  
}  
public void setUpHandlers() {  
for (int i = 0; i < maxConnecti; i++) {  
ConnectionPoolHandler connectionPoolHandler = new ConnectionPoolHandler();  
new Thread(connectionPoolHandler, "处理器" + i).start();  
}  
}  
/**
* @param args
*/  
public static void main(String[] args) {  
PoolMultiServer poolMultiServer = new PoolMultiServer(5, 9999);  
poolMultiServer.setUpHandlers();  
poolMultiServer.acceptConnection();  
}  
}  
    
/**
*
*/  
package com.duoguo.socket;  
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.Socket;  
import java.net.UnknownHostException;  
/**
* @author shyboy(chao.shen@duoguo.cn)
*
*/  
public class Client {  
private String hostIp;// 客户端主机IP  
private int hostPort;// 客户端主机端口号  
private BufferedReader in;// 客户端输入流  
private PrintWriter out;// 客户端输出流  
/**
* 构造方法
*
* @param hostip
* :IP地址
* @param hostPort
* :端口号
*/  
public Client(String hostip, int hostPort) {  
this.hostIp = hostip;  
this.hostPort = hostPort;  
}  
/**
* 建立连接
*/  
public void setUpConnection() {  
try {  
Socket client = new Socket(hostIp, hostPort);  
in = new BufferedReader(new InputStreamReader(client  
.getInputStream()));// 客户端输入流  
out = new PrintWriter(client.getOutputStream());// 客户端输出流  
} catch (UnknownHostException e) {  
System.out.println("找不到相应的主机!");  
e.printStackTrace();  
} catch (IOException e) {  
System.out.println("抛出相应的流异常信息");  
e.printStackTrace();  
}  
}  
/**
* 获取文件
*
* @param fileName
* :文件名称
* @return String
*/  
public String getFile(String fileName) {  
StringBuilder sb = new StringBuilder();  
out.println(fileName);  
out.flush();  
String line = null;  
try {  
System.out.println("客户端连接成功!");  
while ((line = in.readLine()) != null) {  
sb.append(line + "\n");  
}  
} catch (IOException e) {  
System.out.println("文件读入失败!");  
e.printStackTrace();  
}  
return sb.toString();  
}  
/**
* 断开连接
*/  
public void tearDownConnection() {  
try {  
out.close();// 关闭输出流  
in.close();// 关闭输入流  
} catch (IOException e) {  
System.out.println("断开连接失败!");  
e.printStackTrace();  
}  
}  
/**
* @param args
*/  
public static void main(String[] args) {  
Client client = new Client("127.0.0.1", 9999);  
client.setUpConnection();  
String fileContent = client.getFile("D:\\hello.txt");  
System.out.println("文件内容为:" + "\n" + fileContent);  
client.tearDownConnection();  
}  
}  

原址:http://bbs.ibeifeng.com/read-htm-tid-65934.html

精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

Java Web开发理论部分视频教程
系统掌握开发实际的Java Web应用所需的理论知识和技能(Servlet、Jsp、JavaBean、TagLib、EL、JSTL、MVC模式、连接池DataSource、JNDI等知识)。涉及项目:在线投票计数、在线人数统计、登录检查、购物车、商品管理、非法字符替换等多个随堂演示小应用。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

Ajax+JSON基础实战视频教程
数据校验、Javascript模拟多线程、下拉列表联动、操作XML、AJAX结合JSON的操作、Json-lib的使用

Javascript基础视频教程
JavaScript的内置对象--Array、String、Date、Math等,可以通过DOM对象进行对象控制,创建控制菜单及复选框的控制,创建二级联动列表框及列表框选项的移动,JavaScript项目,创建基于JS的商品管理系统。

浏览(4960)|评论(1)   交流分类:Java|笔记分类: java

评论(1)
1楼 会飞的火把  2017-03-19 引用
谢谢
请登录后评论 登录

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网