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

标签 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

服务器.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 对象的整个链接都被获取 splinter 的。因为,form action="connect" 已完全执行,服务器已启动,并且它不会等待客户端 建立连接。

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

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

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

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

如何使 printWriter 语句起作用?以某种方式保持 JSPServer.java 之间的连接处于 Activity 状态。让Servlet/JSP持续监听Server.java

index.jsp View index.jsp

connect.java servlet View connect.java

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

最佳答案

不要那样做。将 HTTP 请求/响应相关状态传递到 HTTP 线程之外的不同线程会导致灾难。一旦servlet doXxx()方法返回,然后请求/响应对象及其所有相关状态都会被垃圾化(仅仅因为它们完成了基于 HTTP 的工作)并变得不可用(因此任何尝试使用它们只会导致意外的行为或异常,例如IllegalStateException)。 Never do that .

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

请注意,这个 API 的级别非常低,几乎与 HTTP 一样低。例如,在 Servlet API 中,您有“ session ”范围可供直接使用,并且您可以轻松识别用户和所有内容,但在 WebSocket API 中则不然。您必须自己(重新)发明和编码所有范围/层。如果可以的话,宁愿选择现有的库/框架。比如Java EE自带的MVC框架JSF有几个可用于该作业的库(插件),例如 OmniFaces <o:socket>标签是 demonstrated在这里(并且真正由您开发)。

另请参阅:

关于java - 让 PrintWriter 在 Servlet 执行后工作 - 当serversocket接受连接时由套接字客户端调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853147/

相关文章:

java - 创建数组列表/zip列表中的两个数组java

java - Java程序,用于测试Internet连接

c++ - 非阻塞的系统/套接字并发?

c++ - 在 Windows Phone 平台上选择返回 -1 的函数

java - Java中的状态栏

mysql - JSP执行select查询不显示结果

java - 仅 "javaw.exe"是否足以在未安装 JRE 的 Windows 机器上运行简单的 Java 应用程序?

java - Android 错误 : invoke a null object. JSON/Volley

java - 如何运行 Endomondo 移动应用程序的 "Start tracking" Activity

eclipse - 当我放在单独的文件夹中时 Jsp 没有编译