WebSocket实现简单的web聊天室

WebSocket实现简单的web聊天室WebSocket实现简单的web聊天室1.需要Tomcat7.0所以服务器2.需要JDK7.03.手工加入Tomcat7.0中lib目录下的一下三个包catalina.jar、tomcat-coyote.jar、websocket-api.jar4.项目部署后,请将服务器中当前项目下的catalina.jar、tomcat-coyote.jar、websocket-api

大家好,又见面了,我是你们的朋友全栈君。

WebSocket实现简单的web聊天室
1.需要Tomcat7.0所以服务器

2.需要JDK7.0
3.手工加入Tomcat7.0中lib目录下的一下三个包catalina.jar、tomcat-coyote.jar、websocket-api.jar
4.项目部署后,请将服务器中当前项目下的catalina.jar、tomcat-coyote.jar、websocket-api.jar三个包删除。
5.项目目录结构如下


图片

Servlet代码

package com.yc.websockets;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;

@SuppressWarnings({“deprecation”,”unused”, “serial”})
public class WebSocketTest extends WebSocketServlet {
private static List<MyMessageInbound> userList = new ArrayList<MyMessageInbound>();
private HttpSession session;

    @Override
    protected StreamInbound createWebSocketInbound(String str, HttpServletRequest request) {
    
session=request.getSession();
        return new MyMessageInbound();
    }

    private class MyMessageInbound extends MessageInbound {
        WsOutbound myoutbound;

        /**
         * 当用户登录时,WebSocket握手完成,创建完毕,WsOutbound用于向客户端发送数据
         */
public void onOpen(WsOutbound outbound) {
            try {
                System.out.println(“Open Client.”);
                this.myoutbound = outbound;
                userList.add(this); //添加当前用户
                
                //向客服端发送信息
                outbound.writeTextMessage(CharBuffer.wrap(“Hello!”));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

/**
 * 用户退出时,WebSocket关闭事件,参数status应该来自org.apache.catalina.websocket.Constants
 * 中定义的几个常量,可以参考文档或者核对一下Tomcat的源码
 */
        @Override
        public void onClose(int status) {
            userList.remove(this); //移除当前用户
        }

       /**
        * 接受用户发过来的信息,有文本消息数据到达
        */
        @Override
        public void onTextMessage(CharBuffer cb) throws IOException {
            for (MyMessageInbound mmib:userList){ //循环向所有在线用户发送当前用户的信息
                CharBuffer buffer = CharBuffer.wrap(cb);
                mmib.myoutbound.writeTextMessage(buffer); //调用指定用户的发送方法发送当前用户信息
                mmib.myoutbound.flush(); //清空缓存
            }
        }

        /**
         * 有二进制消息数据到达,暂时没研究出这个函数什么情况下触发,js的WebSocket按理说应该只能send文本信息才对
         */
        @Override
        public void onBinaryMessage(ByteBuffer bb) throws IOException {
        }
    }
}

web.xml配置文件


 
<?xml version=”1.0″ encoding=”UTF-8″?>

<web-app version=”3.0″ xmlns=”
http://java.sun.com/xml/ns/javaee
xsi:schemaLocation=”
http://java.sun.com/xml/ns/javaee ;
<display-name></display-name>
  
<servlet>
<servlet-name>webServlet</servlet-name>
<servlet-class>com.yc.websockets.WebSocketTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webServlet</servlet-name>
<url-pattern>/webServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>


index.html


<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Tomcat WebSocket Chat</title>
<script>
//设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的
/*设定WebSocket,注意协议是ws,请求是指向对应的WebSocketServlet的
var url = “ws://127.0.0.1:8080/j2ee6/echo.ws”;
// 创建WebSocket实例,下面那个MozWebSocket是Firefox的实现
if (‘WebSocket’ in window) {
ws = new WebSocket(url);
} else if (‘MozWebSocket’ in window) {
ws = new MozWebSocket(url);
} else {
alert(‘Unsupported.’);
return;
}*/
var ws = new WebSocket(“ws://218.196.14.208:8080/webSocket/webServlet”);

//WebSocket握手完成,连接成功的回调
//有个疑问,按理说new WebSocket的时候就会开始连接了,如果在设置onopen以前连接成功,是否还会触发这个回调
ws.onopen = function() {
//请求成功
};

//收到服务器发送的文本消息, event.data表示文本内容
ws.onmessage = function(message) {
document.getElementById(“talkInfo”).innerHTML+=message.data+”<hr style=’border: 1px dashed #CCC’/>”;
};

//关闭WebSocket的回调
ws.onclose = function() {
//alert(‘Closed!’);
};

// 通过WebSocket想向服务器发送一个文本信息
function postToServer() {
ws.send(document.getElementById(“content”).value);
document.getElementById(“content”).value = “”;
}

//关闭WebSocket
function closeConnect() {
ws.close();
}
</script>
<style>
* {
margin: 0 auto;
padding: 0px;
font-size: 12px;
font-family: “微软雅黑”;
line-height: 26px;
}

#bigbox {
margin:0px auto;
padding:0px;
width:70%;
}

#talkInfo{
width:100%;
height:500px;
border:1px solid red;
overflow: scorll;
}

#operation{
width:100%;
height:30px;
margin-top:10px;
}

#content{
height:30px;
line-height:30px;
}
</style>
</head>
<body>
<div id=”bigbox”>
<div id=”talkInfo”></div>
<div id=”operation”>
<center>
<input type=”text” name=”content” id=”content” size=”100″/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type=”button” value=” &nbsp;发送&nbsp; ” οnclick=”postToServer()” />&nbsp;&nbsp;
<input type=”button” value=” &nbsp;我闪 &nbsp; ” οnclick=”closeConnect()” />
</center>
</div>
</div>
</body>

</html>
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152190.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql innodb 索引使用指南「建议收藏」

    mysql innodb 索引使用指南「建议收藏」mysql innodb 索引使用指南

  • MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]

    MATLAB求解线性规划(含整数规划和0-1规划)问题[通俗易懂]线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约束的,变量范围为有理数的线性规划。如:对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题。但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题。最著名,同时也是最强大的数学最优化软件是LINGO/LINDO软件包,它能够求解多种的数学规划问题,同时还提供了多

  • 基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现

    基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现摘要:民以食为天,在日常的生活中,我们经常需要与家人,朋友,同事在一起就餐以便促进相互之间的感情.但是现在多数的餐厅企业基本上还是手工点餐操作,无法更好地适应新时期下人们对餐饮业服务的人性化和高效率的要求.随着”互联网+”思维的不断推广,使得传统行业和互联网行业相结合的新兴产业也不断迅速发展.在当前社会形势下安卓系统得到了迅速发展和广泛应用,它正在悄无声息的改变着人们的生活,也为餐厅点餐信息化技术…

  • HDU 3715 Go Deeper(2-sat)

    HDU 3715 Go Deeper(2-sat)

  • oracle连接plsqldev

    oracle连接plsqldev一F:\orcale\product\11.2.0\dbhome_1\NETWORK\ADMIN文件tnsnames.ora(ORCL就是数据库名称)ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(S…

  • ajax 长轮询_js 轮询

    ajax 长轮询_js 轮询1.三者介绍【1】http协议介绍1)介绍:http协议是请求/响应范式的,每个http响应都对应一个http请求,http协议是无状态的,多个http请求之间是没有关系的;2)http协议的被动性:在标准的HTTP请求响应语义中,浏览器发起请求,服务器发送一个响应,这意味着在浏览器发起新请求前,服务器不能发送新信息给客户端浏览器;【2】htt

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号