前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebSocket实现简单的web聊天室

WebSocket实现简单的web聊天室

作者头像
全栈程序员站长
发布2022-06-25 13:25:19
4970
发布2022-06-25 13:25:19
举报
文章被收录于专栏:全栈程序员必看

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

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三个包删除。

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; ” οnclick=”postToServer()” />&nbsp;&nbsp;

<input type=”button” value=” &nbsp;我闪 &nbsp; ” οnclick=”closeConnect()” />

</center>

</div>

</div>

</body>

</html>

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档