Websocket入門
4631 ワード
WebsocketはHtml 5の興起に伴ってこんなに長い間、私はずっとwebsocketの奥義を探りたいと思っていました.しかし、いつも関連資料を見る時間がありません.今日は用事がないような気がします.しかも少し暇で、他の人のブログを見ました.Websocketのコード層での実現を基本的に理解した.これからやるのはwebsocketの原理についてです.まずwebsocketに関するチャットプログラムを書きましょう.もちろんこのチャットプログラムもj 2 eeに基づいています.クライアントはオリジナルのjsで実現する.まずwebsocketを使いたいなら、jdkのバージョンは必ず1.7以上です.Websocketは1.7以降の新しい特性です.では、コードレベルの開発を始めましょう.
まずサーバ側プログラムを確立する..
WebSocketServicelet、もちろん注釈を使って実現することもできます.ここで注釈のコードは書きません.servletの作成後はもちろんservletを構成する.Webでlファイルでの構成
次はクライアントのコードを書きます.index.html
まずサーバ側プログラムを確立する..
package com.system.maylor.test;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
public class WebSocketTest extends WebSocketServlet {
private static final long serialVersionUID = -4853540828121130946L;
private static ArrayList<MyMessageInbound> mmiList = new ArrayList<MyMessageInbound>();
@Override
protected StreamInbound createWebSocketInbound(String str,
HttpServletRequest request) {
return new MyMessageInbound();
}
private class MyMessageInbound extends MessageInbound {
WsOutbound myoutbound;
@Override
public void onOpen(WsOutbound outbound) {
try {
System.out.println("Open Client.");
this.myoutbound = outbound;
mmiList.add(this);
outbound.writeTextMessage(CharBuffer.wrap("Hello!"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClose(int status) {
System.out.println("Close Client.");
mmiList.remove(this);
}
// ,
@Override
public void onTextMessage(CharBuffer cb) throws IOException {
System.out.println("Accept Message : " + cb);
for (MyMessageInbound mmib : mmiList) {
CharBuffer buffer = CharBuffer.wrap(cb);
mmib.myoutbound.writeTextMessage(buffer);
mmib.myoutbound.flush();
}
}
@Override
public void onBinaryMessage(ByteBuffer bb) throws IOException {
}
}
}
サーバ側にservletを作成し、WebSocketServicelet、もちろん注釈を使って実現することもできます.ここで注釈のコードは書きません.servletの作成後はもちろんservletを構成する.Webでlファイルでの構成
<display-name>Websocket</display-name>
<servlet>
<servlet-name>wsServlet</servlet-name>
<servlet-class>com.system.maylor.test.WebSocketTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>wsServlet</servlet-name>
<url-pattern>/wsServlet</url-pattern>
</servlet-mapping>
上記の構成情報をあなたのwebに追加します.xmlファイルで..これでサーバ側のwebsocketが成功しました.次はクライアントのコードを書きます.index.html
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Tomcat WebSocket Chat</title>
<script>
// websocket
var ws = new WebSocket("ws://localhost:8080/Websocket/wsServlet");
// ws
ws.onopen = function() {
};
//
ws.onmessage = function(message) {
document.getElementById("chatlog").textContent += message.data + "
";
};
function postToServer() {
ws.send(document.getElementById("msg").value);
document.getElementById("msg").value = "";
}
function closeConnect() {
ws.close();
}
</script>
</head>
<body>
<textarea id="chatlog" readonly></textarea>
<br />
<input id="msg" type="text" />
<button type="submit" id="sendButton" onClick="postToServer()">Send!</button>
<button type="submit" id="sendButton" onClick="closeConnect()">End</button>
</body>
</html>
このように基本的に1つのホールでチャットするプログラムはすでに完成した.サーバーを起動します.複数のブラウザを開きます.同時にindexにアクセスします.htmlインタフェースあるブラウザがメッセージを送信すると、他のブラウザや他のインタフェースでこのメッセージを受け取ることができます.これは比較的簡単なチャットプログラムだからです.しかし、最近やったsocketベースのチャットプログラムを考えてみましょう.このようなコードは確かに簡潔になった.socketでプログラミングする場合は、少なくとも2つのスレッドを開く必要があります.接続要求をリスニングするスレッド..もう1つのスレッドは、あるsocketからのメッセージの処理時に、サーバからのすべてのsocketへの転送を傍受するために使用される.Websocketもこのような方法で実現したのではないかと思います.しかし、少なくともコードの簡潔さの面では、コードを読みやすくなりました.また、websocketがスマートだと感じている点は、接続が切断されたとき、サーバがこの2つの接続が切断されたことを知っていることです.そして、対応する処理を行う.一方、socketはクライアントsocketの切断要求を傍受しません.クライアントがendを手動で送信し、サーバ側がend文字を受信すると、クライアントsocketが切断されたと認定するなど、クライアントが特殊な文字を手動で送信する必要があります.以上は私のsocketについての体験でしょう.悪いところがあったら指摘してください.批评