网络编程 websocket

        websocket是一种持久化的协议,在建立起连接之后,和服务器就产生了一个通道,之后客户端和服务端的会话,都在这个通道中进行,而不会发起新的请求。协议头不再是http://开头的,而是以ws://进行开头,状态码是101。

        websocket主要有3个事件,建立连接的open事件,发送消息的message事件以及关闭连接的close事件。在客户端new websocket(url)对象时便触发了建立连接事件,使用websocket.send(str)时,触发发送消息事件,退出时触发关闭事件。

        在java后端,使用@ServerEndpoint("/addr")注解将目前的类定义成一个websocket服务器端,注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。这个类是多例的,每有一个连接建立时,便产生一个新的对象,使用静态变量来存储多个实例的共享数据(也可以访问数据库来替代静态变量)。

        在该类中,可以分别定义多个方法,在方法上加上@OnOpen注解就代表建立websocket连接时触发的方法,方法中接收一个javax.websocket.Session的参数,加上注解之后,该方法为回调方法,可以相应的session数据。同理,还有@OnMessage、@OnClose等注解。

        以下为一个简单的websocket演示,先建立连接,然后向服务端发送消息,服务端返回消息,客户端再主动断开连接。

详细代码:

> JSP代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>first websocket</title>
</head>
<body>
	<button onclick="conn();">conn</button>
	<input type="text" id="msg"/><button onclick="send();">send</button>
	<button onclick="closeWS();">close</button>
	<div id="div">
	</div>
</body>
<script type="text/javascript">
	var ws;//一个ws对象,就是一个通信管道
	var target = "ws://localhost:8080/websocket/echo";
	function conn(){
		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;
        }
		if(ws!=null){
			var div = document.getElementById("div");
			div.innerHTML+="websocket连接成功!<br/>";
		}
		//注册事件,异步接收服务端消息
		ws.onmessage = function(event){
			console.info(event);
			var div = document.getElementById("div");
			div.innerHTML+=event.data+"<br/>"; //event.data为服务器返回的数据
		};
	}
	
	function send(){
		var msg = document.getElementById("msg").value;
		ws.send(msg);
		document.getElementById("msg").value = "";
		var div = document.getElementById("div");
		div.innerHTML+="client:"+msg+"<br/>";
	}
	
	function closeWS(){
		ws.close();
		var div = document.getElementById("div");
		div.innerHTML+="websocket连接关闭<br/>";
	}
	
</script>
</html>

> JAVA代码:

/**
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/echo")
public class EchoSocket {
	public EchoSocket() {
		System.out.println("多例");
	}
	//静态变量,用来记录当前在线连接数。
	private static int onlineCount = 0;
	//打开连接时事件
	@OnOpen
	public void open(Session session) {
		//一个session就代表一个通信的会话
		System.out.println("session id:"+session.getId());
		onlineCount++;
		System.out.println("新用户加入,当前在线人数: "+onlineCount);
	}
	
	//关闭连接时事件
	@OnClose
	public void close(Session session) {
		//一个session就代表一个通信的会话
		System.out.println("session id:"+session.getId()+" close");
		onlineCount--;
		System.out.println("有用户退出,当前在线人数: "+onlineCount);
	}
	
	//发送消息事件
	@OnMessage
	public void message(Session session,String msg) {
		//打印客户端消息
		System.out.println("session id:"+msg);
		//服务端向客户端发消息
		try {
			session.getBasicRemote().sendText("server: "+msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebSocket是一种在客户端和服务器之间进行全双工通信的协议。它允许在Web应用程序中实现实时数据传输,而无需频繁的HTTP请求。 在网络编程中,使用WebSocket可以实现以下功能: 1. 双向通信:WebSocket通过建立持久连接,允许服务器主动向客户端推送数据,也可以由客户端向服务器发送数据。 2. 实时性:相比传统的HTTP请求,WebSocket可以实现更低的延迟和更高的实时性,适用于实时聊天、实时数据更新等场景。 3. 跨域支持:WebSocket协议支持跨域通信,可以在不同域名下的客户端和服务器之间进行通信。 在使用WebSocket时,需要注意以下几点: 1. 客户端和服务器都需要支持WebSocket协议。 2. 客户端可以使用浏览器内置的WebSocket API或者第三方库来实现WebSocket通信。 3. 服务器端可以使用各种编程语言和框架来实现WebSocket服务器,如Node.js的ws模块、Python的Tornado框架等。 使用WebSocket进行通信的基本流程如下: 1. 客户端发送一个HTTP请求给服务器,请求中包含Upgrade头部字段,表示希望协议从HTTP升级到WebSocket。 2. 服务器验证请求,如果支持WebSocket协议,则返回一个HTTP响应,状态码为101 Switching Protocols,并在响应头部添加Upgrade和Connection字段,表示协议已经切换为WebSocket。 3. 客户端和服务器之间建立WebSocket连接后,可以通过send()方法发送数据,通过onmessage事件接收数据。 总结一下,WebSocket是一种在Web应用程序中实现实时双向通信的协议,它提供了低延迟、高实时性和跨域支持的特性。在网络编程中,可以使用WebSocket来实现各种实时应用,如聊天室、实时数据展示等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值