Java用WebSocket实现聊天系统的案例

关于WebSocket网上已经有不少的介绍了,这里简单复制一下。

websocket采用全双工通信,使服务端也能主动向客户端发送数据。流程为:客户端向服务器发出建立websocket连接的请求,在websocket连接建立之后,客户端和服务端就可以通过TCP连接传输数据。

这里采用spring4.0的框架实现一个,有聊天用户列表(ip地址),显示发送人和和接收人,可以发送图片的例子。

废话少说,先上代码:代码资源下载地址


Java后端首先采用配置的形式实现端口:

WebSoketConfig .java

/**
 * @author sgchen项目启动时配置路径
 *
 */
@Configuration //定义配置文件
@EnableWebSocket //申明一个服务开启WebSocket
public class WebSoketConfig implements WebSocketConfigurer {

	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry handler) {
		// 支持的链接
		handler.addHandler(new WebSocketHandler(), "/sgchen").addInterceptors(new WebSocketHandInterceptor())
				.setAllowedOrigins("*");
		//SocketJs的链接
		handler.addHandler(new WebSocketHandler(), "/zh/sgchen").addInterceptors(new WebSocketHandInterceptor())
				.withSockJS();
	}

}

WebSocketHandInterceptor.java 

/**
 * @author Administrator
 *WebSocket拦截器
 */
public class WebSocketHandInterceptor implements HandshakeInterceptor {

	/**
	 * 初次握手之后
	 */
	@Override
	public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Exception e) {
	}

	/**
	 * 初次握手前
	 */
	@Override
	public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,
			Map<String, Object> map) throws Exception {
		if(request instanceof ServletServerHttpRequest) {
			HttpServletRequest rq=((ServletServerHttpRequest) request).getServletRequest();
			//rq.setCharacterEncoding("UTF-8");
			if(ServletFileUpload.isMultipartContent(rq)) {
				int len=rq.getContentLength();
				ServletInputStream in =rq.getInputStream();
				byte[] buffer=new byte[len];
				in.read(buffer, 0, len);
				//rq.getSession().setAttribute("IMAGE_BLOB", buffer);
				map.put("IMAGE_BLOB",buffer);
			}
			//使用userName区分WebSocketHandler,以便定向发送消息
			String host = (String) rq.getRemoteHost();
			
			//存入数据,方便在hander中获取,这里只是在方便在webSocket中存储了数据,
			//并不是在正常的httpSession中存储,想要在平时使用的session中获得这里的数据,需要使用session 来存储一下
			map.put("REMOTE_HOST",host);
			//rq.getSession().setAttribute("WEBSOCKET_USERNAME", host);
			
		}
		return true;
	}

}

WebSocketHandler .java 类

package com.fiberhome.godway.zdrcommon.WebSocket;

/**
 * @author sgchen
 *WebSocket消息处理中心
 */
public class WebSocketHandler extends AbstractWebSocketHandler{
	
	public static final Logger	logger	= Logger.getLogger(WebSocketHandler.class);
	
	public static Collection<WebSocketSession> servers=Collections.synchronizedCollection(new ArrayList<WebSocketSession>());
	
	FileOutputStream os;

	//连接关闭之后
	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
		// TODO Auto-generated method stub
		String host=(String) session.getAttributes().get("REMOTE_HOST");
		String message = "游客[" + host + "]退出聊天室!";
		logger.debug("连接关闭..."+closeStatus.toString());
		WebSocketUtil.removeSession(host);
		WebSocketUtil.notifyToAll(host,message);
	}

	//初次连接执行
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		// TODO Auto-generated method stub
		logger.debug("连接成功...");
		String host=(String) session.getAttributes().get("REMOTE_HOST");
		WebSocketUtil.addSession(host, session);
		String message = "有新人[" + host + "]加入聊天室!";
		WebSocketUtil.notifyToAll(host,message);
		
	}

	
	//连接错误
	@Override
	public void handleTransportError(WebSocketSession session, Throwable throwable) throws Exception {
		// TODO Auto-generated method stub
		if (session.isOpen()) {
			session.close();
		}
		logger.error("连接错误关闭连接", throwable);
		WebSocketUtil.removeSession(session.getAttributes().get("REMOTE_HOST").toString());
	}

	@Override
	public boolean supportsPartialMessages() {
		// TODO Auto-generated method stub
		return true;
	}
	
	//二进制信息
	@Override
	protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
		// TODO Auto-generated method stub
		ByteBuffer buffer=message.getPayload();
		os.write(buffer.array());
		//os.flush();
	}
	
	@Overri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值