我有一个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
连接到Server
,printWriter
语句不会打印任何内容(可能是因为实际的网页需要刷新,但为什么?如果这是问题,我怎么能让它变得动态?)。
我可以验证client
是否已成功连接,因为如果我取消注释JOptionPane
语句,则会显示client
何时连接。所以,客户端没有问题。
如何使printWriter
声明有效?不知何故,保持JSP
和Server.java
之间的联系。使Servlet / JSP持续监听Server.java
答案 0 :(得分:1)
doXxx()
方法返回,那么请求/响应对象及其所有相关状态都被包含(仅仅因为它们已经完成了基于HTTP的作业)并且变得无法使用(因此任何尝试使用它们)无论如何只会导致意外行为或例外IllegalStateException
)。 Never do that。
至于打开持久双向客户端 - 服务器套接字连接的具体功能要求,在搜索解决方案时,您似乎会将桌面应用程序与Web应用程序混淆。您在那里的代码仅适用于桌面应用程序。
对于Web应用程序,您需要使用Web套接字。在客户端(window.WebSocket
API)使用JavaScript tutorial here,在服务器端使用Java EE javax.websocket
API(JSR356)(tutorial here)
请注意,此API级别非常低,几乎与HTTP一样低。例如,在Servlet API中,您有&#34; session&#34;范围可供直接使用,您可以轻松识别用户和所有用户,但不能在WebSocket API中识别。您必须自己(重新)发明并编写所有范围/层。如果可以,而是去现有的库/框架。例如,Java EE自己的MVC框架JSF有几个可用于该作业的库(插件),例如OmniFaces <o:socket>
标记,这里是demonstrated(由你自己开发的。)