WebSocket + html 实现聊天室
来源:互联网 发布:iota 网络被攻击 编辑:程序博客网 时间:2024/05/16 01:46
WebSocket + html 实现聊天室
现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP request 的header是非常长的,里面包含的有用数据可能只是一个很小的值,这样会占用很多的带宽。
而比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。
在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:
1. Header
互相沟通的Header是很小的-大概只有 2 Bytes
2. Server Push
服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,而是在有新数据时就主动推送给浏览器。
注意
WebSocket支持tomcat7,jdk1.7及其以上版本。
聊天室原理:
多个客户端和服务端进行握手,客户端将信息发送给服务端,有服务端通过广播的形式发送给大家。
聊天室效果图
目录
主要代码
ChatSocket.java
package com.xzy.socket;import java.io.IOException;import java.util.ArrayList;import java.util.Date;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;import javax.websocket.OnClose;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import com.google.gson.Gson;import com.xzy.vo.Message;@ServerEndpoint("/chatSocket")public class ChatSocket { //存储当前socket对象 private static Set<ChatSocket> sockets = new HashSet<ChatSocket>(); //用户名 private static List<String> names = new ArrayList<String>(); private Session session; private String username; private Gson gson = new Gson(); // 进入 @OnOpen public void open(Session session) { this.session = session; sockets.add(this); String queryString = session.getQueryString(); this.username = queryString.substring(queryString.indexOf("=") + 1); names.add(this.username); Message message = new Message(); message.setAlert(this.username + "进入聊天室!!"); message.setNames(names); broadcast(sockets, gson.toJson(message)); } //退出 @OnClose public void close(Session session) { sockets.remove(this); names.remove(this.username); Message message = new Message(); message.setAlert(this.username + "退出聊天室!!"); message.setNames(names); broadcast(sockets, gson.toJson(message)); } //发送 @OnMessage public void receive(Session session,String msg ){ Message message=new Message(); message.setSendMsg(msg); message.setFrom(this.username); message.setDate(new Date().toLocaleString()); broadcast(sockets, gson.toJson(message)); } public void broadcast(Set<ChatSocket> ss, String msg) { for (Iterator iterator = ss.iterator(); iterator.hasNext();) { ChatSocket chatSocket = (ChatSocket) iterator.next(); try { chatSocket.session.getBasicRemote().sendText(msg); } catch (IOException e) { e.printStackTrace(); } } }}
chat.html
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><script type="text/javascript"> var ws; var username = getUrlParameter('username'); var url = "ws://localhost:8080/websocket/chatSocket?username=" + username; window.onload = connect; function connect() { if ('WebSocket' in window) { ws = new WebSocket(url); } else if ('MozWebSocket' in window) { ws = new MozWebSocket(url); } else { alert('该浏览器不支持websocket'); return; } ws.onmessage = function(event) { eval("var result=" + event.data); //欢迎语言 if (result.alert != undefined) { document.getElementById("content").innerHTML += result.alert + "<br/>"; } //列表 if (result.names != undefined) { document.getElementById("userList").innerHTML = ""; var arr = result.names; for (var i = 0; i < arr.length; i++) { document.getElementById("userList").innerHTML += arr[i] + "<br/>"; } } //聊天内容 if (result.from != undefined) { document.getElementById("content").innerHTML += result.from + " " + result.date + " 说:<br/>" + result.sendMsg + "<br/>"; } }; } function wsSend() { var msg = document.getElementById("msg"); ws.send(msg.value); msg.value = ""; } //截取URL 中的传过来的值 function getUrlParameter(name) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var results = regex.exec(window.parent.location.href); if (results == null) return ""; else { return results[1]; } }</script></head><body> <div id="content" style="border: 1px solid black; width: 400px; height: 300px; float: left;"></div> <div id="userList" style="border: 1px solid black; width: 100px; height: 300px; float: left;"></div> <div style="clear: both;"> <input id="msg" /> <button onclick="wsSend()">send</button> </div></body></html>
源码下载:CSDN下载 百度云下载
连接失效联系楼主
1 0
- WebSocket + html 实现聊天室
- 用HTML 5的WebSocket实现网络聊天室
- HTML+CSS+JS+node.js实现websocket聊天室
- WebSocket+Netty实现聊天室
- WebSocket实现网页聊天室
- WebSocket实现即时聊天室
- WebSocket聊天室的实现
- Java、WebSocket、HTML简易聊天室
- Html Websocket搭建右下角聊天室
- HTML5 WebSocket + NodeJs 实现聊天室
- WebSocket+HTML5实现在线聊天室
- Android用Websocket实现聊天室
- websocket实现简单的聊天室
- websocket实现聊天室等功能
- websocket 简介、实现简单聊天室
- websocket实现多房间聊天室
- websocket如何实现双向聊天室
- websocket+tomcat实现聊天室功能
- Composer在ubuntu中的安装
- java枚举
- Android实现银行卡详情选择布局
- 编译时提示软件包javax.servlet.http不存在
- BufferedReader、BufferedWriter
- WebSocket + html 实现聊天室
- 嵌入式设备web服务器比较
- linux 命令行下!的应用
- java android 农历日历 ChineseCalendar extends java.util.GregorianCalendar
- eclipse快捷键大全(转载)
- git结合android studio使用详解。填坑之旅。
- 欢迎使用CSDN-markdown编辑器
- expdp远程导dump文件到本地
- 解决spring task在调用controller时,当controller访问service时候空指针错误的问题