在Servlet执行后使PrintWriter工作 - 当serversocket接受连接时由套接字客户端调用

时间:2016-06-16 07:57:01

标签: java sockets jsp servlets printwriter

我有一个index.jsp文件,一个connect.java servlet和一个Server.java文件,用于创建聊天服务器。

的index.jsp

<form action="connect">
    <textarea name="chat-window" ></textarea>
    <input name="port-number" placeholder="enter-port"/>
    <select name="action-type">
        <option> start </option>
        <option> stop </option>
        <option> refresh </option>
    </select>
    <button name="apply-btn" type="submit"> apply </button>
</form>

连接servlet

// creates new thread(runnable) to run Server.java and 
// passes portNumber, printWriter object generated by response.getWriter() to Server.java

Server.java

// creates serverSocket on portNumber
try {
    serverSocket = new ServerSocket(portNumber); 
} catch (IOException e) {
    showException("Server.startRunning(): new ServerSocket() ", e);
}

printWriter.println("Server is online at " + portNumber + " \n");

打印Server is online at XXXX

但是,在此之后,我认为printWriter变得无法使用,也许index.jsp页面到线程Server.java对象的整个链接都会被破坏。因为form action="connect"已完全执行且服务器已启动,并且它不会等待clients连接。

现在,如果我向Server.java添加以下内容

while(true) {
    try {
        clientSocket = serverSocket.accept();
        printWriter.println("Client Connected.");
        // JOptionPane.showMessageDialog("Client Connected.", null);
    } catch() {
        // Exception handling mechanism
    }
}

如果,现在,client连接到ServerprintWriter语句不会打印任何内容(可能是因为实际的网页需要刷新,但为什么?如果这是问题,我怎么能让它变得动态?)。

我可以验证client是否已成功连接,因为如果我取消注释JOptionPane语句,则会显示client何时连接。所以,客户端没有问题。

如何使printWriter声明有效?不知何故,保持JSPServer.java之间的联系。使Servlet / JSP持续监听Server.java

index.jsp视图 index.jsp

connect.java servlet视图 connect.java

  1. 我对这个问题没有完美的称号。
  2. 如果这是不可能的,请写一个替代方案。

1 个答案:

答案 0 :(得分:1)

不要这样做。将HTTP请求/响应相关状态传递给HTTP线程之外的其他线程是灾难的秘诀。一旦servlet doXxx()方法返回,那么请求/响应对象及其所有相关状态都被包含(仅仅因为它们已经完成了基于HTTP的作业)并且变得无法使用(因此任何尝试使用它们)无论如何只会导致意外行为或例外IllegalStateException)。 Never do that

至于打开持久双向客户端 - 服务器套接字连接的具体功能要求,在搜索解决方案时,您似乎会将桌面应用程序与Web应用程序混淆。您在那里的代码仅适用于桌面应用程序。 对于Web应用程序,您需要使用Web套接字。在客户端(window.WebSocket API)使用JavaScript tutorial here,在服务器端使用Java EE javax.websocket APIJSR356)(tutorial here

请注意,此API级别非常低,几乎与HTTP一样低。例如,在Servlet API中,您有&#34; session&#34;范围可供直接使用,您可以轻松识别用户和所有用户,但不能在WebSocket API中识别。您必须自己(重新)发明并编写所有范围/层。如果可以,而是去现有的库/框架。例如,Java EE自己的MVC框架JSF有几个可用于该作业的库(插件),例如OmniFaces <o:socket>标记,这里是demonstrated(由你自己开发的。)

另见: