【网络编程】——WebSocket打开和关闭通道,消息发送

    HTML5给Web浏览器带来了全双工TCP连接WebSocket标准服务器的能力。浏览器和能够与服务器建立连接,通过已建立的通信信道来发送和接收数据而不需要由HTTP协议入额外的开销。

1、环境配置

jdk7或者是更高版本

tomcat7或者更高版本

两者版本保持一致(32位or64位)

实现WebSocket技术需要的jar包

在tomcat7.0中都包含,websocket-api.jar以及tomcat7-websocket.jar。tomcat7-websocket.jar是对websocket-api.jar的实现,两者缺一不可。

2、Websocket-api介绍

    ServerApplicationConfig是websocket的程序入口,在tomcat启动时会自动启动,是websocket的核心配置类。

    ServerApplicationConfig中包含两个方法,其实这两个方法的核心都是过滤,筛选配置websocket的类。

    getEndPointConfigs——通过实现类的方式获取所有配置websocket类

    getAnnotatedEndpointClasses——通过注解的方式获取配置websocket类,扫描src下所有类@serverEndpoint注解的类

    PS:Endpoint就是指一个websocket的一个服务端程序。

   本文也将采用注解的方式进行配置。

import java.util.Set;

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;

/**
 * @ClassName: DemoConfig
 * @Description: 获取配置websocket的类
 * @author 贾文静
 * @date 2017-5-22 下午9:24:02
 * 
 */
public class DemoConfig implements ServerApplicationConfig
{

    // 注解方式的启动
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scan)
    {
        //检测系统中的websocket类
        System.out.println("config......" + scan.size());
        // 返回 在服务端注册websocket类,过滤的作用
        return scan;
    }

   //实现类的方式
    public Set<ServerEndpointConfig> getEndpointConfigs(
            Set<Class<? extends Endpoint>> arg0)
    {
        return null;
    }

}

3、建立通信信道

建立通信信道是WebSocket技术实现的关键!

服务端

    服务端创建一个websocket的连接请求,为了方便把服务端处理请求的几个方法一并书写

import java.io.IOException;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
//websocket的连接请求的地址
@ServerEndpoint("/echo") //这一部分和客户端是对应的,特别重要!!!
public class EchoSocket
{
    public EchoSocket()
    {
        System.out.println("EchoSocket.EchoSocket()");
    }
    //对onpen给予反应应答,注入一个session对象
    @OnOpen
    public void open(Session session)
    {
        // 一个session唯一代表一个通信会话
        //通过sessionid区分连接
        System.out.println("sessionid:" + session.getId());
    }

      //关闭管道
    @OnClose
    public void close(Session session)
    {
        System.out.println("session:" + session.getId() + "关闭了。。。。。。");


    }
      //发送消息
    @OnMessage
    public void message(Session session, String msg)
    {
        System.out.println("客户端:" + msg);
	   // 服务端对客户的消息给予应答
        try
        {
            session.getBasicRemote().sendText("服务器端:in hao too");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

客户端

利用JavaScript进行处理,在这一部分同样有一个websocket连接地址的配置,存储到target对象中。

 

<script type="text/javascript">
    var ws;//一个ws对象就是一个通信管道
    //target就是要连接服务端的地址 刚好和服务端的websocket进行匹配和服务器端中表重要部分对应
    var target = "ws://localhost:8888/websocket_01/echo";
  	function subOpen(){
  	    //类似于ajax中兼容浏览器的处理
  		if("WebSocket"in window){
  			ws = new WebSocket(target);
  		}else if("MozWebSocket" in window){
  			ws = new MozWebSocket(target);
  		}else{
  			alert("WebSocket is not supported by this browser.");
  			return;
  		}
  		//获取客户端的消息,传递到服务端
  		ws.onmessage=function(event){
  			var dv = document.getElementById("dv");
  			dv.innerHTML+=event.data;
  		};
  	}
  	//发送消息的事件
  	function subSend(){
  		var msg = document.getElementById("msg").value;
  		ws.send(msg);
  		document.getElementById("msg").value = "";
  	}
  </script>
  <body>
      <br>
      <button onclick="subOpen();">open</button>
  	  <input id="msg"/><button onclick="subSend();">send</button>
  	  <span id="dv"></span>
  </body>
当程序启动后,观察后台的打印情况,程序中检测到一个websocket类。


进入程序界面,点击【open】,启动调试模式,观察链接调用


采用websocket的,URL是ws或者是wss开头,wss代表加密之后的。

在客户端文本框中输入消息后发送,注意前台的输出和后台的打印情况,其实在通道打开的过程中,实现了消息的通信。


【总结】

    消息通道的打开和信息传递只是其中很基础的一部分内容,做好基础后,将后开启后续的操作,实现聊天以及群聊之类。同时也渐渐发现随着技术的深入,感觉这个科技中的神秘感越来越少。。。。。。

转载于:https://my.oschina.net/u/3705835/blog/1550114

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值