JAvaバックグラウンドでwebsocketクライアントおよびサービス側を実現

3940 ワード

最近、websocketをバックグラウンドで実行し、プッシュを受信し続けるサービスとして登録する必要があります.
この方法を使用するには、websocketのjarパッケージを導入する必要があります.ダウンロード先:https://download.csdn.net/download/qq_39481762/10739165
まずクライアントをservletとして登録することで,バックグラウンドでプッシュを受信し続けることができる.
public class FaceSocketClientManage extends HttpServlet {

	private static final long serialVersionUID = 1L;
	public static WebSocketClient client;
	public static final String url = "ws://";

	@Override
	public void init() throws ServletException {
		super.init();
		try {
			client = new WebSocketClient(new URI(url), new Draft_17()) {

				@Override
				public void onOpen(ServerHandshake arg0) {
					// TODO Auto-generated method stub
					System.out.println("    ");

				}

				@Override
				public void onMessage(String arg0) {
					FaceSocketServer server = new FaceSocketServer();
					try {
						server.onMessage(arg0);
					} catch (IOException e) {
						e.printStackTrace();
					}

				}

				@Override
				public void onError(Exception arg0) {
					// TODO Auto-generated method stub
					arg0.printStackTrace();
					System.out.println("       ");

				}

				@Override
				public void onClose(int arg0, String arg1, boolean arg2) {
					// TODO Auto-generated method stub
					System.out.println("     ");

				}

				@Override
				public void onMessage(ByteBuffer bytes) {
					try {
						System.out.println(new String(bytes.array(), "utf-8"));
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				}
			};
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		client.connect();
		client.send("hello world");

	}

}

Webでxml構成の追加
ここでload-on-startupラベルは、このメソッドの実行順序を指す

		FaceSocketClientManage
		socket.FaceSocketClientManage
		1

Websocketサービス
@ServerEndpoint("/ws/face")がフロント受信アドレス
@ServerEndpoint("/ws/face")
@Component
public class FaceSocketServer {

	private Logger logger = LoggerFactory.getLogger(FaceSocketServer.class);
	private static final String SOCKET = "FaceWebSocket_";

	private Session session;

	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}

	@OnOpen
	public void onOpen(Session session) throws Exception {
		logger.error("@onopen      ");
		this.session = session;
		FaceSocketMapUtil.put(SOCKET + session.getId(), session);
	}

	@OnClose
	public void onClose() throws Exception {
		FaceSocketMapUtil.remove(SOCKET + session.getId());
	}

	@OnMessage
	public void onMessage(String message) throws IOException {
		try {
			logger.info("websocket     :" + message);			
			this.sendMessageAll(message);
		} catch (Exception e) {
			logger.error("@OnMessage onMessage:", e.getLocalizedMessage());
		}
	}

	@OnError
	public void onError(Session session, Throwable error) {
		logger.error("@OnError OnError:", error.getLocalizedMessage());
	}

	//             
	private synchronized void sendMessageAll(String message) throws IOException {
		for (Session session : FaceSocketMapUtil.getValues()) {
			session.getBasicRemote().sendText(message);
		}
	}
}

フロントアクセス
$(function() {
			var ws = null;
			if ('WebSocket' in window) {
				ws = new WebSocket(ws_prefix+"/ws/face");
			} else if ('MozWebSocket' in window) {
				ws = new MozWebSocket(
						ws_prefix+"/ws/face");
			} else {
				console.log("      WebSocket");
			}
			ws.onopen = function(e) {
				console.log("        ");
			}
			ws.onclose = function(e) {
				console.log("        ");
			}
			ws.onmessage = function(e) {				
				var str = e.data;
			}
		});