`

WebSocket简单实现

 
阅读更多

WebSocket是基于HTML5标准的TCP协议,有点像HTTP,但是它在浏览器和Server之间实现了类似TCP的全双工通信,基于持久连接优于HTTP实现BS方式即时相互通信。在Tomcat7中实现了WebSocket,J2EE7(Servlet3.0)中也实现了WebSocket。

记录一下 Java Web服务端和javascript html客户端实现WebSocket:

1,环境

tomcat7.0.68,

JDK1.7,

WebAPP Server Servlet3.0

js websocket client library:socket.io-1.4.5.js

 

2,实现服务端

Annotated Endpoints方式:

这种方式配置实现一个ServerEndpoint就行了

 

package merrick.websocket;
import java.net.InetAddress;
import java.net.URI;
import java.util.Date;
import javax.websocket.CloseReason;
import javax.websocket.EndpointConfig;
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(value = "/service1")
public class WS1 {

	@OnOpen
	public void onOpen(Session session,	EndpointConfig conf){<span style="font-family:Arial;">//建立</span>
		
		URI u = session.getRequestURI(); 
		System.out.println(new Date().toString()+", connected: " + session.getRequestURI().toString()+" , info: " );
	}
	
	@OnMessage
	public void onMessage(Session ss, String msg){//收到客户端消息
		try {
			InetAddress adr = InetAddress.getLocalHost();
			String localip = adr.getHostAddress().toString();			
			
			System.out.println(new Date().toString()+", received: " + msg);
			
			ss.getBasicRemote().sendText("["+  new Date().toLocaleString()+"][WS1:_1,"+localip+"] "+msg);
			
			for (int i = 0; i < 4; i++) {
				Thread.currentThread().sleep(5000);				
				ss.getBasicRemote().sendText("["+  new Date().toLocaleString()+"][WS1:_"+ String.valueOf(i+2)  +","+localip+"] "+msg);
			}	
			
			
		} catch (Exception e) {
		
			e.printStackTrace();
		}
	}	

	@OnError
	public void onError(Session session, Throwable error){//
		URI u = session.getRequestURI();
		System.out.println(new Date().toString()+", error: " + session.getRequestURI().toString()+" , info: " + u.getUserInfo());//null info
	}	
	
	@OnClose
	public void onClose(Session ss, CloseReason rz){//连接关闭
		URI u = ss.getRequestURI();
		System.out.println(new Date().toString()+", closed: " + ss.getRequestURI().toString()+" , info: " + u.getUserInfo());//null info
	}
	
}

 

PROGRAMMATIC EndPoints方式:

这种方式需要实现ServerApplicationConfig接口,并在重写方法中加载ServerEndpointConfig,

 

package merrick.websocket;
import java.net.InetAddress;
import java.util.Date;
import javax.websocket.CloseReason;
import javax.websocket.Endpoint;
import javax.websocket.EndpointConfig;
import javax.websocket.MessageHandler;
import javax.websocket.Session;

import org.apache.log4j.Logger;
public class WS2 extends Endpoint  {
	
	private static Logger log = Logger.getLogger(WS2.class);

	@Override
	public void onOpen(final Session ss, EndpointConfig arg1) {
		
		System.out.println(new Date().toString()+", connected: " + ss.getRequestURI().toString()+" , info: " );
		
		
		ss.addMessageHandler(new MessageHandler.Whole<String>() {

					@Override
					public void onMessage(String msg) {


						try {
							InetAddress adr = InetAddress.getLocalHost();
							String localip = adr.getHostAddress().toString();
							String s = new Date().toString()+", received: " + msg;
							log.info(s);
							System.out.println(s);
							
							ss.getBasicRemote().sendText("[WS2: ]"+msg);
							
							for (int i = 0; i < 4; i++) {
								Thread.currentThread().sleep(5000);
								String s2 = "["+  new Date().toLocaleString()+"][WS2:_"+ String.valueOf(i+2)  +","+localip+"] "+msg ;
								
								ss.getBasicRemote().sendText(s2);
								
								log.info("Reply: "+s2);
								
							}
							
							
						} catch (Exception e) {
						
							e.printStackTrace();
						}						
					}					
					
				
				});
		
		
	}
	
	
	@Override
	public void onClose(Session session, CloseReason closeReason) {
		// TODO Auto-generated method stub
		super.onClose(session, closeReason);
	}
	
	@Override
	public void onError(Session session, Throwable throwable) {
		// TODO Auto-generated method stub
		
		System.out.println(throwable.toString());
		
		super.onError(session, throwable);
	}
	
	

}

 

package merrick.websocket;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import org.apache.log4j.Logger;

public class WS2ApplicationConfig implements ServerApplicationConfig {
	
	private static Logger log = Logger.getLogger(WS2ApplicationConfig.class);

	@Override
	public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> arg0) {
		// TODO Auto-generated method stub
		
		log.info("getAnnotatedEndpointClasses");
		
		return arg0;
	}

	@Override
	public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> arg0) {
		// TODO Auto-generated method stub
		
		Set<ServerEndpointConfig> ec = new HashSet<ServerEndpointConfig>();
		ec.add(ServerEndpointConfig.Builder.create(merrick.websocket.WS2.class, "/service2").build());//加载Endpoint服务类
		/**
		 * annotation方式继承Endpoint类无需手动在此ServerApplicationConfig中加载,并且不需要实现ServerApplicationConfig接口
		 * 
		 * */
		
		log.info("getEndpointConfigs");
		
		return ec;
	}

}



 

3,实现Web客户端

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	
	<script type="text/javascript" src="socket.io-1.4.5.js"></script>
	<script type="text/javascript" src="jquery-1.9.1.js"></script>
	<script type="text/javascript">
		
	
		$(document).ready(function(){
			
			//等于$(function(){});
		//	var ws = new WebSocket("ws://192.168.245.133:8080/websocketservertest1/service1"); //ws://<ip>:<port>/<projectname>/<endpointpath>
			
			var ws = new WebSocket("ws://localhost:8080/websocketservertest1/service2"); 
			ws.onopen = function(){ws.send("Test!"+new Date().getSeconds()); }; 
			ws.onmessage = function(evt){
				console.log(evt.data);
				
				$("#datadiv").append("<br/>"+evt.data);
				
			//	alert(evt.data);
			//	ws.close();
			}; 
			ws.onclose = function(evt){console.log("WebSocketClosed!");alert("closed");}; 
			ws.onerror = function(evt){console.log("WebSocketError!");alert("error");};
			
			
		});
	
	</script>
	
</head>
<body>
<div id="datadiv"></div>
</body>
</html>



4,测试

比如测试/service2的时候在页面上会出现如下定时响应展现:

[WS2: ]Test!15
[2016-10-10 14:49:20][WS2:_2,<ip>] Test!15
[2016-10-10 14:49:25][WS2:_3,<ip>] Test!15
[2016-10-10 14:49:30][WS2:_4,<ip>] Test!15
[2016-10-10 14:49:35][WS2:_5,<ip>] Test!15



分享到:
评论

相关推荐

    使用webSocket简单实现群发消息和指定用户发送消息

    在"使用WebSocket简单实现群发消息和指定用户发送消息"的实践中,我们通常会有一个WebSocket服务端(WebSocketSev)处理来自客户端的连接和消息。首先,我们需要创建一个WebSocket服务器,监听特定的端口,并等待...

    websocket简单实现

    首先,我们需要创建一个实现了`javax.websocket.OnOpen`, `javax.websocket.OnClose`, `javax.websocket.OnMessage`, 和 `javax.websocket.Session`接口的类。例如: ```java @ServerEndpoint("/websocketendpoint...

    Springboot+websocket 实现多人聊天室/单人聊天

    这是一个简单使用websocket实现多人聊天室,单人聊天室的demo,里面使用的是最原始的websocket的方法,附有客户端界面可以直接跑起来发送消息看效果。 该项目对应刚刚接触websocket技术是比较有用的。 2019-10-11的...

    c c++实现websocket服务器 c c++实现websocket客户端

    这个代码例子使用了c c++实现了websocket 开发 包含了websocket服务器和websocket客户端,拥有详细的解释 这个库比libwebsocket更加简单方便,比libsocket更加高效便捷.

    C语言实现的websocket

    为了测试和调试C语言实现的WebSocket客户端,通常会配合一个简单的HTML页面,利用浏览器的WebSocket API。HTML页面可以创建一个WebSocket对象,连接到C客户端运行的本地服务器,然后通过JavaScript发送和接收数据,...

    webSocket实现Android客户端之间简单的通讯

    以上就是使用WebSocket在Android客户端之间实现简单通讯的基本步骤。需要注意的是,实际应用中还需要处理网络变化、错误重连、心跳保持等一系列问题,以确保通讯的稳定性和可靠性。此外,服务器端也需要支持...

    简单的WebSocket实现

    在“简单的WebSocket实现”中,我们看到使用的开发环境是Eclipse,这是一个广泛使用的Java集成开发环境,对于Web应用开发提供了强大的支持。而服务器端选择的是Tomcat 7.0以上版本,Tomcat是一款开源的Servlet容器,...

    用jetty8.0写的websocket实现的简单聊天程序

    在这个“用jetty8.0写的websocket实现的简单聊天程序”中,我们将深入探讨如何利用Jetty 8.0这个轻量级、高性能的Java Web服务器和Servlet容器来构建WebSocket应用。 Jetty是一个开源的HTTP服务器和Servlet容器,...

    WebSocket的简单实现

    在压缩包中的"WebSocketSample-master"文件可能是包含了一个简单的WebSocket示例项目,你可以通过阅读代码来进一步了解WebSocket在C#中的具体实现。通常,这样的示例会包含服务器端和客户端的代码,以及如何处理数据...

    WebSocket的两种简单实现

    Spring的WebSocket库包含了STOMP(Simple Text Oriented Messaging Protocol)的支持,STOMP是一个简单、易用的二进制协议,可用于在WebSocket之上进行消息传递。 要使用STOMP与WebSocket,你需要在Spring Boot应用...

    java websocket实现简单的聊天功能

    下面将详细介绍如何使用Java WebSocket实现一个简单的聊天功能。 首先,我们需要创建WebSocket服务器端。在Java中,我们通常会创建一个实现了`javax.websocket Endpoint`接口的类。这个类是WebSocket连接的核心,它...

    简单实现了websocket功能:websocket客户端、winformsocket客户端

    在本项目中,"简单实现了websocket功能:websocket客户端、winformsocket客户端",意味着我们有两个关键部分:WebSocket服务器端和基于WinForm的客户端。 WebSocket客户端通常是一个应用程序,它通过WebSocket协议...

    WebSocket 的简单实现的的聊天

    在"WebSocket 的简单实现的的聊天"项目中,我们主要会涉及到以下几个关键知识点: 1. **WebSocket协议基础**:WebSocket协议基于TCP/IP,通过握手过程建立连接。握手过程中,客户端发送一个`Upgrade`头来请求升级到...

    springboot+websocket聊天室(多人聊天,单人聊天)

    Spring Boot以其简洁的配置和强大的功能在Java开发领域广受欢迎,而WebSocket则提供了全双工的通信机制,使得实时交互应用如聊天室得以实现。 首先,我们需要在Spring Boot项目中引入WebSocket的相关依赖。在`pom....

    websocket_for_linux-master_websocket_websocket客户端_WEBSOCKET单片机实现

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

    webSocket 服务器端的简单实现

    在这个"WebSocket服务器端的简单实现"中,我们可能会学习到以下关键知识点: 1. **WebSocket协议基础**:WebSocket协议建立在TCP协议之上,通过握手过程建立起持久的连接。握手过程中,客户端发送一个HTTP Upgrade...

    websocket方法实现收发语音的服务器和客户端的python代码

    - 接下来,创建一个简单的WebSocket服务器: ```python from flask import Flask, render_template from flask_socketio import SocketIO, emit app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!'...

    websocket demo 简单实现

    websocket demo 简单实现

    websocket c++客户端实现

    简单的c++实现websocket通信,客户端代码实现,简单高效

    websocket java 实现例子

    以上就是一个简单的WebSocket在Java(JDK 1.8)和Tomcat 8中的实现例子。实际应用中,可能需要处理更复杂的业务逻辑,如连接池管理、消息编码解码、错误处理等。此外,还可以考虑使用WebSocket库,如Jetty的...

Global site tag (gtag.js) - Google Analytics