java socket连接池的问题

应用场景:
前端使用JSF作为表现层,浏览器客户端发出请求时我必须先通过socket与集群服务器进行通信之后在将服务器的响应信息进行解析再展现给客户端,为了减少系统开销,我打算在socket这一层使用socket连接池的方式实现。
但是目前遇到一个问题,我从池中取出一个socket后不能判断出该socket是否已经被服务器端关闭了连接,如果服务器端已经关闭了连接,我必须创建一个新的socket,然后对上一次发送失败的请求进行重发处理。
但是,在判断socket是否已经被服务器端关闭这一点,是在是做不到啊!
JAVA API中的socket.isClosed(),socket.isConnected(),以及socket.sendUrgentData()检测的方式都不起作用,麻烦由这方面经验的大哥给些指点。

1个回答

[code="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 maxConnections;// 最大连接数
    private int listenerPort;// 监听端口号
    private ServerSocket serverSocket;
    /
    *

  • 构造方法
    *

  • @param maxConnections

  • :最大连接数

    • @param listenerPort
  • :监听端口号
    /
    public PoolMultiServer(int maxConnections, int listenerPort) {
    this.maxConnections = maxConnections;
    this.listenerPort = listenerPort;
    }
    /
    *

  • 接受连接
    /
    public void acceptConnection() {
    try {
    serverSocket = new ServerSocket(listenerPort, maxConnections);
    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 < maxConnections; 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();
    }
    }

作者“shenjichao2009”

[/code]现成的代码

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java socket连接池
一个socket池<br>模拟处理并发服务器
java socket连接池 实现
NULL 博文链接:https://516100981.iteye.com/blog/2314314
C# socket连接池
哪位大虾提供个C# socket连接池的例子给我啊rn谢谢!!!!!!!!
VC socket连接池?
谁懂的,有相关的源代码吗?有的行行好。发我份。rn要改善下我的程序,以应对在很多客户端的情况下,去接受保留套接字。rn好人。。。
BIO Socket连接池
NULL 博文链接:https://c2045875.iteye.com/blog/1186064
C# Socket连接池
由线程池技术改编的socket连接池,当中包括了通过windows计数器,统计线程池性能信息。
关于socket连接池问题(请指教)
socket连接已经弄好,现在需要作成一个连接池。首先,要启动20个链接,如果这20个都被占用,那在初始化10个链接。当一个链接被占用时,标记为占用,当链接结束后,再标记为空闲(这块可以遍历链接请求,如果哪个链接空闲就去请求服务端)。请高手指点一下思路,如果能贴上代码那更好。
Socket连接池的简单应用
此文档简单介绍了Socket连接池的简单应用,以及客户端和服务端的代码实现
求一个Socket连接池
项目中药用到Socket连接池,有没有现成的第三方实现?自己写不来。。
请问socket连接池怎么实现?
我现在socket接受请求不用accept而用AcceptEx来做rn问题是,如果给一个socket被用过以后,想复用它接受请求会遇到问题rnA.把它close了,传入AcceptEx出10038的错误rnB.而不close,直接传入AccepteEx出10022的错误rn请问该怎么做连接池呢?
socket连接池加消息队列源码
自己写的socket连接池加消息队列源码,测试同时支持5000连接同时在线
关于socket连接池的小问题
1、是不是因为socket的创建(socket(***)函数)很花时间,因此才有了连接池的必要?rn2、一个socket句柄(sokcet(***)函数的返回值)在连接某个ip并且传输完毕之后,是否可以再拿来connect另外一个ip?这两个过程是否能够调用closesocket?
一篇搞懂TCP、HTTP、Socket、Socket连接池
前言 ​ 作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼,然而它们之间的关系、区别及原理并不是所有人都能理解清楚,这篇文章就从网络协议基础开始到Socket连接池,一步一步解释他们之间的关系。 七层网络模型 ​ 首先从网络通信的分层模型讲起:...
由于使用 xfire/HttpMethod 造成Socket连接池满的问题及解决办法
【转】 使用 XFire 访问webService, 运行一段时间后, 使用netstat -ano命令,发现服务器上有大量的CLOSE_WAIT连接,导致之后的WebService服务访问经常失败。 原因如下: CLOSE_WAIT是Tcp状态迁移中的一个 当服务端主动关闭而客户端没来及响应进入的一个的状态,此状态TCP层默认时间大概为2小时左右 故导致了达到最大连接数出现了假死 ...
socket连接池是否只对短连接有好处,长连接还需要吗?
我现在做的系统是长连接,而且终端向服务器连接时候都是使用的固定的IP地址和端口,比如10.10.12.54:5000.那么还需要使用连接池技术吗?用的话对系统还有什么好处吗?
高分求php下维持一个socket连接池思路及源码。
分不够再加。
谁能讲讲,socket连接池的实现方法或基本原理?(Server VS Server)
当我们在程序中启动了一个server(叫MyServer) ,这个MyServer需要跟另一个server(叫Server)之间通讯,为了增加效率需要建立一个连接池.rnrn当然,这个连接池要建立在MyServer端,当这个MyServer 忙碌或占用的时候会自动启用一个新的MyServer 或寻找闲置的MyServer.rnrn更让人烦恼的是,其实我的MyServer还是一个 server上层还有一群client rn在等着和它连接。rnrn恳请指点一下,这种连接池实现的基本方式或原理
(原创)当server碰到server,socket连接池简单实现-----第一次在csdn发表文章,多包涵:)
当我们在程序中启动了一个server,这个server需要跟另一个server(比如建立在老系统上的老的c程序)之间通讯,为了增加效率需要建立一个连接池的时候不妨考虑下我的解决方案,不足处清指正。rnrn1:SocketAdapter类,此类继承了socket,重载了socket类的close方法,目的是当用户关闭socket的时候,我们并不关闭它只是放在连接池内部。rnpackage com.tarena.socketpool;rnimport java.net.*;rnimport java.io.IOException;rn/**rn * socket连接的简单实现rn * Description: rn * Copyright: Copyright Tarena(c) 2005rn * Company: Tarenarn * @author chengxingrn * @version 1.0rn */rnpublic class ConnectionAdapter extends Socketrn /**rn * 连接状态rn */rn private boolean status=true;rn /**rn * 默认的构造函数rn */rn public ConnectionAdapter() rn super();rn rn public ConnectionAdapter(String host,int port)throws UnknownHostException,IOExceptionrn super(host,port);rn rn /**rn * 判断此连接是否空闲rn * @return boolean 空闲返回ture,否则falsern */rn public boolean isFree()rn return status;rn rn /**rn * 当使用此连接的时候设置状态为false(忙碌)rn */rn public void setBusy()rn this.status=false;rn rn /**rn * 当客户端关闭连接的时候状态设置为true(空闲)rn */rn public void close()rn System.out.println("Close : set the status is free " );rn status=true;rn rn public void destroy()rn //Close socket connectionrn close();rn // System.out.println("Close success " );rn rnrnrn
ClientSocket如果非正常断开,ServerSocket连接池里对这个客户端的连接能维护多久?
我有一个程序,各个客户端都向中心服务器建立连接。rnrn但有的时候客户端非正常退出,而ServerSocket的活动连接池里还维持着这个连接,导致我给客户端发数据时,总是出错,即使我把ErrorCode=0了,那个错误还是会弹出。rnrn我想问一下,如何能快速检测客户端已经断了。
【Java】Java 重定向的问题
 其实一直对IO流很排斥,经常会遇到自己被自己问住的情况,以这段代码为例: 1) 说一下System  out  println的关系,System是lang包下的一个静态类,public final class System,out其实是PrintStream的一个对象,这个对象被定义在了System里,print和println是这个对象的方法。默认的情况下System.out.printl...
JAVA 问题
java.lang.UnsupportedClassVersionError: Bad version number in .class filern at java.lang.ClassLoader.defineClass1(Native Method)rn at java.lang.ClassLoader.defineClass(ClassLoader.java:620)rn at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)rn at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)rn at java.net.URLClassLoader.access$100(URLClassLoader.java:56)rn at java.net.URLClassLoader$1.run(URLClassLoader.java:195)rn at java.security.AccessController.doPrivileged(Native Method)rn at java.net.URLClassLoader.findClass(URLClassLoader.java:188)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:306)rn at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)rn at java.lang.ClassLoader.loadClass(ClassLoader.java:251)rn at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)rnException in thread "main" rnrnrn在wondows下编译好的的项目放到liunx服务器上时,出现的问题,急啊
java的问题
刚学java,我应该先学什么?
java问题
package net.chappter1;rnrnimport java.io.BufferedReader;rnimport java.io.IOException;rnrnpublic class GuessNumber rn public static void main(String[] args)rn //创建一个随机生成器rn Random random=new Random();rn int randomNumber=random.nextlnt(101);rn int guessedNumber=-1;rn BufferedReader input=new BufferedReader(new InputStreamReader(System.in));rn int counter=0;rn System.out .print("");rn System.out .print(" 请输入1到100之间的整数");rn while(guessedNumber!=randomNumber)rn tryrn guessedNumber=Integer.parseInt(input.readLine());rn if(guessedNumber<0||guessedNumber>100)rn System.out.print("请输入正确的整数");rn counter++;rn continue;rn rn catch (NumberFormatException e)rn System.out.print("qingshuru");rn counter++;rn continue;rn rn catch(IOException e)rn System.out.print("程序异常");rn e.printStackTrace();rn rn if(guessedNumber>randomNumber)rn System.out.print("xiaole ");rn if(guessedNumber
Java问题
设计一个人员类(Person),以及从Person类派生出助教类(Assistant)、讲师类(Instructor)、副教授类(AssistantProfesson)和教授类(Professor)。四种类型教师的工资收入计算公式如下:rnrn工资收入=基本工资+授课时数×每课时报酬rnrn其中,助教基本工资为800元,每课时报酬25元,讲师基本工资为1000元,每课时报酬35元,副教授基本工资为1200元,每课时报酬40元,教授基本工资为1400元,每课时报酬50元。rnrn将人员类定义为抽象类,具体定义如下:rnabstract class Person rn String name;rn double salary; //工资收入rn  int hour; //课时rn  abstract double countSalary(int hour);//计算工资收入rn  abstract public String toString();//返回员工的姓名、职称、收入字符串rn  abstract public boolean equals(Person p);//与另一员工比较职称及工资收入是否一样rnrn请为四种类型教师自行设计合理的类,但必须继承自Person类,另编写一个测试类测试你所编写的类,要求输入两个员工的姓名,职称和授课时数后分别显示他们的姓名、职称、收入,并比较两人职称及工资收入是否一样。
java 问题
rn上面这是我的页面标签struts2的rnrn下面是 JS代码rn rn点击提交以后跟没写js代码一样 直接就过去了rnrn
JAVA问题
从键盘输入4个学生的成绩求平均值?怎么做啊 用java编程写 rn请哪位高抬贵手帮帮忙rn
java 的if问题
Java 用if判断rnimport java.util.Scanner;rnpublic class shu rnrn public static void main(String[] args) rn Scanner input = new Scanner(System.in);rn int tger = input.nextInt();rn if(tger%3||tger%5)//报错出现红色波浪线哦啊rn System.out.println("该整数是3或5的倍数");rn elsern System.out.println("该数不能被3或5中的任意一个数整除");rn rnrn rnrnrn
java的问题。
java属于网络编程的范畴,asp,php也属于,java能跨平台,php也可以,java能做特效,一些特效工具也可,想请问一下,java在这方面开发的优势何在,谢谢!!你的意见决定我的取向哟!再谢!!
JAVA的问题
我装了个JAVA的环境,然后改了一些东西,结果机器循环重启,我无可奈何,咋办?rn你看看我改了下面的东西。我装的是WIN2000。rnclasspathrnc:\jdk\lib\dt.jar;c:\jdk13\lib\tools.jar;c:\jdk13\bin;c:\tomcat\librnrnJAVA_HOMErnC:\JDK13rnrnPathrn%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\PROGRA~1\ULrnTRAE~1;c:\tomcat\binrnrnTOMCAT_HOMErnC:\tomcat
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池