- 浏览: 358858 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liulehua_123:
...
使用netty+spring搭建游戏框架 -
heng123:
netty等视频java.5d6b.com教程
使用netty+spring搭建游戏框架 -
di1984HIT:
、
redis 主从同步配置方案 -
di1984HIT:
学习了~~
使用netty+spring搭建游戏框架 -
di1984HIT:
不错,学习了~~
征服flume之三——使用log4j输出日志到flume
一、 java NIO简介
nio是java New IO的简称,在jdk1.4里提供的新api。Sun官方标榜的特性如下:
为所有的原始类型提供(Buffer)缓存支持。
字符集编码解码解决方案。
Channel:一个新的原始I/O抽象。
支持锁和内存映射文件的文件访问接口。
提供多路(non-bloking)非阻塞式的高伸缩性网络I/O。
关于java NIO的实现部分不是本文讨论的重点,有兴趣的朋友可以访问JAVA夜无眠的博客JAVA NIO 实例。
二、 NIO框架简介
在Java社区,最知名的开源Java NIO框架要属Mina和Netty。实际上,Netty的作者原来就是Mina作者之一,所以可以想到,Netty和Mina在设计理念上会有很多共同点。而本文主要介绍的是使用netty搭建简单的游戏服务器,对于netty与mina的比较以及简单netty应用教程,将在其他文章中有所提及,敬请关注!
三、 netty游戏框架搭建
a) ServerBootstrap——netty框架的总入口
b) ChannelPipeline
channelPipeline是一系列channelHandler的集合,他参照J2ee中的Intercepting Filter模式来实现的,让用户完全掌握如果在一个handler中处理事件,同时让pipeline里面的多个handler可以相互交互。
c) Decoder——消息解码器
Decoder解码器继承于FrameDecoder,FrameDecoder是Netty codec包中的辅助类,它是个ChannelUpstreamHandler,decode方法是FrameDecoder子类需要实现的。在本程序采用的是LengthFieldBasedFrameDecoder。LengthFieldBasedFrameDecoder是基于长度字段的解码器。如果协议格式类似“内容长度”+内容、“固定头”+“内容长度”+动态内容这样的格式,就可以使用该解码器 。至于其他类型的解码器,这里不再一一介绍。
d) ServerHandler——消息分发器
在介绍这个类之前,先对几个概念进行简要说明:
1. Channel:channel 是负责数据读、写的对象。channel是双向的,既可以write 也可以read。而且在NIO中用户不应该直接从channel中读写数据,而是应该通过buffer,通过buffer再将数据读写到channel中。
一个channel 可以提供给用户下面几个信息
(1)channel的当前状态,比如open 还是closed
(2)ChannelConfig对象,表示channel的一些参数,比如bufferSize
(3)channel支持的所有i/o操作(比如read,write,connect.bind)
2. channelEvent:ChannelEvent广义的认为Channel相关的事件处理。他分为Upstream events和downstream events两大块。如果以服务器端为主体,那么client到server的数据传输过程是Upstream,而server到client的数据传输过程则是downstream;以客户端为主体的过程正好相反。一下主要介绍以服务器端为主体的开发。
3. 常用的Upstream events包括
a) messageReceived:信息被接受时 ---MessageEvent
b) exceptionCaught:产生异常时 ---ExceptionEvent
c) channelOpen:channel被开启时 ---ChannelStateEvent
d) channelClosed:channel被关闭时 ---ChannelStateEvent
e) channelBound:channel被开启并准备去连接但还未连接上的时候 ---ChannelStateEvent
f) channelUnbound:channel被开启不准备去连接时候 ---ChannelStateEvent
g) channelConnected:channel被连接上的时候 ---ChannelStateEvent
h) channelDisconnected:channel连接断开的时候 ---ChannelStateEvent
在本游戏架构里,ServerHandler扮演着创建线程、验证消息、分发消息的重要角色,程序如下:
需要注意的是:HandlerDispatcher是一个多线程处理器,用于处理游戏逻辑请求。这部分功能可根据用户的不同需求进行定制。
e) Encoder——消息编码器
消息编码器主要完成的是对游戏逻辑处理器返回的数据进行编码,组合成符合客户端规范的消息格式并发送。
没遇到过这种情况。
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
HandlerDispatcher 和 MessageQueue 可以发一下
看4.0的版本吧
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
HandlerDispatcher 和 MessageQueue 可以发一下
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
这是2012年的博客了
了解,呵
这是2012年的博客了
配置文件里加载时调用的!
nio是java New IO的简称,在jdk1.4里提供的新api。Sun官方标榜的特性如下:
为所有的原始类型提供(Buffer)缓存支持。
字符集编码解码解决方案。
Channel:一个新的原始I/O抽象。
支持锁和内存映射文件的文件访问接口。
提供多路(non-bloking)非阻塞式的高伸缩性网络I/O。
关于java NIO的实现部分不是本文讨论的重点,有兴趣的朋友可以访问JAVA夜无眠的博客JAVA NIO 实例。
二、 NIO框架简介
在Java社区,最知名的开源Java NIO框架要属Mina和Netty。实际上,Netty的作者原来就是Mina作者之一,所以可以想到,Netty和Mina在设计理念上会有很多共同点。而本文主要介绍的是使用netty搭建简单的游戏服务器,对于netty与mina的比较以及简单netty应用教程,将在其他文章中有所提及,敬请关注!
三、 netty游戏框架搭建
a) ServerBootstrap——netty框架的总入口
/** * 作者:chenpeng * E-mail:46731706@qq.com * 创建时间:2012-7-12 下午12:22:53 * 类说明 netty game */ public class ServerTest { public static void main(String[] args) { DOMConfigurator.configureAndWatch("config/log4j.xml"); ApplicationContext factory = new FileSystemXmlApplicationContext( new String[] { "config/propholder.xml" }); ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); ServerPipelineFactory httpServerPipelineFactory=(ServerPipelineFactory)factory.getBean("serverPipelineFactory"); bootstrap.setPipelineFactory(httpServerPipelineFactory); //启动端口 8888 bootstrap.bind(new InetSocketAddress(8888)); System.out.print("8888 server is starting……"); } }
b) ChannelPipeline
channelPipeline是一系列channelHandler的集合,他参照J2ee中的Intercepting Filter模式来实现的,让用户完全掌握如果在一个handler中处理事件,同时让pipeline里面的多个handler可以相互交互。
import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import com.cp.netty.coder.Decoder; import com.cp.netty.coder.Encoder; /** * 作者:chenpeng * E-mail:46731706@qq.com * 创建时间:2012-7-12 上午11:28:56 * channelPipeline是一系列channelHandler的集合,他参照J2ee中的Intercepting Filter模式来实现的, * 让用户完全掌握如果在一个handler中处理事件,同时让pipeline里面的多个handler可以相互交互 */ public class ServerPipelineFactory implements ChannelPipelineFactory { public ServerHandler serverHandler; public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeLine = Channels.pipeline(); pipeLine.addLast("decoder", new Decoder(Integer.MAX_VALUE, 0, 4)); pipeLine.addLast("encoder", new Encoder(4)); pipeLine.addLast("handler", serverHandler); return pipeLine; } public ServerHandler getServerHandler() { return serverHandler; } public void setServerHandler(ServerHandler serverHandler) { this.serverHandler = serverHandler; } }
c) Decoder——消息解码器
Decoder解码器继承于FrameDecoder,FrameDecoder是Netty codec包中的辅助类,它是个ChannelUpstreamHandler,decode方法是FrameDecoder子类需要实现的。在本程序采用的是LengthFieldBasedFrameDecoder。LengthFieldBasedFrameDecoder是基于长度字段的解码器。如果协议格式类似“内容长度”+内容、“固定头”+“内容长度”+动态内容这样的格式,就可以使用该解码器 。至于其他类型的解码器,这里不再一一介绍。
import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; /** * 作者:chenpeng * E-mail:46731706@qq.com * 创建时间:2012-7-12 上午11:22:14 * 协议解码器 */ public class Decoder extends LengthFieldBasedFrameDecoder { // 第一个参数为信息最大长度,超过这个长度回报异常, // 第二参数为长度属性的起始(偏移)位,我们的协议中长度是0到第3个字节,所以这里写0, // 第三个参数为“长度属性”的长度,我们是4个字节,所以写4, // 第四个参数为长度调节值,在总长被定义为包含包头长度时,修正信息长度, // 第五个参数为跳过的字节数,根据需要我们跳过前4个字节,以便接收端直接接受到不含“长度属性”的内容。 public Decoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) { super(maxFrameLength, lengthFieldOffset, lengthFieldLength); } @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception { ChannelBuffer buffs = (ChannelBuffer)super.decode(ctx, channel, buffer); return buffs; } }
d) ServerHandler——消息分发器
在介绍这个类之前,先对几个概念进行简要说明:
1. Channel:channel 是负责数据读、写的对象。channel是双向的,既可以write 也可以read。而且在NIO中用户不应该直接从channel中读写数据,而是应该通过buffer,通过buffer再将数据读写到channel中。
一个channel 可以提供给用户下面几个信息
(1)channel的当前状态,比如open 还是closed
(2)ChannelConfig对象,表示channel的一些参数,比如bufferSize
(3)channel支持的所有i/o操作(比如read,write,connect.bind)
2. channelEvent:ChannelEvent广义的认为Channel相关的事件处理。他分为Upstream events和downstream events两大块。如果以服务器端为主体,那么client到server的数据传输过程是Upstream,而server到client的数据传输过程则是downstream;以客户端为主体的过程正好相反。一下主要介绍以服务器端为主体的开发。
3. 常用的Upstream events包括
a) messageReceived:信息被接受时 ---MessageEvent
b) exceptionCaught:产生异常时 ---ExceptionEvent
c) channelOpen:channel被开启时 ---ChannelStateEvent
d) channelClosed:channel被关闭时 ---ChannelStateEvent
e) channelBound:channel被开启并准备去连接但还未连接上的时候 ---ChannelStateEvent
f) channelUnbound:channel被开启不准备去连接时候 ---ChannelStateEvent
g) channelConnected:channel被连接上的时候 ---ChannelStateEvent
h) channelDisconnected:channel连接断开的时候 ---ChannelStateEvent
在本游戏架构里,ServerHandler扮演着创建线程、验证消息、分发消息的重要角色,程序如下:
import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.log4j.Logger; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.ChannelStateEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelUpstreamHandler; import com.cp.game.HandlerDispatcher; import com.cp.game.domain.MessageQueue; import com.cp.netty.domain.GameRequest; /** * 作者:chenpeng * E-mail:46731706@qq.com * 创建时间:2012-7-12 下午12:02:52 * 游戏协议接收分发器 */ public class ServerHandler extends SimpleChannelUpstreamHandler { public Logger log = Logger.getLogger(this.getClass()); public static HandlerDispatcher handlerDispatcher; public void init() { new Thread(handlerDispatcher).start(); } /* (non-Javadoc) * @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#channelConnected(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.ChannelStateEvent) * 建立一个新channel */ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { log.debug("进来一个channel:" + ctx.getChannel().getId()); MessageQueue messageQueue = new MessageQueue( new ConcurrentLinkedQueue<GameRequest>()); handlerDispatcher.addMessageQueue(ctx.getChannel().getId(), messageQueue); } /* (non-Javadoc) * @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#channelDisconnected(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.ChannelStateEvent) * 玩家主动关闭channel */ @Override public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { log.error("关掉一个channel:" + ctx.getChannel().getId()); handlerDispatcher.removeMessageQueue(e.getChannel().getId().toString()); e.getChannel().close(); } /* (non-Javadoc) * @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#exceptionCaught(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.ExceptionEvent) * 玩家被动关闭channel */ @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { log.error("出异常啦……" + ctx.getChannel().getId()); e.getCause().printStackTrace(); handlerDispatcher.removeMessageQueue(e.getChannel().getId().toString()); e.getChannel().close(); } /* (non-Javadoc) * @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#messageReceived(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.MessageEvent) * 消息接收处理器 */ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ChannelBuffer buffs = (ChannelBuffer) e.getMessage(); buffs.skipBytes(4);// 越过dataLength的字节 byte[] decoded = new byte[buffs.readableBytes()]; buffs.readBytes(decoded); GameRequest gameRequest = new GameRequest(e.getChannel(), decoded); // 通知回调协议 handlerDispatcher.addMessage(gameRequest); } public HandlerDispatcher getHandlerDispatcher() { return handlerDispatcher; } public void setHandlerDispatcher(HandlerDispatcher handlerDispatcher) { ServerHandler.handlerDispatcher = handlerDispatcher; } }
需要注意的是:HandlerDispatcher是一个多线程处理器,用于处理游戏逻辑请求。这部分功能可根据用户的不同需求进行定制。
e) Encoder——消息编码器
消息编码器主要完成的是对游戏逻辑处理器返回的数据进行编码,组合成符合客户端规范的消息格式并发送。
import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBuffers; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.handler.codec.frame.LengthFieldPrepender; import com.cp.netty.domain.GameResponse; /** * 作者:chenpeng * E-mail:46731706@qq.com * 创建时间:2012-7-12 上午11:43:11 * 类说明 */ public class Encoder extends LengthFieldPrepender { public Encoder(int lengthFieldLength) { super(lengthFieldLength); } @Override protected Object encode(ChannelHandlerContext cxt, Channel channel, Object msg) throws Exception { ChannelBuffer buffer = ChannelBuffers.dynamicBuffer(channel.getConfig().getBufferFactory()); GameResponse response = (GameResponse) msg; buffer.writeInt(response.getRtMessage().length+20); buffer.writeInt(response.getCommondId()); buffer.writeInt(response.getPlayerId()); buffer.writeInt(response.getCommandType()); buffer.writeLong(response.getTime()); System.out.println("send message "+response.getCommondId()); buffer.writeBytes(response.getRtObj().getBytesM()); return buffer; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="serverPipelineFactory" class="com.cp.netty.ServerPipelineFactory" scope="prototype"> <property name="serverHandler" ref="appHandler"></property> </bean> <bean id="appHandler" class="com.cp.netty.ServerHandler" init-method="init"> <property name="handlerDispatcher" ref="handlerDispatcher" /> </bean> <bean id="handlerDispatcher" class="com.cp.game.HandlerDispatcher" init-method="init" destroy-method="stop"> <property name="messageExecutor"> <bean class="com.cp.netty.domain.FiexThreadPoolExecutor" destroy-method="shutdown"> <constructor-arg value="${app.dispatcher.pool.corePoolSize}" /> <constructor-arg value="${app.dispatcher.pool.maximumPoolSize}" /> <constructor-arg value="${app.dispatcher.pool.keepAliveSecond}" /> </bean> </property> <property name="sleepTime" value="${app.dispatcher.sleepTime}" /> <property name="handlerMap" ref="serverHandlerMapping" /> </bean> <bean id="serverMainController" class="com.cp.game.ServerMainHandler" abstract="true"> </bean> <bean id="serverHandlerMapping" class="java.util.HashMap"> <constructor-arg> <map> <!-- 测试协议 --> <entry key="1000"> <bean class="com.cp.game.handler.common.InitHandler" parent="serverMainController"> </bean> </entry> </map> </constructor-arg> </bean> </beans>
- NettyGameDemo.rar (2.2 MB)
- 下载次数: 2233
评论
24 楼
liulehua_123
2017-11-06
23 楼
heng123
2017-10-03
netty等视频java.5d6b.com教程
22 楼
di1984HIT
2017-08-02
学习了~~
21 楼
zhoujieyaoqu
2017-06-20
楼主的git 不能提交分支,有些看法,楼主看看。
首先对于堆外内存零copy的问题,楼主,采用的模式是io通信采用的netty框架默认的方式,目前netty4采用的是堆外内存,但是在业务的时候,使用的堆内存,所以会有一次拷贝,我构想,直接使用堆外内存,与io业务公用一份数据,在业务中不消亡数据
然后楼主的handler有线程安全问题,我们使用ConcurrentHashMap 的时候,只是这个map本身是线程安全的,并不是对它的操作是安全的,楼主有段代码,再为空的时候,直接new一个放进去的做法,这个在理论上来说,非线程安全的。
首先对于堆外内存零copy的问题,楼主,采用的模式是io通信采用的netty框架默认的方式,目前netty4采用的是堆外内存,但是在业务的时候,使用的堆内存,所以会有一次拷贝,我构想,直接使用堆外内存,与io业务公用一份数据,在业务中不消亡数据
然后楼主的handler有线程安全问题,我们使用ConcurrentHashMap 的时候,只是这个map本身是线程安全的,并不是对它的操作是安全的,楼主有段代码,再为空的时候,直接new一个放进去的做法,这个在理论上来说,非线程安全的。
20 楼
cpjsjxy
2014-11-26
cys1357 写道
楼主,想请教一下,服务端将channal保存起来,用来实时写回数据到客户端,channnal本身是由框架管理的,当连接数很多时是否会被框架释放掉,而保存的副本却没有释放,从而引起一些异常现象,比如连接看上去没问题,但两边却不能传数据。我是初学服务器编程,可能基本概念不是很清楚,求指导。
没遇到过这种情况。
19 楼
cys1357
2014-11-24
楼主,想请教一下,服务端将channal保存起来,用来实时写回数据到客户端,channnal本身是由框架管理的,当连接数很多时是否会被框架释放掉,而保存的副本却没有释放,从而引起一些异常现象,比如连接看上去没问题,但两边却不能传数据。我是初学服务器编程,可能基本概念不是很清楚,求指导。
18 楼
cpjsjxy
2014-11-14
bluky999 写道
cpjsjxy 写道
bluky999 写道
cpjsjxy 写道
bluky999 写道
netty 3 ?难怪不兼容。。。
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
HandlerDispatcher 和 MessageQueue 可以发一下
看4.0的版本吧
17 楼
bluky999
2014-11-14
cpjsjxy 写道
bluky999 写道
cpjsjxy 写道
bluky999 写道
netty 3 ?难怪不兼容。。。
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
HandlerDispatcher 和 MessageQueue 可以发一下
16 楼
cpjsjxy
2014-11-13
bluky999 写道
cpjsjxy 写道
bluky999 写道
netty 3 ?难怪不兼容。。。
这是2012年的博客了
了解,呵
稍后发个基于netty4.0的版本
15 楼
bluky999
2014-11-12
cpjsjxy 写道
bluky999 写道
netty 3 ?难怪不兼容。。。
这是2012年的博客了
了解,呵
14 楼
cpjsjxy
2014-11-12
bluky999 写道
netty 3 ?难怪不兼容。。。
这是2012年的博客了
13 楼
bluky999
2014-11-12
netty 3 ?难怪不兼容。。。
12 楼
spde1988
2014-11-05
没有看到jar文件? 还希望楼主能够分享下~
11 楼
HuiXiaoPi
2014-02-15
为什么都是编译后的
10 楼
Jacarri_Chan
2014-01-17
代码有问题:
buffer.writeInt(response.getPlayerId()); netty使用BigEndian:低位放在前面,高位放在后面。
StreamUtils.readInt(inCommandData);的readInt方法却是将前面的左移位变大.
----------------------------------------------------------------------------
改两个方法后,代码运行ok
buffer.writeInt(response.getPlayerId()); netty使用BigEndian:低位放在前面,高位放在后面。
StreamUtils.readInt(inCommandData);的readInt方法却是将前面的左移位变大.
----------------------------------------------------------------------------
改两个方法后,代码运行ok
private void _writeData(long aValue, int aLength) { if (writepos + aLength > buffer.length) { _expand(writepos + aLength + 100); } int tmp = (aLength - 1) * 8; while (tmp >= 0) { buffer[writepos++] = (byte) ((aValue >> tmp) & 0xFF); tmp -= 8; } size += aLength; }
public static int readInt(InputStream in) throws IOException { int b0 = readByte(in); int b1 = readByte(in); int b2 = readByte(in); int b3 = readByte(in); return ((b0 & 0xFF) << 24) | ((b1 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b3 & 0xFF); }
9 楼
Jacarri_Chan
2014-01-15
ApplicationContext factory = new FileSystemXmlApplicationContext(
new String[] { "config/propholder.xml" });
可以使用[ApplicationContext factory = new ClassPathXmlApplicationContext(new String[] { "propholder.xml" });]
好处是propholder.xml放在classpath中就可以啦
new String[] { "config/propholder.xml" });
可以使用[ApplicationContext factory = new ClassPathXmlApplicationContext(new String[] { "propholder.xml" });]
好处是propholder.xml放在classpath中就可以啦
8 楼
aaacccbbb
2013-08-22
jar 包呢
7 楼
cpjsjxy
2013-05-22
leehui1983 写道
请问ServerHandler的init()方法在哪里调用?
配置文件里加载时调用的!
6 楼
leehui1983
2013-03-26
请问ServerHandler的init()方法在哪里调用?
5 楼
nocb
2013-03-06
先谢了, 回去试试看
发表评论
-
Java编程规范
2018-05-21 12:59 1009Java编程规范 一、 命名约束 1. [强制] 代码中的命名 ... -
java面试整理二——JVM
2018-02-25 16:07 8391. JVM的主要结构 JVM ... -
java 面试整理一——基础知识
2018-02-25 16:04 6501. short s1 = 1; s1 = s1 + 1; ... -
Kafka与Spring的集成
2016-01-15 16:10 10743producer public class KafkaSe ... -
基于jquery mobile+websocket+protocol buffer的IM开发
2016-01-15 10:46 3813第一次研究有关web端的框架,结合工作需要,决定搞一个基于we ... -
linux操作系统下 Jenkins+SVN+Maven+Tomcat 自动集成环境搭建
2016-01-05 15:59 5843一、准备工作 jdk(jdk1.7.0_65.zip) Mav ... -
tcp 连接关闭详解
2014-07-10 14:48 4116主动发起关闭TCP链接端 ... -
Linux下Java线程状态分析
2014-06-11 14:39 5254在Linux上输入top 进入top后按【shift】+【H】 ... -
java面试整理(1)
2012-12-04 15:44 11631. short s1 = 1; s1 = s1 + 1; ... -
Java并发之——同步与原子性
2012-08-27 13:08 1429每一个线程自顾自的做 ... -
基于netty的websocket开发小结
2012-07-27 18:03 60217WebSocket是html5规范新引入的功能,用于解决浏览器 ... -
spring集成log4j配置信息
2012-07-17 14:32 2331spring中集成log4j并非难事,只需要在web.xml ... -
J2EE开发中的java字符编码问题经验总结
2012-07-16 12:28 1566在J2EE程序开发过程中,经常遇到字符的编码问题。这一问题困扰 ... -
使用 Netty 进行 UDP 网络编程
2012-07-16 11:33 32885使用 Netty 进行 UDP 网络编程 在正式开始 ... -
将json字符串转换为对象
2012-07-13 09:52 1453准备将这几年的工作进行一个系统的总结,会陆续发些东西出来供大家 ...
相关推荐
2024年机器人大作业代码
这是mysql文件直接导入就行了,可以查一下相关指令例如:mysql -u root -p mydb_copy < mydb.sql就好了,这里就不多赘述了
Android 毕业设计,Android 毕业设计,小Android 程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
管理员 管理员信息管理 学院管理 辅导员管理 学生信息管理 公告信息 辅导员 个人资料修改 团员信息管理 优秀团员管理 团费缴纳管理 团员活动管理(主题,内容,参与人数,日期) 团员活的报名 学生 个人资料修改 入团申请管理(提交申请,申请结果查看) 团员活动查看(只能查看,不能修改,活动报名) 团员活动报名 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)基于springboot图书管理系统源码+数据库+详细使用说明(高分毕设项目)个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要。
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
汽车检测33-YOLO(v5至v9)数据集合集.rar多对象-V4 2023-03-12 9:33 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包含4278张图像。 多对象以Yolo V5 Pytorch格式注释。 将以下预处理应用于每个图像: *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: 将以下转换应用于每个图像的边界框: *以下90度旋转之一的同等概率:无,顺时针,逆时针方向
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
三亚市2005-2024年近20年的历史气象数据,每3小时更新一次数据,参数包含气温、气压、降水量、云层、能见度、风向、湿度等,几万条数据
详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/144542157
项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
1、嵌入式物联网单片机项目开发实战。例程经过精心编写,简单好用。 2、代码使用KEIL 标准库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。
瓶罐瓶子罐子检测75-YOLO(v5至v9)、COCO、CreateML、Darknet数据集合集.rar街7级-V2 2023-04-28 11:45 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括8934张图像。 街道以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。
管理员 管理员信息管理 负责人管理 员工信息管理 公告信息管理 小型车收费标准设置(元/每公里) 大卡车收费标准设置(元/吨公里) 收费信息统计,统计小车和卡车收费,按月统计 负责人 个人资料修改 公告查看 小车收费统计(某员工某月统计) 大卡车收费统计(某员工某月统计) 员工 个人资料修改 公告查看 小型车收费登记(车牌号,车辆照片,行使公里数,收费金额,收费日期,收费员,按公里数可以自动计算费用 收费金额=收费标准*公里数) 大卡车金额设置(每吨/元)(车牌号,车辆照片,行使公里数,吨,收费金额,收费日期,收费员, 收费金额=收费标准*吨*公里数 ) 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
Python课程设计,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
桌球检测10-YOLO(v5至v9)、Darknet、Paligemma、TFRecord、VOC数据集合集.rar大理石-V3版本 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括105张图像。 大理石以Yolo V3 Darknet格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。
项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!
喜来登五星酒店酒店数字客房管理系统.docx