欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java與微信小程序?qū)崿F(xiàn)websocket長連接

 更新時(shí)間:2019年05月21日 16:20:21   作者:weixin_40576403  
這篇文章主要為大家詳細(xì)介紹了java與微信小程序?qū)崿F(xiàn)websocket長連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java與微信小程序?qū)崿F(xiàn)websocket長連接的具體代碼,供大家參考,具體內(nèi)容如下

背景:

需要在小程序?qū)崿F(xiàn)地圖固定坐標(biāo)下實(shí)時(shí)查看消息

java環(huán)境 :tomcat7 jdk1.7

1.java

websocket 類

package com.qs.util;
 
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.CopyOnWriteArraySet;
 
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
 
import com.qs.controller.UserController;
 
/**
 * @ServerEndpoint 注解是一個(gè)類層次的注解,它的功能主要是將目前的類定義成一個(gè)websocket服務(wù)器端,
 * 注解的值將被用于監(jiān)聽用戶連接的終端訪問URL地址,客戶端可以通過這個(gè)URL來連接到WebSocket服務(wù)器端
 */
@ServerEndpoint("/websocket")
public class WebSocketTest {
 
 //靜態(tài)變量,用來記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全的。
 private static int onlineCount = 0;
 
 //concurrent包的線程安全Set,用來存放每個(gè)客戶端對應(yīng)的MyWebSocket對象。若要實(shí)現(xiàn)服務(wù)端與單一客戶端通信的話,可以使用Map來存放,其中Key可以為用戶標(biāo)識
 private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();
 
 //與某個(gè)客戶端的連接會(huì)話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
 private Session session;
 
 /**
 * 連接建立成功調(diào)用的方法
 * @param session 可選的參數(shù)。session為與某個(gè)客戶端的連接會(huì)話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
 */
 @OnOpen
 public void onOpen(Session session){
 this.session = session;
 webSocketSet.add(this);  //加入set中
 addOnlineCount();   //在線數(shù)加1
 System.out.println("有新連接加入!當(dāng)前在線人數(shù)為" + getOnlineCount());
 }
 
 /**
 * 連接關(guān)閉調(diào)用的方法
 */
 @OnClose
 public void onClose(){
 webSocketSet.remove(this); //從set中刪除
 subOnlineCount();   //在線數(shù)減1
 System.out.println("有一連接關(guān)閉!當(dāng)前在線人數(shù)為" + getOnlineCount());
 }
 
 /**
 * 收到客戶端消息后調(diào)用的方法
 * @param message 客戶端發(fā)送過來的消息
 * @param session 可選的參數(shù)
 */
 @OnMessage
 public void onMessage(String message, Session session) {
 System.out.println("來自客戶端的消息:" + message);
 
 //群發(fā)消息
 for(WebSocketTest item: webSocketSet){
 try {
 item.sendMessage(message);
 } catch (IOException e) {
 e.printStackTrace();
 continue;
 }
 }
 }
 
 /**
 * 發(fā)生錯(cuò)誤時(shí)調(diào)用
 * @param session
 * @param error
 */
 @OnError
 public void onError(Session session, Throwable error){
 System.out.println("發(fā)生錯(cuò)誤");
 error.printStackTrace();
 }
 
 /**
 * 這個(gè)方法與上面幾個(gè)方法不一樣。沒有用注解,是根據(jù)自己需要添加的方法。
 * @param message
 * @throws IOException
 */
 public void sendMessage(String message) throws IOException{
 this.session.getBasicRemote().sendText(message);
 //this.session.getAsyncRemote().sendText(message);
 }
 
 public static synchronized int getOnlineCount() {
 return onlineCount;
 }
 
 public static synchronized void addOnlineCount() {
 WebSocketTest.onlineCount++;
 }
 
 public static synchronized void subOnlineCount() {
 WebSocketTest.onlineCount--;
 }
 
}

2. jsp

<%@ page language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
 <title>Java后端WebSocket的Tomcat實(shí)現(xiàn)</title>
</head>
<body>
 Welcome<br/><input id="text" type="text"/>
 <button onclick="send()">發(fā)送消息</button>
 <hr/>
 <button onclick="closeWebSocket()">關(guān)閉WebSocket連接</button>
 <hr/>
 <div id="message"></div>
</body>
 
<script type="text/javascript">
 var websocket = null;
 //判斷當(dāng)前瀏覽器是否支持WebSocket
 if ('WebSocket' in window) {
  websocket = new WebSocket("ws://image.aropen.com/Image-retrievals/websocket");
 }
 else {
  alert('當(dāng)前瀏覽器 Not support websocket')
 }
 
 //連接發(fā)生錯(cuò)誤的回調(diào)方法
 websocket.onerror = function () {
  setMessageInnerHTML("WebSocket連接發(fā)生錯(cuò)誤");
 };
 
 //連接成功建立的回調(diào)方法
 websocket.onopen = function () {
  setMessageInnerHTML("WebSocket連接成功");
  
 }
 
 //接收到消息的回調(diào)方法
 websocket.onmessage = function (event) {
  setMessageInnerHTML(event.data);
 }
 
 //連接關(guān)閉的回調(diào)方法
 websocket.onclose = function () {
  setMessageInnerHTML("WebSocket連接關(guān)閉");
 }
 
 //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。
 window.onbeforeunload = function () {
  closeWebSocket();
 }
 
 //將消息顯示在網(wǎng)頁上
 function setMessageInnerHTML(innerHTML) {
  document.getElementById('message').innerHTML += innerHTML + '<br/>';
 }
 
 //關(guān)閉WebSocket連接
 function closeWebSocket() {
  websocket.close();
 }
 
 //發(fā)送消息
 function send() {
  var message = document.getElementById('text').value;
  var arr=['zhangsan,hello,1','lisi,word,1','wangwu,hi,1','zhaoliu,hehe,1','tianqi,haha,1'];
  window.setInterval(function(){
   websocket.send(arr[Math.floor(Math.random()*4)]);
  },5000);
  //websocket.send(message);
 }
</script>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論