`
alex.Lin
  • 浏览: 66336 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jWebSocket使用指南

阅读更多

1、先讲讲HTML5的WebSocket

 

HTML5规范中提供了WebSocket技术,替代了之前的ajax实现消息通信的方法。

WebSocket协议,简称WSWSS-Secure),可以支持客户端-服务端任意消息推送,支持跨域(AJAX跨域会有问题),可降低系统开销及复杂性。网上已经有很多关于WebSocket的介绍,这里不再重复。

以下是WebSocketAPI的使用说明

 

a、 检测浏览器是否支持WebSocket

 

function checkWS() {   
              if (window.WebSocket) {   
                     alert( "HTML5 WebSocket is supported in your browser.");   
           } else {   
                     alert("HTML5 WebSocket is not supported in your browser.");   
              }   
       }

 

 

支持的浏览器有Firefox 4Chrome 4Opera 10.70以及Safari 5,不支持的浏览器可以是用Socket.IO技术

b、WebSocket API用法

 

// 创建一个Socket实例
var socket = new WebSocket(‘ws://localhost:8080′); 
// 打开Socket
socket.onopen = function(event) {
// 发送一个初始化消息
socket.send(‘I am the client and I\’m listening!’);
// 监听消息
socket.onmessage = function(event) {
    console.log(‘Client received a message’,event);
};
// 监听Socket的关闭
socket.onclose = function(event) {
    console.log(‘Client notified socket has closed’,event);
};
// 关闭Socket….
//socket.close()

 

 

c、 Demo#

 

<!DOCTYPE html>
<head>
<title>WebSocket Test Page</title>
<script>
    var log = function(s) {
           if (document.readyState !== "complete") {
                  log.buffer.push(s);
           } else {
                  document.getElementById("output").innerHTML += (s + "\n");
           }
    }
    log.buffer = [];
    url = "ws://localhost:8080/echo";
    w = new WebSocket(url);
    w.onopen = function() {
           log("open");
           w.send("thank you for accepting this WebSocket request");
    }
    w.onmessage = function(e) {
           log(e.data);
    }
    w.onclose = function(e) {
           log("closed");
    }
    window.onload = function() {
           log(log.buffer.join("\n"));
           document.getElementById("sendButton").onclick = function() {
                  w.send(document.getElementById("inputMessage").value);
           }
    }
</script>
</head>
<body>
    <input type="text" id="inputMessage" value="Hello, WebSocket!">
    <button id="sendButton">Send</button>
    <pre id="output"></pre>
</body>
</html>

 

 

 

 

 

 

 

2. JWebSocket

http://jwebsocket.org/(最新版本v1.0 beta5

jWebSocket是个纯Java/JavaScript高速的WEB双向通信解决方案,基于HTML5

包含:

       jWebSocket Server基于纯JavaWebSocket服务,可以实现Server-to-client,和server控制的client-to-client的通信

       jWebSocket Client基于纯JavaScriptWebSocket客户端,支持多种子协议,也可以支持Javaandriod,不需要插件

       jWebSocket FlashBridge基于FlashWebSocket封装,需要flash插件

 

 

 

 

2.1. 下载安装

2.1.1 独立的server(略,很简单,执行bin/startup即可)

2.1.2.集成在tomcat中运行

1、  设置JWEBSOCKET_HOME 必须(最好重启)

2、  jWebSocketServer-Bundle-1.0.jarjWebSocketSamples-1.0.jar拷贝到tomcat6lib

3、 jWebSocketAppSrvDemo-1.0.war拷贝到tomcat6webapps

4、  启动tomcat

5、 访问http://localhost:8080/jWebSocketAppSrvDemo-1.0/

6、  使用IP地址访问

(在JWEBSOCKET_HOME/conf/jWebSocket.xml里增加<domain>http://192.168.3.50</domain>,tomcat里的conf/jWebSocket.xml修改没有效果)

 

2.2. 开发指南

2.2.1. 要求

JDK1.6+

Apache Maven 2.2

Eclipse3.5

Apache tomcat6+

 

2.2.2. Eclipse开发

下载jWebSocket源码,使用maven导入可以将代码都导入到eclipse

或者直接创建项目,把jWebSocketServerlibs导进来,自己做开发

2.2.3. JS工具包

2.2.3.1. jWebSocket.js(很庞大,涵盖了所有其他js

jws对象:

       JWS_SERVER_PORT: 8787

       JWS_SERVER_SSL_PORT: 9797

       JWS_SERVER_URL: "ws://" + ( self.location.hostname ? self.location.hostname : "127.0.0.1" ) + ":8787/jWebSocket/jWebSocket"

 

在我们的页面中引入jWebSocket.js便可以使浏览器支持WebSocket

       <script type="text/javascript" language="JavaScript" src="jWebSocket.js"></script>

       <script type="text/javascript" language="JavaScript">

             

              function checkWS() {   

                     if (window.WebSocket) {   

                            alert( "HTML5 WebSocket is supported in your browser.");   

                     } else {   

                            alert("HTML5 WebSocket is not supported in your browser.");   

                     }   

              }

              checkWS();

       </script>

Ie8也可以支持了(可以使用flashBridge来支持)

 

封装的函数:

获取dom对象:

       jws.$( "schkDebug" );//getElementById();

事件监听

       jws.events.addEventListener( eUsername[对象], "keydown"[事件], usrKeyDnLsnr[监听函数] );

定义js

jws.oop = {};

 

// implement simple class declaration to support multi-level inheritance

// and easy 'inherited' calls (super-calls) in JavaScript

jws.oop.declareClass = function( aNamespace, aClassname, aAncestor, aFields ) {

}

 

如定义一个jWebSocketBaseClient(基类)

jws.oop.declareClass( "jws", "jWebSocketBaseClient", null, {

       create();

       processOpened(event);

       processPacket

       processClosed

       open( aURL, aOptions );

       connect: ( aURL, aOptions );

       processQueue

       queuePacket: ( aPacket, aOptions )

       sendStream(data);

       abortReconnect();

       setAutoReconnect;

       setQueueItemLimit

       setQueueSizeLimit

       setReliabilityOptions

       getReliabilityOptions

       getOutQueue

       resetSendQueue

       isOpened

       getURL

       getSubProt

       forceClose

       isConnected

       close

       disconnect

       addListener

       removeListener

       addPlugIn

       setParam

       getParam

       clearParams

如定义一个jWebSocketTokenClient继承jWebSocketBaseClient

jws.oop.declareClass( "jws", "jWebSocketTokenClient", jws.jWebSocketBaseClient, {

       …//继承的方法

       getId();unique clientId

       checkCallbacks(token);

       checkConnected

       isWriteable

       checkWriteable

       checkLoggedIn

       resultToString

       tokenToStream/streamToToken

       notifyPlugInsOpened/notifyPlugInsClosed

       sendToken( aToken, aOptions )

       getLastTokenId

       getNextTokenId

       sendText: function( aTarget, aText ) {

              var lRes = this.checkLoggedIn();

              if( lRes.code == 0 ) {

                     this.sendToken({

                            ns: jws.NS_SYSTEM,

                            type: "send",

                            targetId: aTarget,

                            sourceId: this.fClientId,

                            sender: this.fUsername,

                            data: aText

                     });

              }

              return lRes;

       }

       broadcastText( aPool, aText, aOptions )

}

如定义一个jWebSocketJSONClient继承jWebSocketTokenClient

jws.oop.declareClass( "jws", "jWebSocketJSONClient", jws.jWebSocketTokenClient, {

       tokenToStream: function( aToken ) {

              aToken.utid = jws.CUR_TOKEN_ID;

              var lJSON = JSON.stringify( aToken );

             return( lJSON );

       },

       streamToToken: function( aStream ) {

              // parsing a JSON object in JavaScript couldn't be simpler...

              var lObj = JSON.parse( aStream );

              return lObj;

       }

 

});

使用:new jws.jWebSocketJSONClient();

 

2.2.3.2. <!--[endif]-->token

一个token对象包含1个或多个域(field)和值,使用HashMap<String(field),Object(value)>来存储。

客户端js可以任意增加token的属性(采用json的格式),如发送消息

 

 

this.sendToken({
				ns: jws.NS_SYSTEM,
				type: "send",
				targetId: aTarget,
				sourceId: this.fClientId,
				sender: this.fUsername,
                                myKey1:"myVal1",//自己增加的属性
                                myKey2:"myVal2",//后台可以直接获取到
				data: aText
			});

 

 

2.2.3.3. 其他

 

2.2.4. Demo功能(下载的demo里都有附带,以下只是一些关键说明)

2.2.4.1. 聊天chat

A、创建客户端

lWSC = new jws.jWebSocketJSONClient();

B、与服务端连接

WebSocketServerUrl

[ws://host:port/jWebSocket/jWebSocket]

var lURL = jws.getDefaultServerURL();

         àws://localhost:8787/jWebSocket/jWebSocket

WebSocketServer建立连接、接收消息、关闭连接

lWSC.isLoggedIn()//判断是否已经处于连接状态

lWSC.logon( lURL, eUsername.value, ePassword.value, {

  

   OnOpen: function( aEvent ) {

      //建立连接事件

      checkKeepAlive({ immediate: false });//是否保持连接状态,调用                 lWSC.startKeepAlive( aOptions );lWSC.stopKeepAlive()

   },

 

// 消息到达回调

Token:

   token.type[“response”/”event”/”goodBye”/”broadcast”]

   token.reqType[“login”/”getClients”]

   token.code

   token.count

   token.clients

   token.msg

   token.sender

   token.data

   OnMessage: function( aEvent, aToken ) {

      if( aToken ) {

      // is it a response from a previous request of this client?

         if( aToken.type == "response" ) {

        // figure out of which request

              if( aToken.reqType == "login" ) {

                    if( aToken.code == 0 ) {

                         // call getAuthClients method from

                         // jWebSocket System Client Plug-In

                         lWSC.getAuthClients({

                               pool: null

                            });//获取客户端

                    } else {

                       log( SYS, IN, "Error logging in '" + eUsername.value + "': " + aToken.msg );

                   }

              } else if( aToken.reqType == "getClients" ) {

                    log( SYS, IN, "Clients (" + aToken.count + "): " + aToken.clients );

              }

        // is it an event w/o a previous request ?

        } else if( aToken.type == "event" ) {

        // interpret the event name

        } else if( aToken.type == "goodBye" ) {

           log( SYS, IN, lJWSID + " says good bye (reason: " + aToken.reason + ")!" );

        // is it any token from another client

        } else if( aToken.type == "broadcast" ) {

           if( aToken.data ) {

              log( aToken.sender, IN, aToken.data );

           }

        }

      }

   },

//关闭连接事件

OnClose: function( aEvent ) {

   lWSC.stopKeepAlive();

   ...

})

//获取已经认证的客户端

var lRes = lWSC.getAuthClients({

    pool: null

});

lRes.msg

C、给服务端发送消息:

使用客户端(lWSC)的broadcastText()sendText()

function broadcast() {

                   var lMsg = eMessage.value;

                   var lTarget = eTarget.value;

                   if( lMsg.length > 0 ) {

                       log( USR, OUT, lMsg );

                       var lRes;

                       if( !lTarget || lTarget == "*") {

                            lRes = lWSC.broadcastText(

                                 "",           // broadcast to all clients (not limited to a certain pool)

                                 lMsg        // broadcast this message

                            );

                       } else {

                            lRes = lWSC.sendText(

                                 lTarget,    // broadcast to all clients (not limited to a certain pool)

                                 lMsg        // broadcast this message

                            );

                       }

                       // log error only, on success don't confuse the user

                       if( lRes.code != 0 ) {

                            log( SYS, OUT, "broadcast: " + lRes.msg );

                       }

                   }

                   …

              }

D、服务端

       自定义ServletContext监听器ServletContextListener:Servlet容器启动的时候加载监听

publicclass ContextListener implements ServletContextListener {

  

      publicvoid contextInitialized(ServletContextEvent aSCE) {

         // 启动WebSocket服务

         JWebSocketFactory.start();

 

         //获取一个tokenServer

         TokenServer lTS0 = JWebSocketFactory.getTokenServer();

         if (lTS0 != null) {

           //tokenServer增加自定义监听器(监听客户端与Server的一切交互)

           System.out.println("----------tokenServer found");

           lTS0.addListener(newMyJWebSocketTokenListenerSample());

         }else{

           System.out.println("----------tokenServer not found");

         }

 

         // assign web socket server to servlet bridge

         //ServletBridge.setServer(JWebSocketFactory.getTokenServer());

      }

 

  

      publicvoid contextDestroyed(ServletContextEvent aSCE) {

         // 关闭WebSocket服务

         JWebSocketFactory.stop();

      }

}

自定义WebSocketServerToken监听器

publicclass MyJWebSocketTokenListenerSample implements WebSocketServerTokenListener {

 

    publicvoid processOpened(WebSocketServerEvent aEvent) {      

       System.out.println("login的时候会调用processOpened-------->Client '" + aEvent.getConnector() + "' connected.");

    }

 

    publicvoid processPacket(WebSocketServerEvent aEvent, WebSocketPacket aPacket) {

       System.out.println("-------->processPacket@Processing data packet '" + aPacket.getUTF8() + "'...");

      

   

       // Here you can answer an arbitrary text package...

       // this is how to easily respond to a previous client's request

       // aEvent.sendPacket(aPacket);

       // this is how to send a packet to any connector

       // aEvent.getServer().sendPacket(aEvent.getConnector(), aPacket);

    }

 

    publicvoid processToken(WebSocketServerTokenEvent aEvent, Token aToken) {

       System.out.println("-------->Client '" + aEvent.getConnector() + "' sent Token: '" + aToken.toString() + "'.");

      String lNS = aToken.getNS();

String lType = aToken.getType();

if("send".equals(lType)){

//{"ns":"org.jwebsocket.plugins.system","type":"send",

//"targetId":"01.32273.0","targetUserName":"tttt","sourceId":"01.32722.3",

//"sourceUserName":"qqqqqq","sender":"guest","data":"22222222","utid":4}

String receiver = aToken.getString("targetUserName");

String sender = aToken.getString("sourceUserName");

String data = aToken.getString("data");

System.out.println("-----------send......."+sender+"-->"+receiver+"["+data+"]");

//自己增加操作,如保存到DB等

}

       

       }

    }

 

    /**

     *

     * @param aEvent

     */

   

    publicvoid processClosed(WebSocketServerEvent aEvent) {

       System.out.println("-------->Client '" + aEvent.getConnector() + "' disconnected.");      

    }

}

web.xml中配置ServletContext监听即可

 

 

以下是我用jwebsocket在网页上实现的效果

支持用户上下线通知及更新,一个webSocket连接支持多用户同时在线聊天,消息提醒等功能

 

推荐阅读

 

代码之余轻松一下:当前热门-人民的名义

 

思考与行动

JAVAEE容器如何管理EntityManager和PersistenceContext

  • 大小: 31.3 KB
3
0
分享到:
评论
9 楼 gebinsdyz 2013-05-06  
遇到同样的问题,求博主指导

chenjl 写道
楼主,请问一下,我按照你所说的进行配置。启动tomcat的时候报了如下的错误:

我的环境:
JDK6
TOMCAT6

已经按照文中集成在TOMCAT中
1、  设置JWEBSOCKET_HOME 必须(最好重启)

2、  将jWebSocketServer-Bundle-1.0.jar、jWebSocketSamples-1.0.jar拷贝到tomcat6的lib下

3、 将jWebSocketAppSrvDemo-1.0.war拷贝到tomcat6的webapps下


错误信息
2012-5-17 17:24:29 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded APR based Apache Tomcat Native library 1.1.20.
2012-5-17 17:24:29 org.apache.catalina.core.AprLifecycleListener init
信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2012-5-17 17:24:30 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-apr-9090"]
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.AbstractMethodError: org.apache.catalina.connector.CoyoteAdapter.getDomain()Ljava/lang/String;
	at org.apache.coyote.AbstractProtocol.createObjectName(AbstractProtocol.java:349)
	at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:389)
	at org.apache.catalina.connector.Connector.initialize(Connector.java:1014)
	at org.apache.catalina.core.StandardService.initialize(StandardService.java:680)
	at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:548)
	... 6 more


PS:只要将tomcat6的lib下jWebSocketServer-Bundle-1.0.jar、jWebSocketSamples-1.0.jar删除,TOMCAT启动正常。


8 楼 qq435967718 2013-04-07  
求源代码啊,大哥,找很久了,邮箱435967718@qq.com
7 楼 qq435967718 2013-04-07  
求源代码啊,大哥,找很久了
6 楼 wang383711365 2013-03-18  
楼主好。需要用HTML5建一个即时通讯系统。但是到了websockets的服务端就进行不下去了。楼主能不能把你的实例发来学习下。非常感谢|!EMAIL:450654859@QQ.COM
5 楼 不想说太多 2012-09-19  
接手一个没做完的项目,项目用到了jwebsocket,看了几天,似懂非懂,望楼猪把那个聊天的Demo发给我研究研究,感激不尽。QQ邮:441077431@qq.com
4 楼 aa915609085 2012-08-01  
楼主 可不可以 给个例子
3 楼 chenjl 2012-05-17  
楼主,请问一下,我按照你所说的进行配置。启动tomcat的时候报了如下的错误:

我的环境:
JDK6
TOMCAT6

已经按照文中集成在TOMCAT中
1、  设置JWEBSOCKET_HOME 必须(最好重启)

2、  将jWebSocketServer-Bundle-1.0.jar、jWebSocketSamples-1.0.jar拷贝到tomcat6的lib下

3、 将jWebSocketAppSrvDemo-1.0.war拷贝到tomcat6的webapps下


错误信息
2012-5-17 17:24:29 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded APR based Apache Tomcat Native library 1.1.20.
2012-5-17 17:24:29 org.apache.catalina.core.AprLifecycleListener init
信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2012-5-17 17:24:30 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-apr-9090"]
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.AbstractMethodError: org.apache.catalina.connector.CoyoteAdapter.getDomain()Ljava/lang/String;
	at org.apache.coyote.AbstractProtocol.createObjectName(AbstractProtocol.java:349)
	at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:389)
	at org.apache.catalina.connector.Connector.initialize(Connector.java:1014)
	at org.apache.catalina.core.StandardService.initialize(StandardService.java:680)
	at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:524)
	at org.apache.catalina.startup.Catalina.load(Catalina.java:548)
	... 6 more


PS:只要将tomcat6的lib下jWebSocketServer-Bundle-1.0.jar、jWebSocketSamples-1.0.jar删除,TOMCAT启动正常。

2 楼 alex.Lin 2012-03-29  
jwebsocket的资料的确很少,官方的文档也比较简单,我也是花了2天时间从他的源码里整理出来的,一些关键点我文章里都有说明,注意下基本上就没问题了
1 楼 chier_system 2012-03-29  
楼主大才,我研究了几天一直没头绪,看了楼主文章明白了点。jwebsocket资源少点可怜,楼主是如何研究的呢?授人以鱼不如授人以渔,望楼主分享。

相关推荐

    jwebSocket 源码

    4. **文档**:可能包括API文档和用户指南,帮助开发者理解和使用jWebSocket的功能。 5. **配置文件**:如`config.properties`,用于配置服务器端的行为,如监听端口、日志级别等。 6. **构建脚本**:如`build.xml`,...

    无线充电LCC-S仿真:基于Simulink的高效电磁组竞赛电源系统建模与优化

    内容概要:本文详细介绍了用于智能车竞赛微缩电磁组的无线充电LCC-S仿真模型。该模型采用Simulink搭建,主要针对48V输入、1000W输出的无线充电系统进行仿真。文中不仅提供了具体的谐振参数(如L1=35uH,C1=62nF,C2=72nF),还分享了调整死区时间、耦合系数、负载突变测试等实践经验。此外,作者强调了实际应用中的注意事项,如元件选型、散热设计以及仿真与现实差异的处理方法。 适合人群:参与智能车竞赛的学生和技术爱好者,尤其是对无线充电技术和电力电子感兴趣的读者。 使用场景及目标:①帮助参赛队伍快速建立高效的无线充电系统仿真模型;②指导实际硬件搭建过程中参数的选择和优化;③提高系统效率,确保在比赛中的可靠性和性能。 其他说明:本文提供的模型已在Matlab 2023b中验证可行,建议使用者根据实际情况调整参数,并关注仿真与实际应用之间的差异。

    基于springboot+vue的考研资讯平台管理系统(源码+数据库)239

    基于springboot+vue的考研资讯平台管理系统:前端 vue2、element-ui,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成考研资讯、报考指南、资料信息、客服等功能于一体的系统。 ## 环境-239 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    基于GADF+Transformer的轴承故障诊断模型:振动信号转二维图像及深度学习分类

    内容概要:本文详细介绍了将振动信号转化为二维图像并利用Transformer进行轴承故障诊断的方法。首先,通过格拉姆角场(GADF)、小波变换(DWT)和短时傅立叶变换(STFT)将一维振动信号转换为二维图像。然后,构建了一个基于Transformer的视觉模型,用于捕捉图像的全局特征。实验结果显示,该方法在凯斯西储大学轴承数据集上达到了98.7%的准确率,尤其在低信噪比环境下的表现优于传统方法。此外,文中提供了详细的代码实现和数据预处理步骤,以及一些实用的训练技巧。 适合人群:从事机械故障诊断的研究人员和技术人员,尤其是对深度学习应用于工业设备监测感兴趣的读者。 使用场景及目标:适用于工业环境中机械设备的故障预测与健康管理。主要目标是提高故障检测的准确性,特别是在复杂工况和低信噪比情况下,帮助维护团队及时发现潜在问题,降低维修成本。 其他说明:文中提到的所有代码和预训练模型均已开源,可供研究和教学使用。同时,作者分享了一些实践经验,如数据增强策略的选择和信号去噪方法的应用,有助于读者更好地理解和复现实验结果。

    【代码随想录】ACM输入输出模板汇总:多语言实现与典型问题解析

    内容概要:本文档是《卡码网-25种ACM输入输出总结模板.pdf》,由程序员Carl编写,旨在帮助读者掌握ACM竞赛中常见的25种输入输出方式。文档详细介绍了多种编程语言(如C++、Java、Python、Go、JavaScript等)的实现方法,涵盖了从简单的A+B问题到复杂的链表操作、二叉树遍历等各类典型题目。每种输入输出方式均配有相应的练习题,帮助读者通过实际操作加深理解。此外,文档不仅提供代码模板,还强调了对问题的分析和解决思路。 适合人群:具备一定编程基础,尤其是准备参加ACM竞赛或从事算法相关工作的开发者。 使用场景及目标:①帮助读者快速掌握ACM竞赛中常见的输入输出格式;②提高编程效率,减少在笔试和面试中因输入输出处理不当而浪费的时间;③通过练习题巩固所学知识,提升解决实际问题的能力。 阅读建议:由于文档侧重于输入输出模板的总结,建议读者在学习过程中结合具体的编程语言特性进行实践,并尝试完成提供的练习题,以加深对模板的理解和应用。同时,注意不同语言之间的语法差异,灵活运用所学知识。

    基于springboot的健身中心会员管理系统(源码+数据库)199

    基于springboot的健身中心会员管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成会员卡、留言板、公告、统计报表等功能于一体的系统。 ## 功能介绍 ### 客户 - 基本功能:登录,退出,个人资料查看与修改,密码修改 - 我的会员卡:会员卡查询,详情 - 充值信息:充值信息的列表查询,多条件搜索查询,详情 - 我的消费记录:消费记录查询,多条件搜索查询,详情 ### 管理员 - 账号管理:管理员账号信息的增删改查,密码修改 - 公告管理:公告信息的增删改查 - 客户管理:客户信息的增删改查 - 会员卡管理:会员卡信息的增删改查,多条件搜索查询,会员卡充值 - 留言板管理:留言板信息的列表查询,留言回复 - 统计报表管理:消费信息的查询统计,充值信息的查询统计 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    基于springboot的教育互助管理系统(源码+数据库)236

    基于springboot的教育互助管理系统:前端 html、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成交流动态、我的平台、我的好友、互助评论、教育互助等功能于一体的系统。 ## 环境-236 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>JDK 1.8</b>

    multiSIM视频教程-常用仪器仪表使用.zip

    multisim

    手绘彩虹小太阳幼儿教学课件模板.pptx

    手绘彩虹小太阳幼儿教学课件模板

    SH3201数据手册和代码.tar

    SH3201数据手册和代码.tar 产品简介 SH3201是一款六轴IMU(Inertial measurement unit)惯性测量单元。SH3201内部集成三轴陀螺仪以及三轴加速度计,尺寸小,功耗低,适用于消费电子市场应用,能提供高精度的实时角速度与线加速度数据。SH3201具有出色的温度稳定性,在-40℃到85℃的工作范围内能保持高分辨率。 封装形式和尺寸 ● 封装:14 Pins LGA ● 尺寸:2.5×3.0×1.0mm³

    自动驾驶多类交通目标检测数据集1.zip

    数据集介绍:自动驾驶多类交通目标检测数据集 一、基础信息 数据集名称:自动驾驶多类交通目标检测数据集 图片数量: - 训练集:2,868张图片 - 验证集:30张图片 - 测试集:301张图片 分类类别: - Bikes(自行车):交通场景中常见非机动车类型 - Bus(公交车):大型公共交通工具 - Car(汽车):主流机动车辆类型 - Crosswalk(人行横道):道路安全标识 - Fire hydrant(消防栓):城市基础设施组件 标注格式: YOLO格式,包含目标检测所需的边界框坐标及类别标签,支持主流深度学习框架。 数据来源:真实道路场景采集,涵盖多样交通环境。 二、适用场景 自动驾驶感知系统开发: 用于训练车辆环境感知模型,精准识别道路参与者(车辆、行人)及关键基础设施(人行道、消防栓)。 智能交通监控系统: 支持开发实时交通流量分析系统,识别车辆类型及道路安全标识。 道路安全研究: 为交叉路口安全分析、基础设施布局优化提供数据支撑。 AI算法基准测试: 适用于目标检测模型性能验证,覆盖常见交通目标类别。 三、数据集优势 场景覆盖全面: 包含5类关键交通要素,覆盖车辆、行人设施及市政设备,满足复杂场景建模需求。 标注质量可靠: 专业团队标注,严格质检流程确保边界框定位精准,类别标注准确。 任务适配性强: 原生YOLO格式支持主流检测框架(YOLOv5/v7/v8等),即插即用。 应用潜力突出: 数据来源于真实道路场景,可直接应用于L2-L4级自动驾驶系统开发,具备强工程落地价值。

    一个极速,多功能的哔哩哔哩推送机器人.zip

    一个极速,多功能的哔哩哔哩推送机器人

    基于jsp+servlet的机票预订后台管理系统(源码+数据库)128

    基于jsp+servlet的机票预订后台管理系统:前端 jsp、jquery,后端 servlet、jdbc,角色分为管理员、用户;集成航班信息查询,在线订票,订单查询等功能于一体的系统。 ## 功能介绍 ### 管理员 - 航班信息管理:航班信息列表查询,航班添加 - 订单信息管理:用户在前台浏览航班信息,订票下单后,管理员可以在后台查询用户下单信息 - 用户信息管理:用户信息由客户自己在前台注册,管理员可以查看和删除用户 - 留言评论管理:用户在前台针对航班信息或订票服务进行评论,后台查看评论和删除 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:轮播图,航班搜索,航班列表信息展示 - 订票:航班详情,在线订票,填写乘机人和联系人信息,退改签说明,提交订单 - 用户中心:个人资料查询与修改,订单列表查询 - 留言:留言列表查看,发表留言评论 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    COMSOL多物理场建模在海底气体水合物沉积物汽液两相流动研究中的应用

    内容概要:本文详细介绍了利用COMSOL进行海底气体水合物沉积物中汽液两相流动的数值模拟。首先,文章解释了模型的基本架构,包括多孔介质流和相场法追踪气液界面,并展示了关键的偏微分方程。接着,讨论了网格划分、水合物相变的能量方程源项设置以及重要参数如各向异性系数的正确配置。此外,文中强调了模型验证步骤,如网格收敛性测试、时间步长敏感性分析和物质守恒检查。最后,分享了一些实际工程应用的经验,如处理非均质储层和相变潜热的影响。 适合人群:从事地质工程、石油勘探、环境科学等领域研究的专业人士和技术人员。 使用场景及目标:适用于需要深入理解和模拟海底气体水合物沉积物中复杂物理现象的研究人员。主要目标是帮助用户掌握COMSOL在这一领域的具体应用方法,提高数值模拟的准确性。 其他说明:文章不仅提供了详细的数学模型和编程代码片段,还分享了许多实践经验,有助于读者避开常见陷阱并优化计算效率。

    Screenshot_2025_0421_055352.png

    Screenshot_2025_0421_055352.png

    Abaqus混凝土收缩建模与分析:从材料定义到结果验证的技术详解

    内容概要:本文详细介绍了如何使用Abaqus进行混凝土收缩建模与分析。首先讲解了混凝土收缩的基本概念及其重要性,接着逐步介绍材料定义、收缩模型选择、收缩应变计算方法(包括UMAT子程序和热膨胀模拟)、分析步配置、边界条件设置、后处理验证等各个环节的具体操作步骤和技术细节。文中还提供了多个实用的Python脚本和.inp文件模板,帮助用户更好地理解和应用相关知识点。此外,作者分享了许多实战经验和常见错误规避技巧,确保模型的稳定性和准确性。 适合人群:从事土木工程仿真分析的专业人士,尤其是有一定Abaqus使用经验的研究人员和工程师。 使用场景及目标:适用于需要进行混凝土结构长期性能预测、裂缝发展模拟等复杂工程问题的研究人员。通过掌握本文提供的技术和方法,能够提高仿真模型的精度,减少与实际测量结果之间的偏差。 其他说明:文中提到的所有代码片段和操作指南均基于最新版本的Abaqus软件平台。建议读者结合官方文档和其他在线资源进一步学习和探索。

    前端分析-2023071100789s

    前端分析-2023071100789s

    基于改进粒子群算法的VMD分解参数优化及其Matlab实现

    内容概要:本文详细介绍了利用改进的粒子群算法(PSO)优化变分模态分解(VMD)参数的方法。首先指出了传统PSO存在的局限性,即容易陷入局部最优解。接着提出了改进措施,包括动态调整惯性权重和学习因子,使得算法能够在前期进行广泛的全局搜索,在后期进行精确的局部搜索。文中还提供了具体的Matlab代码实现,涵盖了数据预处理、粒子初始化、适应度函数选择等方面的内容。实验结果显示,改进后的PSO在优化VMD参数方面表现优异,尽管收敛速度稍慢,但能够获得更低的适应度值,从而提高分解质量。 适合人群:从事信号处理研究的技术人员,尤其是那些对VMD分解有一定了解并希望进一步提升其性能的研究者。 使用场景及目标:适用于需要对一维时序数据进行高质量分解的应用场合,如生物医学信号处理、故障诊断等领域。目标是通过优化VMD的分解层数K和惩罚因子α,达到更好的信号分离效果。 其他说明:文中提到的所有代码均基于Matlab 2018a及以上版本编写,建议使用更高版本以确保兼容性和效率。同时,对于初学者而言,可以先尝试提供的示例数据进行练习。

    电力电子领域PLECS仿真中DAB变换器峰值电流前馈控制策略的IEEE顶刊复现

    内容概要:本文详细介绍了在PLECS仿真环境中复现IEEE顶刊论文中提出的DAB(双有源桥)变换器峰值电流前馈控制策略的过程。文章首先简述了DAB变换器的基本结构及其应用场景,接着深入探讨了峰值电流前馈控制策略的工作原理,包括实时检测原边电流峰值并反馈到控制环节以改善变换器动态性能的方法。文中展示了具体的MATLAB-PLECS联合仿真实现步骤,涵盖了参数设定、主循环逻辑、占空比计算等方面的内容。此外,作者分享了在仿真过程中遇到的问题及解决方案,如参数整定、硬件细节处理等,并通过仿真波形对比验证了该控制策略的有效性。 适合人群:从事电力电子领域研究的技术人员、研究生及以上学历的学生,尤其是对DAB变换器及峰值电流前馈控制策略感兴趣的读者。 使用场景及目标:适用于希望深入了解DAB变换器工作原理及其先进控制策略的研究人员和技术开发者。目标是掌握如何利用PLECS和MATLAB进行复杂电力电子系统的仿真和优化,提高变换器的动态响应速度和稳定性。 其他说明:文章不仅提供了详细的理论解释和技术实现路径,还分享了许多实用经验和技巧,有助于读者更好地理解和应用所学知识。

    基于NSGA-III与Optuna的随机森林模型多目标优化及3D可视化

    内容概要:本文详细介绍了如何使用NSGA-III算法结合Optuna库进行随机森林模型的多目标优化。首先定义了一个目标函数,该函数旨在最小化交叉验证误差和测试集误差。接着,通过Optuna创建研究对象并执行优化操作,在此过程中,NSGA-III算法用于寻找帕累托前沿上的最佳解。优化完成后,作者展示了多种可视化手段,如3D曲面图、热力图以及预测对比图,帮助理解参数间的关系及其对模型性能的影响。此外,还探讨了一些实用技巧,例如调整采样范围、种群规模等。 适用人群:熟悉机器学习基本概念和技术栈的研究人员或工程师,特别是对随机森林模型有深入研究兴趣的人士。 使用场景及目标:适用于希望提高随机森林模型性能,同时掌握多目标优化理论的应用场景。主要目标是通过合理的参数配置使模型达到更好的泛化能力和更高的效率。 其他说明:文中提供了完整的代码片段,便于读者复现实验结果。强调了调参过程中需要注意的问题,如避免过度扩展搜索空间、合理设定种群规模等。

Global site tag (gtag.js) - Google Analytics