关于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