我有一个 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
连接到Server
,printWriter
语句不会打印任何内容(可能是因为实际的网页需要要刷新,但为什么?如果这是问题,我怎样才能使其动态化?)。
我可以验证客户端
是否已成功连接,因为如果我取消注释JOptionPane
语句,它会显示客户端
何时连接。因此,客户端没有问题。
如何使 printWriter
语句起作用?以某种方式保持 JSP
和 Server.java
之间的连接处于 Activity 状态。让Servlet/JSP持续监听Server.java
- 对于这个问题,我没有一个完美的标题。
- 如果这是不可能的,请写一个替代方案。
最佳答案
不要那样做。将 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/