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"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee;

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<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; " onclick="postToServer()" />&nbsp;&nbsp;

<input type="button" value=" &nbsp;我闪 &nbsp; " onclick="closeConnect()" />

</center>

</div>

</div>

</body>

</html>

时间: 2024-08-03 06:16:56

WebSocket实现简单的web聊天室的相关文章

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(不断更新中)

项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: ElasticSearch 搜索,支持各种条件搜索,效率高,速度快,稳准狠. Redis缓存,统计在线好友,登录token等 RabbitMQ消息队列,发送消息通过队列降低数据库访问压力,或者延迟执行任务. ASP.NET MVC,UI架构. 以及普通的三层架构等.CRUD 当然其中的这些技术也是纯粹为了使用

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

Netty学习摘记 —— 简单WEB聊天室开发

本文参考 本篇文章是对<Netty In Action>一书第十二章"WebSocket"的学习摘记,主要内容为开发一个基于广播的WEB聊天室 聊天室工作过程 请求的 URL 以/ws 结尾时,通过升级握手的机制把该协议升级为 WebSocket,之后客户端发送一个消息,这个消息会被广播到所有其它连接的客户端 当有新的客户端连入时,其它客户端也能得到通知 处理HTTP请求 首先实现该处理 HTTP 请求的组件,当请求的url没有指定的WebSocket连接的后缀时(如后缀/

基于Node的Web聊天室

1 项目名称 Web聊天室(<这是NodeJs实战>第二章的一个案例,把整个开发过程记录下来) 2 项目描述 该项目是一个简单的在线聊天程序.打开聊天页面,程序自动给用户分配一个昵称,进入默认的Lobby聊天室.用户可以发送消息,也可以使用聊天命令(聊天命令以/开头)修改自己的昵称或者加入已有的聊天室(聊天室不存在时,创建新的聊天室).在加入或创建聊天室时,新聊天室的名称会出现在聊天程序顶端的水平条上,也会出现在聊天消息区域右侧的可用房间列表中.在用户换到新房间后,系统会显示信息以确认这一变化

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)

大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM界面中的数据动态化.当然还不涉及即时消息通讯,如果你已经搞定了数据界面,那么本文您可以简单的看一下,或者略过. 进入正题,layim帮我们定义好了数据规则,我们只要写一个接口实现那个json规范就可以了,剩下的事情就交给layim去做,看一下json格式.(对应文件夹:demo/json/getLi

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息

前言 不知不觉已经十四篇了,其实已经没有什么可写了.但是突然发现layim中带的客服功能没有用到.于是乎,抽点时间完成吧.其实之前的工作已经把客服功能完成了一大半,剩下的我们稍微调整即可.今天的演示我们放在后边,直接进入讲解. 客服思路讲解 大家去一些公司网站都会发现,网页侧面或者自动弹出一些客服聊天框,人家很热情的和你交谈.我们也可以用layim来实现.首先,页面添加一个按钮,点击按钮触发客服模式. <a onclick="javascript:global.other.kefu(148

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(七) 之 历史记录查询(时间,关键字,图片,文件),关键字高亮显示。

前言 上一篇讲解了如何自定义右键菜单,都是前端的内容,本篇内容就一个:查询.聊天历史纪录查询,在之前介绍查找好友的那篇博客里已经提到过 Elasticsearch,今天它又要上场了.对于Elasticsearch不感冒的同学呢,本篇可以不用看啦. from baidu: ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,

基于Tomcat7、Java、WebSocket的服务器推送聊天室 (转)

前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前 的服务器消息推送大部分采用的都是“轮询”和“长连接”技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对 只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服 务器对于WebSocket的实现都是不一样的

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。

前面几篇基本已经实现了大部分即时通讯功能:聊天,群聊,发送文件,图片,消息.不过这些业务都是比较粗犷的.下面我们就把业务细化,之前用的是死数据,那我们就从加好友开始吧.加好友,首先你得知道你要加谁.Layim界面右下角有个+号,点击它之后就会弹出查找好友的界面,不过那个界面需要自定义.由于前端不是我的强项,勉强凑了个页面.不过不要在意这些细节.这些都不重要,今天主要介绍一下ElasticSearch搜索解决方案.它是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基