WebSocket,简单理解就是H5自带的一套Socket API,用它来实现客户端与服务端的长连接。
使用案例: 实现一个活动的实时报道,也就是图文直播功能
- 首先来看下项目的结构,很简单,就两个类
MyWebSocket.java
这个就是socket的服务端,功能方面只需添加相应的注解即可,注意类名上的注解@ServerEndpoint(“/websocket”),这个/websocket就好比是配置在web.xml中的servlet url一样。
H5客户端对应这个服务端实现信息的交互
package websocket.server;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。
@ServerEndpoint("/websocket")
public class MyWebSocket {
// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();
// 与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
/**
* 连接建立成功调用的方法
*
* @param session
* 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
* @throws IOException
*/
@OnOpen
public void onOpen(Session session) throws IOException {
this.session = session;
webSocketSet.add(this); // 加入set中
addOnlineCount(); // 在线数加1
System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
//模拟从数据库中取出历史信息
this.sendMessage("<img src='http://localhost/websocket/image/water.gif'>");
this.sendMessage("这是第一张现场图,散水.gif");
this.sendMessage("<hr />");
this.sendMessage("<img src='http://localhost/websocket/image/test.jpg'>");
this.sendMessage("这是第二张图哦.....");
this.sendMessage("<br/>");
this.sendMessage(