WebSocket搭建简单的聊天室

WebSocket搭建简单的聊天室

从Servlet3.1开始,Tomcat中就增加了一个websocket-api.jar开发包,这个包可以进行WebSocket程序开发,并且是基于Annotation注解的形式配置的。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

搭建简单的聊天室
1.编写服务器端程序
package com.websocket;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;

@ServerEndpoint(value="/message")
public class MessageWebSocket {
    @OnOpen
    public void openMethod(){//打开WebSocket连接的方法
        System.out.println("【----WebSocket连接建立----】");
    }

    @OnMessage
    public void messageHandle(String message, Session session){//处理消息
        try{
            Set<Session> sessions = session.getOpenSessions();//取得全部的客户端
            Iterator<Session> sessionsIter = sessions.iterator();
            while(sessionsIter.hasNext()){//取出每一个session数据
                Session son = sessionsIter.next();
                String sid = son.getId();
                son.getAsyncRemote().sendText(sid+":"+message+"\n发送时间:"+
                        new SimpleDateFormat("yyyy-MM-dd HH::mm::ss.SSS").format(new Date()));
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @OnClose
    public void closeMethod(){//关闭WebSocket连接的方法
        System.out.println("【----WebSocket连接关闭----】");
    }
}
2.编写客户端程序

HTML5中的WebSocket 对象有以下属性:

No属性描述
1readyState反映当前连接状态(只读属性)

readyState属性有以下取值:

取值描述
0连接尚未建立
1连接已建立,可以进行通讯
2连接正在关闭
3连接已经关闭

WebSocket 对象有以下事件

No事件处理程序描述
1openwebsocket.onopen连接建立时触发
2messagewebsocket.onmessage客户端接收服务器数据时触发
3closewebsocket.onclose连接关闭时触发
4errorwebsocket.onerror通信错误时触发

WebSocket 对象有以下主要方法进行通讯:

No方法描述
1send()使用连接发送数据
2close()关闭连接
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Chatroom</title>
    <style type="text/css">
        .context{
            border:1px solid #111111;
            width:350px;
            border-radius:20px;
            background:#A0EEE1;
            padding:12px;
            margin:10px;
        }
        .username{
            font-size:27px;
            color:#D1BA74;
        }
        #div1{
            font-size:22px;
            color:#F4606C;
        }
        .in1{
            border-radius:6px;
            height:25px;
        }
        #sendBut{
            width:150px;
            background:#19CAAD;
            font-size:25px;
            border-radius:10px;
        }
    </style>
</head>
<body>
<div id="contentDiv" style="height:400px;overflow: scroll;background: lightblue">
</div>
<div id="div1">
    <label>用户名:</label>
    <input type="text" class="in1" name="username" id="username" /><br>
    <label>请输入内容:</label>
    <input type="text" class="in1" id="info" name="info"/>
    <input type="button" id="sendBut" value="发送"/>
</div>
<script type="text/javascript">
    var websocket = null;//定义WebSocket处理对象
    var url = "ws://localhost:8080/message";//定义WebSocket连接地址
    function init(){
        if('WebSocket' in window){//当前浏览器是否支持WebSocket
            websocket = new WebSocket(url);//直接实例化
        }else{
            if('MozWebSocket' in window){
                websocket = new MozWebSocket(url);//直接实例化
            }else{
                alert('您的浏览器不支持当前操作...');
            }
        }
    }
    window.onload = function(){
        init();
        websocket.onopen = function(){//WebSocket建立连接时触发该方法
            document.getElementById('contentDiv').innerHTML+='<p>WebSocket连接建立</p>';
        };
        websocket.onclose = function() {//WebSocket断开连接时触发该方法
            document.getElementById('contentDiv').innerHTML += '<p>WebSocket连接已断开</p>';
        };
        websocket.onmessage = function(e){//WebSocket接收数据触发该方法
            var divEle = document.createElement("div");
            divEle.setAttribute("class","context");
            var result = e.data.split("|");
            var msg = result[0].split(":");
            var userSpanEle = document.createElement("span");
            userSpanEle.appendChild(document.createTextNode(msg[0]+":"));
            userSpanEle.setAttribute("class","username");
            var msgSpanEle = document.createTextNode(msg[1]);
            var dateSpanEle = document.createTextNode(result[1]);
            divEle.appendChild(userSpanEle);
            divEle.appendChild(msgSpanEle);
            divEle.appendChild(document.createElement('br'));
            divEle.appendChild(dateSpanEle);
            document.getElementById('contentDiv').appendChild(divEle);
        };
        document.getElementById("sendBut").addEventListener("click",function(){
            var info = document.getElementById('info').value;
            var username = document.getElementById('username').value;
            info = username+":"+info;
            websocket.send(info);//将数据发送到服务器
        },false);
    }
</script>
</body>
</html>
3.查看运行效果



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值