`
Asen丶
  • 浏览: 40345 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

WebSocket浅析(一):实现群聊功能

阅读更多

首先WebSocket打破了传统的web请求响应模式,实现管道式的实时通信,并且可以持续连接。

相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

 

所需jar包:websocket-api.jar,tomcat从7.0版本开始支持WebSocket,并且已经包含了所需jar包

websocket在tomcat中的参考配置文件路径:

webapps\examples\WEB-INF\classes\websocket

 

webapps\examples\websocket

 

首先我们需要一个class去实现ServerApplicationConfig接口作为配置文件,此时必须重写两个方法,分别是getEndpointConfigs()、getAnnotatedEndpointClasses(),getEndPointConfigs 获取所有以接口方式配置的webSocket类,getAnnotatedEndpointClasses 扫描src下所有用@ServerEndPoint注解的类。通常我们使用注解扫描的方法去实现,毕竟方便吧,该方法需要传入一个一class作为元素的Set集合,该集合表示扫描到的类,并且返回这个Set集合

package com.asen.websocket.config;

import java.util.HashSet;
import java.util.Set;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;

public class WebSocketConfig implements ServerApplicationConfig{

	@Override
	public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
		
		Set<Class<?>> results = new HashSet<Class<?>>();
		
		for (Class<?> clazz : scanned) {
			if (clazz.getPackage().getName().startsWith("com.asen.websocket.")) {
				results.add(clazz);
			}
		}
		
		return results;
	}

	@Override
	public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> arg0) {
		// TODO Auto-generated method stub
		return null;
	}

}

 

此时我们需要一个类并添加@ServerEndpoint("/chat")注解,此时表示的请求路径为ws://IP地址:8080/工程名称/chat,注意这里用的是ws协议,并不是传统的http,在这里类中通常用到三个注解:@OnOpen这个注解下的类会在客户端发起请求的时候执行,@OnMessage注解下的类通常是在接收客户端发送数据到服务器的时候执行,@OnClose注解下的类通常是在客户端断开连接的时候执行。

 

常用的Api:

获取服务器发送的请求参数session.getQueryString();

向客户端发送数据session.getBasicRemote().sendText(msg);

package com.asen.websocket.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import com.asen.websocket.entity.User;
import com.google.gson.Gson;

@ServerEndpoint("/chat")
public class SocketService {
	
	private Session session;
	private static String username;
	private static Set<SocketService> connections = new HashSet<SocketService>();
	private static List<String> usernames = new ArrayList<String>();
	
	/*
	 * websocket并不是单例的,每增加一名用户使用系统,就会创建一个websocket实例,
	 * 所以session这个全局变量有多份,不能用static修饰,
	 * 而广播消息的时候是根据session来判断发给谁的------------s.session.getBasicRemote().sendText(msg);
	 * 如果session用static修饰,那么消息只会发送给同一个人,并且当前系统有多少个用户,就会收到多少份相同的消息
	 */
	public SocketService(){
		System.out.println("创建了SocketServcie()实例");
	}

	@OnOpen
	public void connected(Session session) {
		this.session = session;
		connections.add(this);
		
		//获取服务器发送的请求参数
		String str = session.getQueryString();
		
		this.username = str.substring(str.indexOf("=") + 1);
		
		System.out.println(username + "开始使用本系统" + ", " + "sessionId为:" + session.getId());
		
		usernames.add(username);
		
		User user = new User();
		
		user.setNames(usernames);
		
		Gson gson = new Gson();
		
		broadcast(connections, gson.toJson(user));
	}
	
	/*
	 *服务器通过参数msg接收客户端发送过来的数据
	 */
	@OnMessage
	public void getMsg(Session session, String msg) {
		
		User user = new User();
		user.setDate(new Date().toLocaleString());
		user.setFrom(this.username);
		user.setSendMsg(msg);
		
		Gson gson = new Gson();
		
		broadcast(connections, gson.toJson(user));
	}
	
	@OnClose
	public void close(Session session){
		connections.remove(this);
		usernames.remove(this.username);
		
		User user = new User();
		
		user.setNames(usernames);
		
		Gson gson = new Gson();
		
		broadcast(connections, gson.toJson(user));
	}
	
	//广播消息
	public static void broadcast(Set<SocketService> sockets, String msg){
		for (SocketService s : sockets){
			try {
				//向客户端发送数据
				s.session.getBasicRemote().sendText(msg);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

1
1
分享到:
评论

相关推荐

    websocket实现单聊和群聊

    在这个基于Tomcat7和JDK7的WebSocket实现中,我们将探讨如何构建一个简单的单聊和群聊系统。首先,我们需要确保我们的环境支持WebSocket。Tomcat7从版本7.0.27开始支持WebSocket,而JDK7则提供了WebSocket的API。 1...

    WebSocket实现消息室群聊功能

    在本文中,我们将深入探讨如何利用WebSocket来实现一个消息室的群聊功能,以及用户列表的后台实时推送更新。 首先,WebSocket的核心特性是能够保持一个持久的连接,使得数据可以在客户端和服务器之间双向流动。这与...

    简单实现了websocket功能:websocket客户端、winformsocket客户端

    在本项目中,"简单实现了websocket功能:websocket客户端、winformsocket客户端",意味着我们有两个关键部分:WebSocket服务器端和基于WinForm的客户端。 WebSocket客户端通常是一个应用程序,它通过WebSocket协议...

    jakarta.websocket-api-1.1.2-API文档-中文版.zip

    Maven坐标:jakarta.websocket:jakarta.websocket-api:1.1.2; 标签:websocket、api、jakarta、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性...

    websocket-cluster:这是一个针对WebSocket集群服务器的Spring Cloud项目。

    实战Spring Cloud的WebSocket体现此项目是一个WebSocket实施的实践,基于Spring Cloud。原理我们利用一致性哈希算法,构造一个哈希环,网关监听WebSocket服务实例的上下线消息,根据实例的变化动态地更新哈希环。将...

    websocket的c#端实现

    WebSocket是Web应用中实现双向通信的关键技术,它允许服务器与客户端之间建立持久的连接,从而实现实时数据交换。...通过学习和实践,开发者可以轻松地在C#项目中集成WebSocket功能,实现高效的数据传输。

    javax.websocket-api-1.1-API文档-中文版.zip

    Maven坐标:javax.websocket:javax.websocket-api:1.1; 标签:javax、websocket、api、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...

    使用QT进行websocket 客户端和服务端通讯示例

    在QT中,我们可以使用`QtWebSockets`模块来实现WebSocket功能。这个模块包含两个主要类:`QWebSocket`(客户端)和`QWebSocketServer`(服务端)。首先,确保你的QT安装包含了这个模块,如果没有,需要在配置时添加`...

    java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统.zip

    一个基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统。适用于直播间聊天、游戏内聊天、客服聊天等临时性群聊场景。 Java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统。一...

    Node.js中WebSocket实现教程:创建全双工通信服务器与客户端

    ③学会在Node.js中实现WebSocket的各种高级功能,如处理二进制数据、错误处理和重连机制、安全性优化;④通过实战项目加深对WebSocket的理解并将其应用于具体的业务场景,如实时聊天、在线游戏和实时数据可视化等。 ...

    go-jsonrpc-websocket.rar

    我们将在客户端使用Go语言和jsonrpc库来实现这一功能。 在实现这个客户端时,你需要遵循以下步骤: 1. **导入必要的库**:首先,你需要导入`net/rpc/jsonrpc`库,用于处理JSON-RPC调用,以及`websocket`库,用于...

    Vue通过配置WebSocket并实现群聊功能

    在实际群聊功能实现中,还需要配置Vuex以管理WebSocket连接的状态。这涉及到在Vuex store中定义state、mutations和actions。state负责维护连接状态和消息等数据,mutations处理WebSocket的各类事件,如连接打开、...

    WebSocket实时通信:构建高效实时Web应用

    WebSocket提供了一种在单个长连接上进行全双工通信的方式,允许服务器和客户端之间进行实时数据交换。本文将详细介绍WebSocket的基本概念、工作原理、实现方法以及在构建实时Web应用中的应用。 WebSocket提供了一种...

    Qt实现WebSocket客户端和服务端通信

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它提供了全双工的通信方式,使得数据可以在两者之间双向实时传输。在IT行业中,WebSocket被广泛应用于实时应用,如在线聊天、股票交易、游戏等场景,因为它...

    Android WebSocket实现即时通讯功能

    使用Java-WebSocket开源框架开发Android端即时通讯功能。主要功能: 1、与websocket建立长连接 2、与websocket进行即时通讯 3、Service和Activity之间通讯和UI更新 4、弹出消息通知(包括锁屏通知) 5、心跳检测和重...

    spring-websocket-5.2.2.RELEASE.jar

    spring-websocket-5.2.2.RELEASE.jar

    faye-websocket-ruby:符合标准的WebSocket客户端和服务器

    这是从项目中提取的通用WebSocket实现。 它提供了用于在Ruby中轻松构建WebSocket服务器和客户端的类。 它不提供服务器本身,而是使在现有应用程序中处理WebSocket连接变得容易。 除了标准的之外,它不提供任何抽象...

    IOS WEBSOCKET Objective-C实现

    比如,`webSocketDidConnect:`代理方法会在连接成功时被调用,`webSocket:didReceiveMessage:`用于处理接收到的消息。 ```objc @interface YourViewController () @property (nonatomic, strong) WebSocket *...

Global site tag (gtag.js) - Google Analytics