gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:47:44 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com