Java后端WebSocket的实现

一.WebSocket简单介绍

 

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

这里主要讲Java后端WebSocket的Tomcat实现

应该明白了WebSocket。下来创建WebSocket

1.新建web项目 应该都会

2.查看tomcat版本,支持7以上的版本,打开apache-tomcat-9.0.14\lib目录找到jar包拷贝到项目lib下面

3.编写jsp页面

<script type="text/javascript">
		 var websocaket =null;
		 	if('WebSocket' in window){
				 websocaket = new WebSocket("ws://localhost:8080/WebSockt/WebSocketTest");//用于创建 WebSocket 对象。WebSocketTest对应的是java类的注解值
		 	}
		 	else {
				alert("当前浏览器不支持");
			}
		 //连接发生错误的时候回调方法;
		 websocaket.onerror=function(){
		                alert("连接错误");
		 }
		 //连接成功时建立回调方法;
		 websocaket.onopen=function(){
				alert("连接成功");
		 }
		 //收到消息的回调方法
		 websocaket.onmessage=function(msg){
			 setdivInnerHTML(msg.data);
		 }
		 //连接关闭的回调方法
		 websocaket.onclose=function(){
			 alert("关闭成功");
		 }
		 //关闭websocket
		 //
		 function closea() {
			 websocaket.close();
			 alert("点击关闭");
		}
		 function setdivInnerHTML(innerHTML) {
			 document.getElementById('div').innerHTML += innerHTML + '<br/>';
		}
		 function send() {
			 var message = document.getElementById('input').value;
			 websocaket.send(message);//给后台发送数据
		}
</script>

3.创建java文件

import java.io.IOException;

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;
 /**
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@ServerEndpoint("/WebSocketTest")
public class WebSocketTest {
	private Session session;
	 @OnOpen//打开连接执行
	 public void onOpw(Session session) {
		 this.session=session;
		 System.out.println("打开了连接");
	 }
	 @OnMessage//收到消息执行
	 public void onMessage(String message,Session session) {
		System.out.println(message);
	try {
		sendMessage(message);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
	 }
	 @OnClose//关闭连接执行
	 public void onClose(Session session) {
		 System.out.println("关闭连接");
	 }
	 @OnError//连接错误的时候执行
	 public void onError(Throwable error,Session session) {
		 System.out.println("错误的时候执行");
		  error.printStackTrace();
	 }
        /*
        websocket  session发送文本消息有两个方法:getAsyncRemote()和
       getBasicRemote()  getAsyncRemote()和getBasicRemote()是异步与同步的区别,
       大部分情况下,推荐使用getAsyncRemote()。
      */
	 public void sendMessage(String message) throws IOException{
	    this.session.getAsyncRemote().sendText(message);
          }
}

4.这是对应的项目运行图

 

  • 14
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值