亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java WebSocket實現簡單的聊天室(包括群發和點對點聊天)

2019-11-06 06:02:44
字體:
來源:轉載
供稿:網友

今天突然看到了WebSocket然后就網上找了一個例子,然后修改了下,實現了簡單的聊天室,包括群聊和點對點聊天。

使用的代碼如下

jsp代碼:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'socket.jsp' starting page</title>    	<meta http-equiv="PRagma" content="no-cache">	<meta http-equiv="cache-control" content="no-cache">	<meta http-equiv="expires" content="0">    	<meta http-equiv="keyWords" content="keyword1,keyword2,keyword3">	<meta http-equiv="description" content="This is my page">	<!--	<link rel="stylesheet" type="text/CSS" href="styles.css">	-->  <style type="text/css">          input#chat {              width: 410px          }            #console-container {              width: 400px;          }            #console {              border: 1px solid #CCCCCC;              border-right-color: #999999;              border-bottom-color: #999999;              height: 170px;              overflow-y: scroll;              padding: 5px;              width: 100%;          }            #console p {              padding: 0;              margin: 0;          }      </style>      <script type="application/Javascript">         "use strict";            var Chat = {};            Chat.socket = null;            Chat.connect = (function(host) {              if ('WebSocket' in window) {                  Chat.socket = new WebSocket(host);              } else if ('MozWebSocket' in window) {                  Chat.socket = new MozWebSocket(host);              } else {                  Console.log('Error: 瀏覽器不支持WebSocket');                  return;              }                Chat.socket.onopen = function () {                  Console.log('Info: WebSocket鏈接已打開');                  document.getElementById('chat').onkeydown = function(event) {                      if (event.keyCode == 13) {                          Chat.sendMessage();                      }                  };              };                Chat.socket.onclose = function () {                  document.getElementById('chat').onkeydown = null;                  Console.log('Info: webcocket關閉.');              };                Chat.socket.onmessage = function (message) {                  Console.log(message.data);              };          });            Chat.initialize = function() {              if (window.location.protocol == 'http:') {                  Chat.connect('ws://' + window.location.host + '/gtweb/chat');              } else {                  Chat.connect('wss://' + window.location.host + '/gtweb/chat');              }          };            Chat.sendMessage = (function() {              var message = document.getElementById('chat').value;              if (message != '') {                  Chat.socket.send(message);                  document.getElementById('chat').value = '';              }          });            var Console = {};            Console.log = (function(message) {              var console = document.getElementById('console');              var p = document.createElement('p');              p.style.wordWrap = 'break-word';              p.innerHTML = message;              console.appendChild(p);              while (console.childNodes.length > 25) {                  console.removeChild(console.firstChild);              }              console.scrollTop = console.scrollHeight;          });            Chat.initialize();            document.addEventListener("DOMContentLoaded", function() {              // Remove elements with "noscript" class - <noscript> is not allowed in XHTML              var noscripts = document.getElementsByClassName("noscript");              for (var i = 0; i < noscripts.length; i++) {                  noscripts[i].parentNode.removeChild(noscripts[i]);              }          }, false);        </script>  </head>  <body>  <div class="noscript"><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable      Javascript and reload this page!</h2></div>  <div>      <p>          <input type="text" placeholder="輸入文字,回車發送" id="chat" /><br>        注意:輸入  消息to用戶名   發送給指定用戶   比如:  你好to用戶1<br>                       輸入   消息     直接發送給全體用戶        </p>      <div id="console-container">          <div id="console"/>      </div>  </div>  </body></html>后臺代碼:

/** *  ━━━━━━神獸出沒━━━━━━  *   ┏┓   ┏┓  *  ┏┛┻━━━┛┻┓  *     ┃       ┃ * 	  ┃   ━   ┃  *     ┃ ┳┛ ┗┳    ┃  *  ┃       ┃  *  ┃   ┻   ┃  *  ┃       ┃  *  ┗━┓   ┏━┛Code is far away from bug with the animal protecting  *    ┃   ┃    神獸保佑,代碼無bug  *    ┃   ┃  *    ┃   ┗━━━┓  *    ┃       ┣┓  *    ┃       ┏┛  *    ┗┓┓┏━┳┓┏┛  *     ┃┫┫ ┃┫┫  *     ┗┻┛ ┗┻┛  *  * ━━━━━━感覺萌萌噠━━━━━━  */package gt.controller.admin;import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;import java.util.concurrent.atomic.AtomicInteger;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.session;import javax.websocket.server.ServerEndpoint;import org.springframework.web.bind.annotation.RequestMapping;/** * 類名稱:ChatAnnotation.java 類描述:簡單的聊天室 作 者:why 時 間:2017年3月7日 */@ServerEndpoint(value = "/chat")public class ChatAnnotation {	private static final String GUEST_PREFIX = "用戶";	/**	 * 一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,	 * 在使用的時候,不可避免的會用到synchronized關鍵字。 而AtomicInteger則通過一種線程安全的加減操作接口。	 */	private static final AtomicInteger connectionIds = new AtomicInteger(0);	private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<>();	private final String nickname;	private Session session;	public ChatAnnotation() {		nickname = GUEST_PREFIX + connectionIds.getAndIncrement();	}	/**	 * 創建連接時間調用的方法	 * 	 * @param session	 */	@OnOpen	public void start(Session session) {		this.session = session;		connections.add(this);		String message = String.format("* %s %s", nickname, "加入聊天室");		//上線通知		broadcast(message);		try {			//系統問候語			SendHello(this.nickname);			//返回在線用戶			onlineList();		} catch (IOException e) {			e.printStackTrace();		}			}	/**	 * 鏈接關閉時調用方法	 */	@OnClose	public void end() {		connections.remove(this);		String message = String.format("* %s %s", nickname, "退出聊天室");		broadcast(message);	}	/**	 * 傳輸信息過程中調用方法	 * @param message	 */	@OnMessage	public void incoming(String message) {		// Never trust the client		// TODO: 過濾輸入的內容		String m = String.format("* %s %s", nickname, message);		if(m.contains("to")){			//點對點發送			broadcastOneToOne(m,nickname);		}else{			//群發			broadcast(m);		}	}	/**	 * 發生錯誤是調用方法	 * @param t	 * @throws Throwable	 */	@OnError	public void onError(Throwable t) throws Throwable {		System.out.println("錯誤: " + t.toString());	}	/**	 * 消息廣播	 * 通過connections,對所有其他用戶推送信息的方法	 * @param msg	 */	private static void broadcast(String msg) {		for (ChatAnnotation client : connections) {			try {				synchronized (client) {					client.session.getBasicRemote().sendText(msg);				}			} catch (IOException e) {				System.out.println("錯誤:向客戶端發送消息失敗");				connections.remove(client);				try {					client.session.close();				} catch (IOException e1) {					e1.printStackTrace();				}				String message = String.format("* %s %s", client.nickname,"退出聊天室");				broadcast(message);			}		}	}	/**	 * 點對點發送消息	 * 通過connections,對所有其他用戶推送信息的方法	 * @param msg	 */	private static void broadcastOneToOne(String msg, String nickName) {		String[] arr = msg.split("to");		for (ChatAnnotation client : connections) {			try {				if(arr[1].equals(client.nickname) || nickName.equals(client.nickname)){					synchronized (client) {						client.session.getBasicRemote().sendText(arr[0]);					}				}			} catch (IOException e) {				System.out.println("錯誤:向客戶端發送消息失敗");				connections.remove(client);				try {					client.session.close();				} catch (IOException e1) {					e1.printStackTrace();				}				String message = String.format("* %s %s", client.nickname,"退出聊天室");				broadcast(message);			}		}	}	//系統問候語	private static void SendHello(String nickName) throws IOException{		String m = String.format("* %s %s", nickName, "你好");		for (ChatAnnotation client : connections) {			if(client.nickname.equals(nickName)){				client.session.getBasicRemote().sendText(m);			}		}	}	//在線用戶	private static void onlineList() throws IOException{		String online = "";		for (ChatAnnotation client : connections) {			if(online.equals("")){				online = client.nickname;			}else{				online += ","+client.nickname;			}		}		String m = String.format("* %s %s", "當前在線用戶", online);		for (ChatAnnotation client : connections) {			client.session.getBasicRemote().sendText(m);		}	}}注釋都加在代碼中了,到此簡單的聊天室就可以使用了。

如圖所示。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美最近摘花xxxx摘花| 国产精品老牛影院在线观看| 深夜福利一区二区| 另类天堂视频在线观看| 国产精品尤物福利片在线观看| 亚洲社区在线观看| 欧美精品www| 日韩中文有码在线视频| 国产精品久久婷婷六月丁香| 亚洲无限av看| 日产精品99久久久久久| 欧美在线xxx| 国产视频精品va久久久久久| 国产精品成久久久久三级| 日韩av日韩在线观看| 亚洲综合成人婷婷小说| 亚洲成av人片在线观看香蕉| 疯狂做受xxxx欧美肥白少妇| 亚洲人成网在线播放| 国产成人aa精品一区在线播放| 亚洲天天在线日亚洲洲精| 欧美极品少妇xxxxⅹ免费视频| 91在线网站视频| 亚洲美女精品久久| 中文字幕精品久久久久| 欧美电影院免费观看| 国产99视频在线观看| 欧美日韩福利电影| 亚洲日本中文字幕| 在线观看91久久久久久| 亚洲人成电影网站色xx| 午夜免费久久久久| 欧美日韩国内自拍| 高清欧美一区二区三区| 久久久久久网址| 亚洲最大成人免费视频| 在线播放日韩av| 亚洲午夜精品视频| 欧美日韩福利电影| 欧美性猛交xxxx黑人猛交| 亚洲欧美制服丝袜| 国产精品爽爽ⅴa在线观看| 国产精品嫩草影院一区二区| 国产偷国产偷亚洲清高网站| 日韩一级裸体免费视频| 高清欧美性猛交| 一级做a爰片久久毛片美女图片| 国产成人黄色av| 成人精品视频99在线观看免费| 亚洲级视频在线观看免费1级| 久久精品视频va| 另类视频在线观看| 国产精品久久久久免费a∨| 国内精品久久久久久久久| 欧美一区二区三区四区在线| 久久福利网址导航| 成人高清视频观看www| 欧美亚洲在线视频| 5252色成人免费视频| 精品国产一区二区三区久久狼黑人| 亚洲精品国精品久久99热一| 欧洲成人在线视频| 中文字幕日韩欧美在线视频| 91免费看片在线| 国内揄拍国内精品| 欧美大秀在线观看| 国产精品v日韩精品| 在线a欧美视频| 国产精品网站大全| 亚洲自拍偷拍一区| 97免费视频在线播放| 日韩精品在线视频美女| 国产午夜精品免费一区二区三区| 色狠狠av一区二区三区香蕉蜜桃| 国产亚洲欧美另类中文| 欧美性精品220| 久久久久北条麻妃免费看| 最新国产成人av网站网址麻豆| 国内精品久久久久伊人av| 欧美精品一区二区三区国产精品| 亚洲乱码国产乱码精品精| 亚洲区免费影片| 久久久国产一区| 亚洲欧美一区二区精品久久久| 久久久久一本一区二区青青蜜月| 欧美在线国产精品| 午夜精品在线视频| 日韩欧美黄色动漫| 日韩av色综合| 亚洲午夜国产成人av电影男同| 色yeye香蕉凹凸一区二区av| 国产一区二区激情| 亚洲欧美国产精品专区久久| 日韩69视频在线观看| 日韩电影在线观看中文字幕| 欧美一区亚洲一区| 国产精品美女久久久免费| 欧美性xxxx极品高清hd直播| 亚洲女人被黑人巨大进入| 国产99久久久欧美黑人| 日韩福利在线播放| 国产欧美日韩最新| 国产成人鲁鲁免费视频a| 亚洲精品色婷婷福利天堂| 亚洲91av视频| 亚洲自拍偷拍视频| 亚洲二区在线播放视频| 91热福利电影| 国产不卡一区二区在线播放| 国产精品第一页在线| 国产综合久久久久| 国产成人自拍视频在线观看| 国内外成人免费激情在线视频网站| 欧美中文在线观看| 亚洲天堂日韩电影| 国a精品视频大全| 欧美日本精品在线| 日韩中文字幕久久| 日韩免费观看网站| 欧美亚洲午夜视频在线观看| 国产免费亚洲高清| 日韩精品中文字幕视频在线| 国产精品一区久久久| 欧美日产国产成人免费图片| 91国产在线精品| 在线观看国产精品日韩av| 69视频在线播放| 中文字幕成人精品久久不卡| 国产精品成人一区| 精品久久久国产精品999| 久久97精品久久久久久久不卡| 亚洲精品日韩欧美| 亚洲国产精品久久久久久| 精品久久在线播放| 亚洲欧美日本精品| 91成人性视频| 亚洲成人激情图| 亚洲免费电影在线观看| 91av在线网站| www.久久草.com| 欧美大成色www永久网站婷| 亚洲综合中文字幕在线观看| 欧美老女人xx| 97精品久久久中文字幕免费| 亚洲第一区在线| 精品久久久久久久久久| 国产精品欧美日韩一区二区| 国产欧美va欧美va香蕉在线| 亚洲老头老太hd| 日韩福利伦理影院免费| 欧美在线观看www| 青青青国产精品一区二区| 97精品国产aⅴ7777| 国内精品小视频在线观看| 国产视频丨精品|在线观看| 欧美日韩国产色| 中文字幕在线看视频国产欧美| 国产精品老牛影院在线观看| 欧美精品videos| 久久久久久国产三级电影| 欧美在线欧美在线| 欧美色道久久88综合亚洲精品| 成人免费视频在线观看超级碰| 欧美电影第一页|