效果预览

有小伙伴需要源码,该文章中的代码年代久远,重新弄了一个seven-im,请移步

web即时通讯的解决方式

  • 轮询:简单粗暴,过多的请求,服务器表示压力很大

  • 长连接:发送请求到服务器,有消息时才返回,长时间占用资源

  • websocket:基于tcp新的协议,双向通信

    废话少说,上代码(部分关键代码)!

    即时通讯-单聊功能表-聊天功能-聊天app-聊天信息加密沟通-聊天文本-聊天技术-聊天构架源码-聊天 记录同步云储存-聊天消息测回-哇谷即时通讯IM源码

html



交流平台
发送

js

var Chat = {};
Chat.socket = null;
Chat.connect = (function(host){
    if ('WebSocket' in window) {
        Chat.socket = new WebSocket(host);
    } else if ('MozWebSocket' in window) {
        Chat.socket = new MozWebSocket(host);
    } else {
        Console.log('Error: WebSocket is not supported by this browser.');
        return;
    }
    //websocket连接打开时
    Chat.socket.onopen = function () {
        document.getElementById('chat').onkeydown = function(event) {
            if (event.keyCode == 13) {
                Chat.sendMessage();
                event.returnValue = false;
                event.preventDefault();
            }
        };
    };
    //websocket连接关闭时
    Chat.socket.onclose = function () {
        document.getElementById('chat').onkeydown = null;
    };
    //websocket连接有消息时
    Chat.socket.onmessage = function (message) {
        var data = eval('(' + message.data + ')');
        //data即为后台发送的数据,在此根据数据内容进行判断属于Chat.info | Chat.self | Chat.other
    }
    
});
//初始化
Chat.initialize = function() {
    if (window.location.protocol == 'http:') {
        Chat.connect('ws://' + window.location.host + '/websocket/chat');
    } else {
        Chat.connect('wss://' + window.location.host + '/websocket/chat');
    }
};
//发送的方法
Chat.sendMessage = (function() {
    var message = document.getElementById('chat').value;
    if (message != '') {
        var data = {
    		'from':'',
    		'to':'',
    		'groupId':'',
    		'type':'',
    		'message':message
    	}//from,to,type为后期私聊,群里
    	var msg = JSON.stringify(data);
        Chat.socket.send(msg);
        document.getElementById('chat').value = '';
    }
});

var Console = {};//聊天主窗体
//负责展现系统提示,例如 小明进入
Console.info = (function(message) {
    var h = '
'+ message +'
'; $('#center').append(h); }); //负责展现自己发送的消息,显示在右边 Console.self=(function(data){ var h = ''; //将data解析为html片段 $('#center').append(h); }); //负责展现其他人发送的消息,显示在左边 Console.other=(function(data){ var h = ''; //将data解析为html片段 $('#center').append(h); }); Chat.initialize();

java后台

  • 核心处理类ChatWebSocket.java,负责websocket连接/关闭/收发消息的整个过程
  • 消息类WebSocketMessage.java,发送消息的载体
  • 消息处理类ServerEncoder.java,将消息进行编码转json设置
  • 配置类GetHttpSessionConfigurator.java,获取httpSession

ChatWebSocket.java

websocket连接/关闭/收发消息的整个过程

@ServerEndpoint(value = "/websocket/chat", configurator = GetHttpSessionConfigurator.class, encoders = ServerEncoder.class)
public class ChatWebSocket {
    //存储所有的websocket连接
    private static final Map CONNECTIONS = new LinkedHashMap();
	private User user;
	private Session session;
    
    /**
    * 当websocket握手成功时触发
    * 该方法参数是可选的,session指的是websocket的session,不是httpSession.
    * 获取httpSession需要通过EndpointConfig类,而EndpointConfig类是由@ServerEndpoin()中的configurator进行设置
    */
    @OnOpen
    public void start(Session session, EndpointConfig config){
        this.session = session;            
        HttpSession httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
        WebSocketMessage webSocketMessage = new WebSocketMessage();
        if(httpSession == null){
			webSocketMessage.setMessage("您未登录系统");
			ChatWebSocket.sendToOne(this,webSocketMessage);
			try {
				this.session.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}else{
		    //获取httpSession中登录的用户
		    User user = (User) httpSession.getAttribute("currentUser");
		    if(user == null){
				webSocketMessage.setMessage("登录错误,未知用户");
				ChatWebSocket.sendToOne(this,webSocketMessage);
				try {
					this.session.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}else{
				this.user = user;
				CONNECTIONS.put(this.user.getId(), this);
				webSocketMessage.setUserId(this.user.getId());
				ChatWebSocket.sendToOne(this,webSocketMessage);
				String msg = this.user.getName() + " 进入";
				ChatWebSocket.broadcastOnline(msg);
			}
		}
    }
    
    //当websocket握手关闭时触发
    @OnClose
    public void end(){
        CONNECTIONS.remove(this.user.getId());
		String msg = this.user.getName() + " 离开";
		ChatWebSocket.broadcastOnline(msg);
    }
    
    //当收到消息时
    @OnMessage
    public void incoming(String message){
        WebSocketMessage webSocketMessage = new WebSocketMessage();
		webSocketMessage.setUserId(this.user.getId());
		webSocketMessage.setUserName(this.user.getName());
		webSocketMessage.setMessage(message);
		webSocketMessage.setSendDate(new Date());
		ChatWebSocket.broadcast(webSocketMessage);
    }
    
    //发送至单独用户
    private static void sendToOne(ChatWebSocket chatWebSocket,
			WebSocketMessage webSocketMessage) {
		chatWebSocket.session.getAsyncRemote().sendObject(webSocketMessage);
	}
    
    //广播
    private static void broadcast(WebSocketMessage webSocketMessage) {
        Set keys = CONNECTIONS.keySet();
        for (String key : keys) {
			ChatWebSocket chatWebSocket = CONNECTIONS.get(key);
			synchronized (chatWebSocket) {
				ChatWebSocket.sendToOne(chatWebSocket, webSocketMessage);
			}
		}
    }
    
    //广播在线用户
    private static void broadcastOnline(String msg) {
		Set keys = CONNECTIONS.keySet();
		WebSocketMessage webSocketMessage = new WebSocketMessage();
		webSocketMessage.setType(WebSocketMessage.WEBSOCKETMESSAGE_TYPE_ALL);
		webSocketMessage.setMessage(msg);
		List userList = new ArrayList();
		for (String key : keys) {
			ChatWebSocket chatWebSocket = CONNECTIONS.get(key);
			userList.add(chatWebSocket.user);
		}
		webSocketMessage.getAttributes().put("user", userList);
		for (String key : keys) {
			ChatWebSocket chatWebSocket = CONNECTIONS.get(key);
			synchronized (chatWebSocket) {
				ChatWebSocket.sendToOne(chatWebSocket, webSocketMessage);
			}
		}
	}
    
}

WebSocketMessage.java

发送消息的载体

public class WebSocketMessage {
    private String userId;
	private String userName;
	private string from;
	private string to;
	private string groupId;
	...
	private String message;
	private Date sendDate;
	private String type;
	private Map attributes = new HashMap();
	
	public WebSocketMessage(){
		super();
	}
	
	public WebSocketMessage(String userName,String message,Date sendDate) {
		this.userName = userName;
		this.sendDate = sendDate;
		this.message = message;
	}
	
	//getter and setter ...
}

ServerEncoder.java

将消息进行编码转json设置

public class ServerEncoder implements Encoder.Text {
	@Override
	public void init(EndpointConfig paramEndpointConfig) {
		// TODO Auto-generated method stub
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
	}
	
	@Override
	public String encode(WebSocketMessage paramT) throws EncodeException {
	    //将WebSocketMessage转为json
		return JsonMapper.buildNormalMapper().toJson(paramT);
	}
}

GetHttpSessionConfigurator

获取httpSession

public class GetHttpSessionConfigurator extends Configurator {
	@Override
	public void modifyHandshake(ServerEndpointConfig sec,
			HandshakeRequest request, HandshakeResponse response) {
		HttpSession httpSession=(HttpSession) request.getHttpSession();
		if(httpSession!=null){
			sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
		}        
	}
	
}

以上只是部分关键代码,简单的实现了即时通讯,若需要私聊,群聊,分组等功能,则需改造WebSocketMessage.java和前端js中Chat.socket.onmessage()

有小伙伴需要源码,该文章中的代码年代久远,重新弄了一个seven-im,请移步

--------------

热门搜索:

什么是私有云? 私有云、公有云还是混合云?企业该如何选? 企业聊天APP有什么作用,可以带来哪些便利? 企业选择混合云的优势 聊天APP应该具备哪些功能?怎么确保信息不被泄露? 企业即时通讯的使用价值有哪些 企业IM是什么,有什么使用优势? JM沟通优势有哪些,安全性怎么样? JM沟通APP功能强大且安全性高 IM云系统即时通讯公有云、私有云、企业云、海外云-哇谷IM团队 对于IM即时通讯的性能与并发性问题xmpp等各种通信协议 sso登录统一账号体系和集中认证授权 MongoDB数据库百万并发设计使用方法 WebRTC视频会议服务器性能10万并发 办公协同解决方案的意义 有什么优势? 美国FBI遭黑客攻击 超10万人收到垃圾邮件!这家零佣金券商也被攻击 用户数据泄露-企业即时通讯安全 工作台支持私有化部署-企业办公通信管理-软件开发管理系统-哇谷云 Application scenarios of wagu im cloud service A typical IM architecture might look like this 哇谷IM实现原理讲解-哇谷IM即时通讯云 JM沟通功能图片演示-哇谷IM即时通讯云 硬件配置选择-哇谷IM即时通讯云 IM私有化价格服务系统-哇谷IM即时通讯云 哇谷云服务项目表 哇谷IM定制私有化搭建资料准备工单-哇谷IM即时通讯云 APP中红包功能技术最常见的形式-哇谷im即时通讯云 私有云、公有云还是混合云?企业该如何选? 租用海外云服务器时应注意的事项 私有云比起公有云安全性大大提高 哇谷云服务应用场景十分丰富多元 聊天APP功能强大 用户群体越来越广泛 企业打造私有云平台需要注意的几点 企业聊天办公软件如何挑选,需要具备哪些功能? IM的作用可不只是单纯的聊天工具 企业使用即时通讯的好处有哪些? 企业通讯常见的困扰:有什么办法提高通讯质量? 聊天APP应该具备哪些功能?怎么确保信息不被泄露? 语音会议软件越来越多:到底哪个软件适合开会? 使用手机能否召开视频会议?哪些软件值得选择? JM沟通与传统通讯软件有何区别?是否只能用于社交? 语音会议效果难以保障 你有准备专业会议软件吗 专业企业通讯软件功能齐全 让办公变得更加轻松快捷 业应不应该开发聊天APP 三个不容拒绝的理由 企业通讯软件如何选择 隐私保护终于一切 视频会议没有专用软件 很多事情都无法处理 哪些是常用的微服务框架? 企业如何搭建私有云? 即时通讯软件是否具有聊天回执的功能? 企业即时通讯软件支持多设备登陆吗? 企业即时通讯适合中小企业的即时通讯软件? 盘点全球几大即时通讯软件 介绍两款国外大佬级别的即时通讯APP Short video features 即时通讯短视频功能的基本特点主要有哪些 Features of chat function 聊天功能在即时通讯软件中的产品特色体现在哪里 Increase the function of red envelope 为什么在即时通讯软件中会增加红包功能 instant messaging 即时通讯 办私密软件公 Office privacy software Cloud service 云服务 Im definition IM定义 How to meet office requirements Main features of instant messaging 即时通讯云软件应该如何达到集团办公的需求 企业即时通讯软件设计的特点主要有哪些 Instant messaging cloud red packet  福利发送新办法,IM即时通讯云红包功能的大势所趋 LAN communication 区域网通讯可以促进企业发展,使信息传输更快捷 Production guide of enterprise specific app 企业专属聊天APP的生产指南,这里应有尽有! Waguyun privacy protection 企业通讯无法得到私密保障?哇谷云上办公为您提供专业服务! Choose Wawa Guyun for internal communication 企业内部交流怎么办?现在有了哇谷云!  Advantages of LAN  局域网通讯企业真的需要吗?它有哪些优点? Enterprise instant messaging voice conference app 新发展、新机遇 全球疫情下的企业即时通讯语音会议 Provide efficient enterprise communication 专业呼叫中心 提供高效企业通信解决方案 New layout of global economic integration 协同办公解决方案,全球一体化经济新布局 There is more than one way for IM tools 还在使用微信?IM工具不止有一条途径 Power source for efficient operation 选择办公协同解决方案,现代企业高效运转的动力源 Efficient enterprise specific instant messaging 企业聊天APP,私密度高的高效企业专属即时通讯APP 新一代私有云与早期私有云的区别 The difference between private clouds What are the advantages of private cloud 新一代私有云有哪些优势? 单聊功能 群聊功能红包功能源码 实时音视频 短视频 音视频会议源码 低延迟直播 哇谷IM云服务 IM私有化搭建源码 私有化搭建准备文件 TF签名知识 企业即时通讯 IM 即时通讯 IM定制功能 语音聊天室 在线教育 金融服务 sso单点登录系统 政府加密沟通 企业通信办公 KTV点唱系统 局域网通讯 知识库 企业即时通讯 sso单点登录系统 KTV点唱系统版本Demo JM沟通2.0版本Demo 哇谷IM企业办公版本 哇谷工作台 短视频源码 音视频会议源码 直播聊天源码 ios超级签名服务 哇谷云 哇谷科技 即时通讯 IM下载http://www.juemigoutong.com/webproduct.html IM功能与价格http://www.juemigoutong.com/webcooperation.html 哇谷IM团队,哇谷即时通讯,哇谷官方站 即时通讯-哇谷即时通讯-IM-直播-短视频-音视频会议-大型企业即时通讯办-即时通讯源码-聊天app-http://www.wagukeji.com 即时通讯-哇谷即时通讯-IM-直播-短视频-音视频会议-大型企业即时通讯办-即时通讯源码-聊天app-sso-http://www.juemigoutong.com 即时通讯-哇谷即时通讯-IM-直播-短视频-音视频会议-大型企业即时通讯办-即时通讯源码-聊天app-http://www.wagu.cloud 即时通讯-哇谷即时通讯-IM-直播-短视频-音视频会议-大型企业即时通讯办-即时通讯源码-聊天app-http://bolg.wagu.cloud 即时通讯-哇谷即时通讯-IM-直播-短视频-音视频会议-大型企业即时通讯办-即时通讯源码-聊天app-http://so.wagu.cloud