通过Web应用程序启动的Java套接字连接,在服务器重新启动时重新打开

时间:2011-09-05 12:41:21

标签: java sockets tomcat netstat

我有一个在Tomcat 6上运行的Web应用程序,安装在Windows Server 2003上。此应用程序在不同的服务器上打开套接字连接以检索一些数据。这个应用程序已经工作了几个月。但由于某种原因,两次出现Web应用程序停止工作。在两次运行中,运行netstat命令(使用-ano)在Web应用程序通过套接字连接连接的端口上显示大约4.000个tcp连接(在TIME_WAIT状态)。

奇怪的事情从这里开始:我停止tomcat,一段时间后这些连接掉线(再次运行netstat)。我重新启动tomcat,这些连接都回到TIME_WAIT状态!!!

我不知道为什么重新打开这些连接。这可能是我失踪的非常明显的事情。有什么想法吗?

谢谢。

编辑:

以下是执行套接字管理的代码:

    public void openSocketConnection() throws Exception {
    socket = createSingleSocket();
    socket.setSoTimeout(5000);
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
}

/**
 * Closes socket and output input streams.
 */
public void closeSocketConnection() throws IOException {
    socket.close();
    out.close();
    in.close();
}

/**
 * Writes the input to the socket and returns the output response
 * 
 * @param input
 *            a String to write on the socket
 * @return output a String that the socket returns
 * @throws Exception
 */
public String writeReadSocket(String input) throws Exception {
    openSocketConnection();
    out.println(input);
    logger.debug("Socket Input:" + input);
    String output = in.readLine();
    logger.debug("Socket output:" + output);
    closeSocketConnection();
    return output;
}

/**
 * Method overiden by Spring. We use the method injection technique, so that we have a new socket instance in every call to openSocketConnection()
 * method
 */
public abstract Socket createSingleSocket();

调用的方法是writeReadSocket。

spring使用了最后一个方法(createSingleSocket),所以每次调用openConnection()方法都可以有一个新的Socket实例(顺便说一下,我不确定每个都有一个新的Socket是否正确请求)。在Spring配置文件中,我有:

<!--  prototype scope is used to instantiate a new socket instance in every createSingleSocket() method call. -->
<bean id="socket" class="java.net.Socket"  scope="prototype">
    <constructor-arg type="String" value="${socket.url}"/>
    <constructor-arg type="int" value="${socket.port}"/>
</bean>

<bean id="socketConnector" class="gr.diassa.dsjsonrpcsuite.socket.SocketConnector">
    <lookup-method name="createSingleSocket" bean="socket"/>
</bean>

1 个答案:

答案 0 :(得分:2)

请检查几件事

  1. 使用完毕后请确保已关闭客户端套接字。
  2. 创建套接字时,请指定正确的超时。