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);

客户端


利用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 οnclick="subOpen();">open</button>
<input id="msg"/><button οnclick="subSend();">send</button>
<span id="dv"></span>
</body>

当程序启动后,观察后台的打印情况,程序中检测到一个websocket类。

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

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

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

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

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

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

【总结】

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