博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
websocket实现方式
阅读量:6304 次
发布时间:2019-06-22

本文共 8130 字,大约阅读时间需要 27 分钟。

hot3.png

一、jetty9、tomcat7     +  html5

1、server---pom.xml:  

javax
javaee-api
7.0
provided

2、server---java代码:

package com.bluedon.websocket;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;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;//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。@ServerEndpoint("/webSocketServer")public class WebSocketServer {    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。    private static int onlineCount = 0;         //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识    private static CopyOnWriteArraySet
webSocketSet = new CopyOnWriteArraySet
(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法 * @param session 可的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session session){ this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线数加1 System.out.println("新连接加入!当前在线人数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(){ webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 System.out.println("一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session 可的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); //群发消息 for(WebSocketServer item: webSocketSet){ try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } } } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); //error.printStackTrace(); } /** * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 * @param message * @throws IOException */ public void sendMessage(String message) throws IOException{ this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; }}

3、html5:

    Welcome


二、jetty9、tomcat7     +  客户端

1、服务端同上

2、客户端

pom.xml:

org.glassfish.tyrus.bundles
tyrus-standalone-client
1.13
或者
org.glassfish.tyrus
tyrus-client
1.1
org.glassfish.tyrus
tyrus-container-grizzly
1.1

代码:

public class test {	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		t1();	}	public static void t1() {		WebsocketClient c = new WebsocketClient();		WebsocketClient.connect(c, "ws://localhost:8088/websockets/webSocketServer");		c.sendUserInfo("测试");		try {			Thread.sleep(100000);		} catch (InterruptedException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}}@ClientEndpointpublic class WebsocketClient {	private Session session;	@OnOpen	public void init(Session session) {		this.session = session;	}	@OnMessage	public void onMessage(String userInfo) {		System.out.println("client receiver String " + userInfo);	}	@OnError	public void handleError(Throwable thw) {		if (thw instanceof DecodeException) {			Logger.getLogger("lwl")					.info(session.getId() + " Error decoding incoming message: " + ((DecodeException) thw).getText());		} else {			Logger.getLogger("lwl").info(session.getId() + " Client WebSocket error: " + thw.getMessage());		}	}	/**	 * 建立于服务端的连接	 * 	 * @param client	 * @param path	 * @return	 */	public static Session connect(WebsocketClient clientEndpoint, String path) {		WebSocketContainer wsc = ContainerProvider.getWebSocketContainer();		try {			return wsc.connectToServer(clientEndpoint, new URI(path));		} catch (Exception e) {			e.printStackTrace();		}		return null;	}	/**	 * 向服务端发送数据	 * 	 * @param userInfo	 */	public void sendUserInfo(String text) {		try {			this.session.getBasicRemote().sendText(text);		} catch (IOException e) {			e.printStackTrace();		}	}	/**	 * 断开与服务端的连接	 */	public void disconnect() {		if (this.session != null) {			try {				this.session.close();			} catch (IOException ioe) {				System.out.println("Error closing the session: " + ioe);			}		}	}}

三、客户端+服务端(不依赖与tomcat和jetty)

1、客户端pom.xml、代码同(二)
2、服务端
pom.xml:

org.glassfish.tyrus
tyrus-server
1.1
org.glassfish.tyrus
tyrus-container-grizzly
1.1

代码:

public class WebSocketServerStatic {     public static void main(String[] args) {        runServer();    }     public static void runServer() {        Server server = new Server("localhost", 8080, "/websocket", WebSocketServer.class);        try {            server.start();            Thread.currentThread().join();        } catch (Exception e) {            throw new RuntimeException(e);        } finally {        }    }}@ServerEndpoint("/webSocketServer")public class WebSocketServer {    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。    private static int onlineCount = 0;         //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识    private static CopyOnWriteArraySet
webSocketSet = new CopyOnWriteArraySet
(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法 * @param session 可的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session session){ this.session = session; webSocketSet.add(this); //加入set中 addOnlineCount(); //在线数加1 System.out.println("新连接加入!当前在线人数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(){ webSocketSet.remove(this); //从set中删除 subOnlineCount(); //在线数减1 System.out.println("一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session 可的参数 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); //群发消息 for(WebSocketServer item: webSocketSet){ try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } } } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); //error.printStackTrace(); } /** * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 * @param message * @throws IOException */ public void sendMessage(String message) throws IOException{ this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; }}

 

转载于:https://my.oschina.net/u/920528/blog/844907

你可能感兴趣的文章
vue-cli脚手架的搭建
查看>>
在网页中加入百度搜索框实例代码
查看>>
在Flex中动态设置icon属性
查看>>
采集音频和摄像头视频并实时H264编码及AAC编码
查看>>
3星|《三联生活周刊》2017年39期:英国皇家助产士学会于2017年5月悄悄修改了政策,不再鼓励孕妇自然分娩了...
查看>>
linux查看命令是由哪个软件包提供的
查看>>
高级Linux工程师常用软件清单
查看>>
堆排序算法
查看>>
folders.cgi占用系统大量资源
查看>>
路由器ospf动态路由配置
查看>>
zabbix监控安装与配置
查看>>
python 异常
查看>>
last_insert_id()获取mysql最后一条记录ID
查看>>
可执行程序找不到lib库地址的处理方法
查看>>
bash数组
查看>>
Richard M. Stallman 给《自由开源软件本地化》写的前言
查看>>
oracle数据库密码过期报错
查看>>
修改mysql数据库的默认编码方式 .
查看>>
zip
查看>>
How to recover from root.sh on 11.2 Grid Infrastructure Failed
查看>>