1.需要Tomcat7.0所以服務器 2.需要JDK7.0 3.手工加入Tomcat7.0中lib目錄下的一下三個包catalina.jar、tomcat-coyote.jar、websocket-api.jar 4.項目部署后,請將服務器中當前項目下的catalina.jar、tomcat-coyote.jar、websocket-api.jar三個包刪除。 5.項目目錄結構如下
Servlet代碼
package com.yc.websockets;
import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.util.ArrayList; import java.util.List;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint;
import org.apache.catalina.websocket.MessageInbound; import org.apache.catalina.websocket.StreamInbound; import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
@SuppressWarnings({"deprecation","unused", "serial"})
public class WebSocketTest extends WebSocketServlet { private static List userList = new ArrayList(); private HttpSession session;
@Override
protected StreamInbound createWebSocketInbound(String str, HttpServletRequest request) { session=request.getSession(); return new MyMessageInbound(); }
private class MyMessageInbound extends MessageInbound { WsOutbound myoutbound;
/** * 當用戶登錄時,WebSocket握手完成,創建完畢,WsOutbound用於向客戶端發送數據 */ public void onOpen(WsOutbound outbound) { try { System.out.println("Open Client."); this.myoutbound = outbound; userList.add(this); //添加當前用戶 //向客服端發送信息 outbound.writeTextMessage(CharBuffer.wrap("Hello!")); } catch (IOException e) { e.printStackTrace(); } }
/** * 用戶退出時,WebSocket關閉事件,參數status應該來自org.apache.catalina.websocket.Constants * 中定義的幾個常量,可以參考文檔或者核對一下Tomcat的源碼 */ @Override public void onClose(int status) { userList.remove(this); //移除當前用戶 }
/** * 接受用戶發過來的信息,有文本消息數據到達 */ @Override public void onTextMessage(CharBuffer cb) throws IOException { for (MyMessageInbound mmib:userList){ //循環向所有在線用戶發送當前用戶的信息 CharBuffer buffer = CharBuffer.wrap(cb); mmib.myoutbound.writeTextMessage(buffer); //調用指定用戶的發送方法發送當前用戶信息 mmib.myoutbound.flush(); //清空緩存 } }
/** * 有二進制消息數據到達,暫時沒研究出這個函數什么情況下觸發,js的WebSocket按理說應該只能send文本信息才對 */ @Override public void onBinaryMessage(ByteBuffer bb) throws IOException { } } }
web.xml配置文件
webServlet com.yc.websockets.WebSocketTest webServlet /webServlet index.html
index.html
<script> //設定WebSocket,注意協議是ws,請求是指向對應的WebSocketServlet的 /*設定WebSocket,注意協議是ws,請求是指向對應的WebSocketServlet的 var url = "ws://127.0.0.1:8080/j2ee6/echo.ws"; // 創建WebSocket實例,下面那個MozWebSocket是Firefox的實現 if ('WebSocket' in window) { ws = new WebSocket(url); } else if ('MozWebSocket' in window) { ws = new MozWebSocket(url); } else { alert('Unsupported.'); return; }*/ var ws = new WebSocket("ws://218.196.14.208:8080/webSocket/webServlet");
//WebSocket握手完成,連接成功的回調 //有個疑問,按理說new WebSocket的時候就會開始連接了,如果在設置onopen以前連接成功,是否還會觸發這個回調 ws.onopen = function() { //請求成功 };
//收到服務器發送的文本消息, event.data表示文本內容 ws.onmessage = function(message) { document.getElementById("talkInfo").innerHTML+=message.data+"
"; };
//關閉WebSocket的回調 ws.onclose = function() { //alert('Closed!'); };
// 通過WebSocket想向服務器發送一個文本信息 function postToServer() { ws.send(document.getElementById("content").value); document.getElementById("content").value = ""; }
//關閉WebSocket function closeConnect() { ws.close(); } </script>
轉自:http://www.2cto.com/kf/201505/397573.html