1 开发环境请见  "基于tomcat7和jdk1.7的websocket启动 "  ,另外 源码下载地址为 : http://download.csdn.net/detail/jianfpeng241241/9323549

2 项目结构图

3 Message.java

package com.web.message;import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import com.google.gson.Gson;/** 定义传播的信息的结构* */
public class Message {private String content;private String welcome;private List<String> usernames;private static Gson gson = new Gson();public String getWelcome() {return welcome;}public Message(){}public Message(String welcome,List<String> usernames){this.welcome = welcome;this.usernames = usernames;}public void setWelcome(String welcome) {this.welcome = welcome;}public List<String> getUsernames() {return usernames;}public void setUsernames(List<String> usernames) {this.usernames = usernames;}public String toJson(){return gson.toJson(this);}public String getContent() {return content;}public void setContent(String content,String username) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date());this.content = "\r\n\r\n" +time +"\r\n" +username+" said : " + content;}public static void main(String args[]){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date());System.out.println(time);}
}

4  Login.java

package com.web.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Login extends HttpServlet {/*** Constructor of the object.*/public Login() {super();}/*** Destruction of the servlet. <br>*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");
//      System.out.println("username = " + username);request.setAttribute("username", username);RequestDispatcher dispatcher = request.getRequestDispatcher("/chart.jsp"); dispatcher.forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}/*** Initialization of the servlet. <br>** @throws ServletException if an error occurs*/public void init() throws ServletException {// Put your code here}}

5 EchoSocket.java

package com.webSocket.client;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;import com.web.message.Message;@ServerEndpoint("/echo")
public class EchoSocket {private static List<String> usernames = new ArrayList<String>();private static List<Session> sessions = new ArrayList<Session>();private String username; private Session session;@OnOpenpublic void open(Session session){ //打开websocketSystem.out.println("userid = "+session.getId());String string = session.getQueryString();this.username = string.split("=")[1];this.usernames.add(this.username);this.sessions.add(session);String welcome = "欢迎"+this.username+"加入聊天室";Message message = new Message(welcome,this.usernames);this.broadcast(this.sessions,message.toJson());}@OnClosepublic void close(Session session){ //关闭websocketthis.sessions.remove(session);this.usernames.remove(this.username);String goMsg = this.username+"已经离开聊天室";Message message = new Message(goMsg,this.usernames);this.broadcast(this.sessions,message.toJson());System.out.println("websocket is close");}@OnMessagepublic void message(Session session,String msg){//接收客服端信息//System.out.println("客服端信息为 : " + message);if (session.isOpen()) {Message message = new Message();message.setUsernames(this.usernames);message.setContent(msg,this.username);this.broadcast(this.sessions,message.toJson());}}public List<String> getUsernames() {return usernames;}public List<Session> getSessions() {return sessions;}private  void broadcast(List<Session> sessionsList,String msg) { //广播给其它人if(sessionsList.size() > 0){for(int i = 0 ; i < sessionsList.size() ; i++){try {sessionsList.get(i).getBasicRemote().sendText(msg);} catch (IOException e) {System.out.println("EchoSocket.java broadcast method ,广播失败 ");e.printStackTrace();}}}}}

6 DemeConfig.java

package com.webSocket.config;import java.util.Set;import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;public class DemeConfig implements ServerApplicationConfig{//注解的方式 启动public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scan) {System.out.println("-------------websoket start-----------------");System.out.println("scan.size() = " + scan.size());return scan; //必须要返回scan,否则会造成连接失败}//接口方式启动public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> arg0) {return null;}}

7 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd"><servlet><description>This is the description of my J2EE component</description><display-name>This is the display name of my J2EE component</display-name><servlet-name>Login</servlet-name><servlet-class>com.web.servlet.Login</servlet-class></servlet><servlet-mapping><servlet-name>Login</servlet-name><url-pattern>/servlet/Login</url-pattern></servlet-mapping><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>

8 chart.jsp

<%@ page language="java" import="java.util.*,javax.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'index.jsp' starting page</title></head><body><script type="text/javascript">var ws=null; var target = "ws://"+window.location.host+"/webSocketTest/echo?username=${requestScope.username}"; // 打开管道  ,ws://localhost:8080/项目名/@ServerEndpoint名字window.οnlοad=function(){if(ws==null){if ('WebSocket' in window) {ws = new WebSocket(target);} else if ('MozWebSocket' in window) {ws = new MozWebSocket(target);} else {alert('WebSocket is not supported by this browser.');return;}ws.onmessage = function (event) { //创建websocket同时,接收服务器发给客服端的消息if(event!=null){//将json字符串转为对象eval("var msg="+event.data+";"); //得到对象里面的值var welcome = msg.welcome;var content = msg.content;var usernames = msg.usernames;//为聊天区teaxarea赋值var textArea = document.getElementById("content");if(undefined!=welcome){textArea.value = textArea.value  + "\r\n"+welcome;}if(undefined!=content){textArea.value = textArea.value  + "\r\n"+content;}//为用户列表区TD赋值var userListTD = document.getElementById("userList");userListTD.innerHTML="";for(var i = 0 ; i < usernames.length; i++){if(undefined!=usernames[i]){if("${requestScope.username}" == usernames[i]){userListTD.innerHTML += "\r\n  <span style='color: red'>" +  usernames[i]+"</span></br>";}else{userListTD.innerHTML += "\r\n" +  usernames[i]+"</br>";}}}}};}};sendMessage = function(){ //发送信息if(ws!=null){var sendMessageInput = document.getElementById("sendMessageTextArea");var msg = sendMessageInput.value;ws.send(msg);sendMessageInput.value ="";}else{alert("websocket is null , please create a websocket");}}</script><table cellpadding="0" cellspacing="0"  border="1" width="500px" height="400px"><tr><td><textarea id="content" rows="10" cols=50"></textarea></td><td id="userList" width="150px" align="center"></td></tr><tr><td colspan="2"><textarea id="sendMessageTextArea" rows="5" cols=50"></textarea><button οnclick="sendMessage()">发送</button></td></tr></table></body>
</html>

9 login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>login</title></head><body><form action="<%=request.getContextPath()%>/servlet/Login" method="get">用户名:<input type="text" name="username"/><input type="submit" value="登录"/></form></body>
</html>

(2) websocket 实现群聊相关推荐

  1. springboot整合websocket实现群聊

    1.依赖 2.websocket配置: 3.前端 4.注意事项 效果: 也可以打开新窗口连接一个新用户发消息 1.依赖 <dependency><groupId>org.spr ...

  2. SpringBoot实战之整合WebSocket之群聊

    SpringBoot实战之整合WebSocket 文章目录 SpringBoot实战之整合WebSocket 前言 一.WebSocket简介 二.WebSocket原理 三.WebSocket特点 ...

  3. websocket实现群聊

    群聊 转载于:https://www.cnblogs.com/caodneg7/p/10177344.html

  4. Swoole实现基于WebSocket的群聊私聊

    本文属于入门级文章,大佬们可以绕过啦.如题,本文会实现一个基于Swoole的websocket聊天室(可以群聊,也可以私聊,具体还需要看数据结构的设计). 搭建Swoole环境 通过包管理工具 # 安 ...

  5. Android中脱离WebView使用WebSocket实现群聊和推送功能

    WebSocket是Web2.0时代的新产物,用于弥补HTTP协议的某些不足,不过他们之间真实的关系是兄弟关系,都是对socket的进一步封装,其目前最直观的表现就是服务器推送和聊天功能.更多知识参考 ...

  6. Spring Boot整合websocket实现群聊,点对点聊天,图片发送,音频发送

    参考:基于https://blog.csdn.net/qq_38455201/article/details/80374712  基础上进行添加图片发送和音频发送功能 单点图片发送: 单点音频发送: ...

  7. Flask+geventwebsocket实现群聊与单聊功能

    Flask+WebSocket 实现群聊与单聊功能 群聊 py文件 from flask import Flask ,request,render_template from geventwebsoc ...

  8. websocket学习和群聊实现

    WebSocket协议可以实现前后端全双工通信,从而取代浪费资源的长轮询.在此协议的基础上,可以实现前后端数据.多端数据,真正的实时响应.在学习WebSocket的过程中,实现了一个简化版群聊,过程和 ...

  9. js 链接websocket马上断开_WebSocket之基于STOMP协议的广播模式实现群聊功能

    又是一个老套的古诗词赏析 不恨此花飞尽,恨西园.落红难缀.--苏轼<水龙吟·次韵章质夫杨花词> WebSocket与STOMP协议 相关简介 WebSocket WebSocket 是一种 ...

最新文章

  1. 个人管理:简单,我微博中的一句话,总有你喜欢的
  2. 不干胶标贴打印模板下载_A4纸打印17*6的不干胶标签打印模板如何设置
  3. 第二节 安装CentOS
  4. java 录屏_java 录屏 小工具源码(idea)
  5. 25个优秀的设计机构网站设计案例
  6. python定制框架知识点_python框架中flask知识点总结
  7. C#.NET验证码智能识别学习笔记---04C#.Net图片操作
  8. java多线程之wait和notify协作,生产者和消费者
  9. 别拿Excel糊弄老板了!IT总监做报表好看且简单,诀窍在哪
  10. 高德开放平台定位功能对接
  11. 数据科学家为什要用Git?怎么用? 1
  12. springboot mybatis优雅的添加多数据源
  13. 红帽为开发订阅成员提供的免费福利
  14. vue php 架构目录,vuex 项目结构目录及一些简单配置介绍
  15. EmEditor Professional v14/15/16/17/18 最新版 注册码 2000组(终身授权)
  16. Python3.7.0安装报:0x80072efd
  17. mac 笔记本命令行使用技巧
  18. 小红书批量发布帖子笔记软件怎么用
  19. 盘点6个主流的数据分析工具,及优缺点对比
  20. 手把手教你用 VuePress 快速搭建个人技术博客~

热门文章

  1. 【Java基础】static初始化块
  2. 牛客网_PAT乙级1016_部分A+B (15)
  3. Persistent Memory编程简介
  4. linux网络编程--阻塞与非阻塞
  5. 【简单解法】1093 字符串A+B (20分)_16行代码AC
  6. 28行代码AC——习题3-12 浮点数(UVA 11809 - Floating-Point Numbers)——解题报告
  7. 为什么delete表,还会占磁盘空间?
  8. (*长期更新)软考网络工程师学习笔记一—RSA算法详解
  9. Python程序开发——第二章 条件语句和循环语句
  10. WINDOWS下与LINUX下写C程序的区别