WebSocket的Java服务器端编程
服务器端
WebSocket服务器端程序
package ws;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/endpoint")
public class WSEndpoint {
Session session; //javax.websocket.Session 当前会话
@OnMessage
public String onMessage(Session session,String message) {
System.out.println(message);
try {
session.getBasicRemote().sendText(message + "世界,你好!");
} catch (IOException ex) {
Logger.getLogger(WSEndpoint.class.getName()).log(Level.SEVERE, null, ex);
}
return "Hello,world!";
}
@OnOpen
public void onOpen(Session session) {
this.session = session;
//告诉StartServlet当前的websocket会话对象.
//用于StartServlet发信息给websocket网页端
StartServlet.session = session;
System.out.println("onOpen");
}
@OnError
public void onError(Throwable t) {
System.out.println("onError");
System.out.println(t);
}
@OnClose
public void onClose() {
System.out.println("onClose");
}
}
服务器端向websocket session标识的浏览器端发送信息
package ws;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.Session;
@WebServlet(name = "StartServlet", urlPatterns = {"/StartServlet"})
public class StartServlet extends HttpServlet {
public static Session session;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
if (session != null) {
session.getBasicRemote().sendText("世界,你好!从StartServlet刷新而来的信息!");
}
} catch (IOException ex) {
Logger.getLogger(WSEndpoint.class.getName()).log(Level.SEVERE, null, ex);
}
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet StartServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>刷新页面, 服务器会向WebSocket页面发送信息.</h1>");
out.println("<h1>Servlet StartServlet at "+request.getRequestURL() + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
浏览器端程序
浏览器端页面是标准的HTML5页面. 采用JavaScript编写WebSocket程序. 文件内容如下:
<!DOCTYPE html>
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="application/javascript">
var ws;
function connect() {
var target = document.getElementById('target').value;
if (target == '') {
alert('Please select server side connection implementation.');
return;
}
if ('WebSocket' in window) {
ws = new WebSocket(target);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(target);
} else {
alert('WebSocket is not supported by this browser.');
return;
}
log('websocket opened.');
ws.onopen = function () {
document.getElementById('message').value = "connected";
log('Info: WebSocket connection opened.');
};
ws.onmessage = function (event) {
log('Received: ' + event.data);
};
ws.onclose = function (event) {
log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason));
};
}
function disconnect() {
if (ws != null) {
ws.close();
ws = null;
}
}
function log(message) {
document.getElementById('message').innerHTML += message + '<br>';
}
function send(){
var message = document.getElementById('send').value;
ws.send(message);
}
</script>
</head>
<body>
<input id="target" type="text" name="target" value="ws://localhost:8080/WebsocketDemo/endpoint" size="200"/>
<div id="message" > TODO write content </div>
<input type="submit" value="连接" onclick="connect()" />
<br/>
<input id="send" type="text" name="send" value="" size="200"/>
<input type="submit" value="发送" onclick="send()" />
<input type="submit" value="关闭" onclick="disconnect()" />
</body>
</html>
运行结果
运行结果1
运行结果2
运行结果3
运行结果4, 启动StartServlet, 每次刷新都向WebSocket客户端网页发送信息
运行结果5, WebSocket客户端网页收到服务器端主动发送的信息