如何使用WebSocket
在pom.xml中添加Jar包依赖 1
2 javax3 javaee-api4 7.05 provided6 客户端(Web主页)代码:1 <%@ page language="java" pageEncoding="UTF-8" %>2 3 4 5
Java后端WebSocket的Tomcat实现6 7 8 Welcome
9
10
11
12
13
14 1516 67 Java Web后端代码1 package me.gacl.websocket;23 import java.io.IOException;4 import java.util.concurrent.CopyOnWriteArraySet;56 import javax.websocket.*;7 import javax.websocket.server.ServerEndpoint;89 /**10* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,11* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端12*/13 @ServerEndpoint("/websocket")14 public class WebSocketTest {15 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。16 private static int onlineCount = 0;1718 //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识19 private static CopyOnWriteArraySet
webSocketSet = new CopyOnWriteArraySet();2021 //与某个客户端的连接会话,需要通过它来给客户端发送数据22 private Session session;2324 /**25* 连接建立成功调用的方法26* @param session可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据27*/28 @OnOpen29 public void onOpen(Session session){30 this.session = session;31 webSocketSet.add(this); //加入set中32 addOnlineCount(); //在线数加133 System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());34 }3536 /**37* 连接关闭调用的方法38*/39 @OnClose40 public void onClose(){41 webSocketSet.remove(this);//从set中删除42 subOnlineCount(); //在线数减143 System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());44 }4546 /**47* 收到客户端消息后调用的方法48* @param message 客户端发送过来的消息49* @param session 可选的参数50*/51 @OnMessage52 public void onMessage(String message, Session session) {53 System.out.println("来自客户端的消息:" + message);54 //群发消息55 for(WebSocketTest item: webSocketSet){56 try {57 item.sendMessage(message);58 } catch (IOException e) {59 e.printStackTrace();60 continue;61 }62 }63 }6465 /**66* 发生错误时调用67* @param session68* @param error69*/70 @OnError71 public void onError(Session session, Throwable error){72 System.out.println("发生错误");73 error.printStackTrace();74 }7576 /**77* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。78* @param message79* @throws IOException80*/81 public void sendMessage(String message) throws IOException{82 this.session.getBasicRemote().sendText(message);83 //this.session.getAsyncRemote().sendText(message);84 }8586 public static synchronized int getOnlineCount() {87 return onlineCount;88 }8990 public static synchronized void addOnlineCount() {91 WebSocketTest.onlineCount++;92 }9394 public static synchronized void subOnlineCount() {95 WebSocketTest.onlineCount--;96 } 97 }

如何使用WebSocket
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。引擎支持最新的WebSocket Version 13。在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。头文件中的准备工作首先需要include WebSocket的头文件。#include "network/WebSocket.h"cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws);virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);virtual void onClose(cocos2d::network::WebSocket* ws);virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);后面我们再详细介绍每个回调接口的含义。新建WebSocket并初始化WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://"._wsiSendText->init(*this, "ws://echo.websocket.org")WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。void WebSocketTestLayer::onOpen(network::WebSocket* ws){if (ws == _wsiSendText){_sendTextStatus->setString("Send Text WS was opened.");}}onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data){if (!data.isBinary){_sendTextTimes++;char times[100] = {0};sprintf(times, "%d", _sendTextTimes);std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;log("%s", textStr.c_str());_sendTextStatus->setString(textStr.c_str());}}onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。 void WebSocketTestLayer::onClose(network::WebSocket* ws)

如何使用WebSocket
需要用到webSocket,所以搜集了一下使用方法,总结下自己的经验 首先要导入webSocket的包,git下载地址https://github.com/square/SocketRocket导入这个包,然后配置环境,导入需要用的框架libicucore.dylib//这个现在Xcode里没有,需要自己找到资源后手动添加CFNetwork.frameworkSecurity.frameworkFoundation.framework。要记得添加pch文件。然后编译,工程运行没有错误,进行下一步在用到的ViewController里包含一下头文件1.2.3.一个测试用的接口ws://echo.websocket.org4.必须实现的代理方法- (void)webSocketDidOpen:(SRWebSocket *)webSocket;- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;5,在第一个代理方法里发送请求[_webSocket send:@"test success"];在第三个代理方法里打印数据在第四个代理方法里置为nil_webSocket.delegate = nil; 完成。

如何使用WebSocket
需要用到webSocket,所以搜集了一下使用方法,总结下自己的经验 首先要导入webSocket的包,git下载地址https://github.com/square/SocketRocket导入这个包,然后配置环境,导入需要用的框架libicucore.dylib//这个现在Xcode里没有,需要自己找到资源后手动添加CFNetwork.frameworkSecurity.frameworkFoundation.framework。要记得添加pch文件。然后编译,工程运行没有错误,进行下一步在用到的ViewController里包含一下头文件1.2.3.一个测试用的接口ws://echo.websocket.org4.必须实现的代理方法- (void)webSocketDidOpen:(SRWebSocket *)webSocket;- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;5,在第一个代理方法里发送请求[_webSocket send:@"test success"];在第三个代理方法里打印数据在第四个代理方法里置为nil_webSocket.delegate = nil; 完成。
完全没有必要,应用服务器只运行web服务就行了,普通的socket直接启动就行,完全不需要容器啊

如何使用WebSocket
websocketserver wsserver=newwebsocketserver();if(!wsserver.setup("127.0.0.1",2012)){//设置ip与端口失败通常是ip和端口范围不对引起的ipv4ipv6}if(!wsserver.start()){//开启服务失败基本上是端口被占用或者被某杀毒软件拦截造成的return;}wsserver.newsessionconnected+=(session)=>{//有新的连接};wsserver.sessionclosed+=(session,reason)=>{//有断开的连接};wsserver.newmessagereceived+=(session,message)=>{//接收到新的文本消息};wsserver.newdatareceived+=(session,bytes)=>{//接收到新的二进制消息};console.readkey(); wsserver.stop();

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/46403.html。