1. WebSocket の概要
株価、オンライン チャット、Weibo など、高度なリアルタイム データを必要とする一部のシステムでは、データのリアルタイム プッシュを実現する必要があります。リアルタイム プッシュを実現する通常の方法は次のとおりです:
1. ポーリング: 時々データを送信します (webqq など) 2. ソケット: 以前は、通常の Web ページはメッセージ
を受信するためのソケットをサポートしていませんでした。フラッシュまたはアプレットをソケット クライアントとして使用できます 3. 長時間接続: TCP 接続を維持している間、データ パケットが送信されない場合、双方が TCP 接続上で複数のデータ パケットを連続的に送信できることを意味します。この接続を維持するには、通常、自分で行う必要があります
オンラインで維持する必要があります。
------------------------------------------------ --------------------------------------------------
window.WebSocket (Firefox では window.MozWebSocket) を介した非 http 双方向接続を提供します。この接続は、colse が表示されない限り、リアルタイムかつ永続的です。
これは、クライアントがソケットを開いて接続を要求している限り (1 回だけ)、サーバーは状態
を手動で検出して維持する必要がなく、リアルタイムでメッセージを受信および送信できることを意味します。 WebSocket が提供するメソッドとプロパティ
は、firebugにWindow.WebSocket.prototypeと入力すると確認できます。
実装するには、ここではJavaで実装します。 ステップ 1: Jetty をダウンロードし、解凍して任意のディスクに置きます。 Jetty7 以降は WebSocket のみをサポートします。ダウンロード アドレス: download.eclipse.org/jetty/stable-7/dist/
ステップ 2:Eclipse をダウンロード
(MyEclipse は推奨されません。より面倒です。インストール
する必要があります)他のプラグイン)、jetty7 をサポートする必要があり、バージョンが高いほど優れています。ステップ 3: Eclipse にプラグインをインストールします。ヘルプ ---新しい ソフトウェアをインストールします...----URL は次のとおりです: eclipse-jetty.sourceforge.net/update/
ステップ 4:新しい動的 Web プロジェクト ステップ 5: 次のコードにコピーします:TailorwebsocketServlet.java Rreeee
Test.htmlrreee web.xml
var location = "ws://localhost:port/serlet/xxx"; //服务端处理的servlet var webSocket = new WebSocket(location); //webSocket.readyState var readyStates = { "CONNECTING":"正在连接“, ”OPEN“ : "已建立连接", "CLOSING":"正在关闭连接", "CLOSED":"已关闭连接" } webSocket.send(data);//发送数据到服务端,目前只支持文本类型。JSON.stringify(data);JSON.parse(data); webSocket.onMessage = function(event){ var data = event.data;//从服务端过来的数据 } webSocket.onOpen = function(event){ //开始通信 } webSocket.onClose = function(event){ //结束通信 } webSocket.close();
package com.test; import java.io.IOException; import java.util.Date; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocketServlet; public class TailorWebSocketServlet extends WebSocketServlet { private static final long serialVersionUID = -7289719281366784056L; public static String newLine = System.getProperty("line.separator"); private final Set<TailorSocket> _members = new CopyOnWriteArraySet<TailorSocket>(); private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); public void init() throws ServletException { super.init(); executor.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("Running Server Message Sending"); for(TailorSocket member : _members){ System.out.println("Trying to send to Member!"); if(member.isOpen()){ System.out.println("Sending!"); try { member.sendMessage("from server : happy and happiness! "+new Date()+newLine); } catch (IOException e) { e.printStackTrace(); } } } } }, 2, 2, TimeUnit.SECONDS); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { getServletContext().getNamedDispatcher("default").forward(request, response); } public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) { return new TailorSocket(); } class TailorSocket implements WebSocket.OnTextMessage { private Connection _connection; public void onClose(int closeCode, String message) { _members.remove(this); } public void sendMessage(String data) throws IOException { _connection.sendMessage(data); } public void onMessage(String data) { System.out.println("Received: "+data); } public boolean isOpen() { return _connection.isOpen(); } public void onOpen(Connection connection) { _members.add(this); _connection = connection; try { connection.sendMessage("onOpen:Server received Web Socket upgrade and added it to Receiver List."); } catch (IOException e) { e.printStackTrace(); } } } }
ステップ6:
3. パフォーマンス
このタイプの接続では、さまざまなサーバーによって要求されるパフォーマンスも異なります。Java では、JDK の bin ディレクトリの Jconsole を通じて、単一のサーバーのメモリ消費量を確認できます。接続は約 2.5M ですが、同時実行の量はまだテストされていません。ここにはこれ以上の写真はありません
以上がJetty7に実装されたhtml5 WebSocketのコード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。