websocket是HTML5的新协议,实现了全双工服务器向客户端的通信技术,基于TCP/IP,连接时通过HTTP1.1协议,传输时通过TCP
http与websocket区别
http是短连接,请求之后会关闭连接,虽然后keepalive机制可以保持连接,但是仍然有时间段限制,每次连接都要消耗三次握手四次挥手,单向传输
websocket是长连接,双向传输
socket是一组接口,websocket是一个完善的应用层协议,有一套完整的API
常用注解:
@ServerEndpoint 类似于RequestMapping
@OnOpen初始化注解
@OnClose销毁之后做的操作
@OnError报错后的操作
@OnMessage业务层
HTTPS和HTTP的区别主要为以下四点:
1、https协议需要到ca申请证书,一般免费证书很少,需要交费。
2、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
@ServerEndpoint("/websocket")
@Controller
public class WebScoketServer {
private static Integer onlineNum = 0; //当前在线人数,线程必须设计成安全的
private static CopyOnWriteArraySet<WebScoketServer> arraySet = new CopyOnWriteArraySet<WebScoketServer>(); //存放每一个客户的的WebScoketServer对象,线程安全
private Session session;
/**
* 连接成功
* @param session 会话信息
*/
@OnOpen
public void onOpen(Session session) {
this.session =session;
arraySet.add(this);
this.addOnlineNum();
System.out.println("有一个新连接加入,当前在线 "+this.getOnLineNum()+" 人");
}
/**
* 连接关闭
*/
@OnClose
public void onClose() {
arraySet.remove(this);
this.subOnlineNum();
System.out.println("有一个连接断开,当前在线 "+this.getOnLineNum()+" 人");
}
/**
* 连接错误
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.err.println("发生错误!");
error.printStackTrace();
}
/**
* 发送消息,不加注解,自己选择实现
* @param msg
* @throws IOException
*/
public void onSend(String msg) throws IOException {
this.session.getBasicRemote().sendText(msg);
}
/**
* 收到客户端消息回调方法
* @param session
* @param msg
*/
@OnMessage
public void onMessage(Session session, String msg) {
System.out.println("消息监控:"+msg);
for (WebScoketServer webScoketServer : arraySet) {
try {
webScoketServer.onSend(msg);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 增加一个在线人数
*/
private synchronized void addOnlineNum() {
onlineNum++;
}
/**
* 减少一个在线人数
*/
private synchronized void subOnlineNum() {
onlineNum--;
}
private Integer getOnLineNum() {
return onlineNum;
}
}