Reactor开发模式 SocketChannel 在client端监听op_connect,op_write,op_read事件,在server只监听op_write,op_read事件,ServerSocketChannel在server端运行,只监听op_accept事件
netty对Reactor模式的实现 首先ServerSocketChannel是可以创建子的socketchannel,创建是由 BootstrapChannelFactory这个工厂类根据传入的class反射来创建, 所以 serverBootstrap.group().channel(xxx.class) .channel这个时候就是由上面的工厂类利用反射动态的创建一个channel,绑定在对应的group上
serverBootstrap.group(bossGroup,workerGroup) .channel传进来的会创建一个channel绑定在bossGroup上,然后传进来的ServerSocketChannel可以创建子socketchannel绑定在wokergroup上
再和上面的reactor开发模式对应,就是serversocketchannel绑定在bossGroup上来负责监听op_accept事件,socketchannel绑定在workergroup上来负责监听其他read write事件
粘包和半包
TCP为什么会出现粘包和半包(UDP其实没有这个问题):主要是因为TCP是流协议
常用的解决这种问题的方案:要么短链接,要么长链接中采用封装成桢framing技术
netty对使用Framing粘包半包的支持: 固定长度的方式:一定就按固定长度的来传,不够就补空,解码FixedLengthFrameDecoder 分割符的方式:以指定的分割符来分割,但要考虑内容中如果有这个分割符需要转义,解码DelimiterBasedFrameDecoder 固定长度字段存内容的长度信息:要考虑预留多少位来存储这个长度,解码器是LengthFieldBasedFramedDecoder,编码器LengthFieldPrepender
上面的编码器都继承了ByteToMessageDecoder这个抽象类
ByteToMessageDecoder 继承 ChannelInboundHandlerAdapter ChannelInboundHandlerAdapter 中有一个channelRead方法处理数据,ByteToMessageDecoder 中就具体实现了channelRead方法 ByteToMessageDecoder中维护了一个ByteBuf类型的数据积累器cumulation,如果是第一笔数据直接赋值给cumulation,不是第一笔的就追加在cumulation后面,然后调
callDecode(ctx, cumulation, out);
//其中callDecode中会调
decodeRemovalReentryProtection(ctx, in, out);
//然后这个又会调decode(ctx, in, out);//这个decode是ByteToMessageDecoder中提供的抽象方法,具体由上面的各种Decoder来实现
以FixedLengthFrameDecoder为例子
public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
private final int frameLength;
public FixedLengthFrameDecoder(int frameLength) {
if(frameLength <= 0) {
throw new IllegalArgumentException("frameLength must be a positive integer: " + frameLength);
} else {
this.frameLength = frameLength;
}
}
protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {
Object decoded = this.decode(ctx, in);
if(decoded != null) {
out.add(decoded);//每一次解出来的数据放在out中
}
}
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
return in.readableBytes() < this.frameLength?null:in.readSlice(this.frameLength).retain();
//如果当前积累器就是这里的in中的数据小于定义的长度,不做任何操作,这个时候数据也不够,超过定义的长度,取frameLength长度的数据出来,剩下的就还在积累器中
}
一次编码器ByteToMessageDecoder,解决粘包半包问题,将原始的数据流(io.netty.buffer.ByteBuf) 变成用户的数据(io.netty.buffer.ByteBuf这里的用户的数据还是字节流,但是没有粘包半包的问题了) 二次编码器MessageToMessageDecoder, 将一次编码处理后的字节数据(io.netty.buffer.ByteBuf)变成java的对象(java object)
KeepAlive和Idle检测
netty源码核心包 io.netty.transport: 实现协议 io.netty.codec: 实现编解码的部分 io.netty.handler: 各种handler的实现 其他工具类:io.netty.buffer,io.netty.common,io.netty.resolver
netty的启动 从线程角度看,启动的时候一个是启动线程要做几件事情:创建selector,创建并初始化serverSocketChannel,给serversocketChannel从boss group中选择一个NioEventLoop 一个是boss thread要做的几件事情:将serverSocketChannel注册到选择的NioEventLoop上的selector(也就是第一步创建的selector),绑定地址启动,然后就可以开始注册OP_acceptor事件到selector上
从源码的角度上看 new NioEventLoopGroup的时候就会new 一个selector 创建完group之后,调bind(port)异步去绑定地址,在这个bind的过程中有一句
//类AbstractBootstrap中的dobind方法
private ChannelFuture doBind(final SocketAddress localAddress) {
final ChannelFuture regFuture = initAndRegister();
//初始化一个serverSocketChannel,register到selector上,返回的是一个regFuture,下面会根据isDone判断是否完成了
final Channel channel = regFuture.channel();
if (regFuture.cause() != null) {
return regFuture;
}
if (regFuture.isDone()) { //已经完成
// At this point we know that the registration was complete and successful.
ChannelPromise promise = channel.newPromise();
doBind0(regFuture, channel, localAddress, promise);
return promise;
} else {
// Registration future is almost always fulfilled already, but just in case it's not.
//没完成,建一个task绑定在listener上
final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel);
regFuture.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
Throwable cause = future.cause();
if (cause != null) {
// Registration on the EventLoop failed so fail the ChannelPromise directly to not cause an
// IllegalStateException once we try to access the EventLoop of the Channel.
promise.setFailure(cause);
} else {
// Registration was successful, so set the correct executor to use.
// See https://github.com/netty/netty/issues/2586
promise.registered();
doBind0(regFuture, channel, localAddress, promise);
}
}
});
return promise;
}
}
ServerBootstrapAcceptor:负责接收客户端连接创建连接后的连接初始化工作
netty构建连接 构建连接的主线: 对于boss thread: 1 NioEventLoop中的selector轮询创建连接事件(OP_Accept) 2 创建socket Channel 3 初始化socket channel 并从work group中选择一个NioEventLoop
对于worker thread: 1 将socket channel 注册到上面第3步选择的NioEventLoop的selector(这里怎么选择出来一个NioEventLoop有多种,策略模式) 2 注册OP_READ 到selector
netty 读取数据 selector(多路复用器)接收到OP_read事件 处理这个事件,NioSocketChannel.NioSocketChannelUnsafe.read() 1) 分配一个byte buffer来接收数据,初始化这个buffer是1024个字节 2)从channel接收数据到byte buffer 3)记录实际接收数据的大小,调整下次分配byte buffer的大小 4)触发pipeline.fireChannelRead(bytebuf)把读到的数据传播出去 5)判断接收数据的bytebuffer是否满载而归,是的话继续读取直到没有数据或者已经满来16次,否则本轮读取结束,等待下次OP_read事件
读取数据的关键代码 SocketChannelImpl.read(java.nio.ByteBuffer) NioSocketChannel.read是读取数据,NioServerSocketChannel.read是创建连接 pipeline.fireChannelReadComplete() 一次读事件完成 pipeline.fireChannelRead(bytebuf) 一次读数据完成 一次读事件包括多个读数据
netty处理业务逻辑 inboud和outbound head - handler1 - handler2 - tail inbound是从head到tail,outbound是从tail到head 每一个handler都是实现了ChannelInboundHandler的
你可能感兴趣的:(netty)
【可靠有效】springboot使用netty搭建TCP服务器
weixin_43833540
spring boot netty tcp
NettyNetty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和workerGroup。bossGroup负责接收客户端的连接请求,并将这些连接分配给worker
开源的H5即时聊天系统 spring-boot + netty + protobuf + vue ~
lmxdawn
黎明晓 spring-boot vue netty websocket protobuf
前言一篇文章引发的思考?一次读公号推文,发现一篇文章写得特好,勾起了好奇心《群聊比单聊,为什么复杂这么多?》,@沈大大.GitHub地址him-vue前往him-netty前往心路历程第一阶段,刚看完文章时,特别兴奋,开始着手,花了一个月把聊天界面基本弄,然后着手于后端,经过些简单的调研,决定用netty搭建一个,后面发现里面的复杂逻辑,再加上心中的火似乎已经熄灭,最后…第二阶段,最近刷公文时又刷
利用TCP协议服务器从单用户到多用户的理解思路与解决办法(select\poll\epoll)(一)
Gpangpangwa
网络编程 c++ tcp
在进行TCP协议的了解之前,首先要了解用到的基本函数:**socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数intsocket(intAdress_family,inttype,intprotocol);af:如AF_INETtype:连接类型,通常是SOCK_STREAM或SOCK_DGRAMprotocol:协议类型,通常是IPPROTO_
分布式消息中间件(十三)——RocketMQ延时消息
码炫课堂-码哥
rocketmq专题 rocketmq 消息中间件
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对
Netty学习 - 编译Netty4.2
wisfy_21
Netty学习
编译Netty4.2版本遇到一些问题:首先是缺失io.netty.util.collection.IntObjectHashMap这类collection包。这个问题的原因是,在netty-common下,这些是需要根据模板生成类,所以需要先编译打包netty-common。在netty-common下执行package的时候,会遇到另一个错误io.netty:netty-dev-tools:ja
Springboot 集成 netty-socketio + Vue前端分离
Synologs过客
Java java ajax socket websocket spring
Springboot集成netty-socketionetty-socketio:仿`node.js`实现的socket.io服务端1.将WebSocket、AJAX和其它的通信方式全部封装成了统一的通信接口2.使用时,不用担心兼容问题,底层会自动选用最佳的通信方式3.适合进行服务端和客户端双向数据通信pom.xmlcom.corundumstudio.socketionetty-socketio
前后端分离的Netty + WebSocket实现聊天室
CRE_MO
websocket python 网络协议
1.前端WebSocketChatvarsocket;if(!window.WebSocket){window.WebSocket=window.MozWebSocket;}if(window.WebSocket){socket=newWebSocket("ws://localhost:8088/ws");socket.onmessage=function(event){console.log("
【Python系列】Python 解释器的站点配置
Kwan的解忧杂货铺@新空间代码工作室
s1 Python python 开发语言
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kwan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kafka,Spring,微服务,Netty等常用开发工具系列:罗列常用的开发工具,如IDEA,M
iot架构 mqtt netty_一个关于小程序Iot的具体实现(MQTT版)
Alfred Cheng
iot架构 mqtt netty
前言Iot,这个名词应该很多人都听过了吧,即大数据、Ai等兴起后也紧跟着研发大潮流的到来,即物联网。传统简单的说就是智能化、程序化的控制硬件设施,大家最容易想到的应该是智能家居,通过一个App或者遥控进行对家具设置的远程控制。而今天要说的是人与物之间的通信控制,且通过互联网产品来执行人的命令,而机器进行应答。竞品说到小程序控制硬件,大家应该立马想到什么产品呢?某拜、某FO、售货机等等,他们的架构上
RocketMQ源码分析-Rpc通信模块(remoting)二
吃水果的猪儿虫
java-rocketmq rocketmq rpc
前言今天继续RocketMQ-Rpc通信模块(remoting)的源码分析。上一章提到了主要的start()方法执行流程,如果有不清楚的地方可以一起讨论哈,这篇文章会继续解读主要方法,按照惯例先看看NettyRemotingAbstract的类图,看类图知方法。和NettyEventExecutor以及MQ的交互流程。按照惯例先看看NettyRemotingAbstract的类图,看类图知方法,文
rocketmq源码解析之NamesrvController启动②创建mqclient②
qq_23283355
mq rocketmq dubbo springboot 消息队列
说在前面接上次,更多源码解析请关注“天河聊架构”微信公众号源码解析netty连接管理handlerclassNettyConnectManageHandlerextendsChannelDuplexHandler{@Overridepublicvoidconnect(ChannelHandlerContextctx,SocketAddressremoteAddress,SocketAddressl
RocketMQ七、rocketMQ的网络通信模块
vinylon1022
RocketMQ java spring cloud alibaba RocketMQ
关于rocketMQ的netty消息处理,实际上都在一个rocketmq-remoting模块中。不管是nameserver还是broker,从netty的handler开始是统一的结构。我们先以nameserver部分的跟踪一下。前一篇看到过netty的启动,我们回过来再看一下:@Overridepublicvoidstart(){...prepareSharableHandlers();Ser
Radius协议详解
靖节先生
基础框架 网络协议 java
Radius协议详解radius协议ruoyi-radiusRadius协议开源框架1.FreeRADIUS2.TinyRadius3.JRadius4.Radius4J5.Netty-Radius总结切换git指定tagradius协议802.1X认证原理描述https://support.huawei.com/enterprise/zh/doc/EDOC1100301697?section=j
【Redis系列】Redis安装与使用
m0_74825409
面试 学习路线 阿里巴巴 redis 数据库 缓存
???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kwan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kafka,Spring,微服务,Netty等常用开发工具系列:罗列常用的开发工具,如IDE
Netty的ByteBuf为何如此高效?深入解析其设计与优势
星辰@Sea
系统架构 Java Netty Java
前言在高性能网络编程中,Netty因其卓越的性能和灵活性而被广泛应用。本文将深入探讨Netty的核心组件之一——ByteBuf的设计理念及其优势。部署准备一、JavaNIOBuffer的痛点在传统JavaNIO编程中,ByteBuffer存在以下缺陷:容量固定:初始化后无法自动扩容读写模式切换:需要调用flip()方法切换API复杂:position/limit等指针管理繁琐内存管理:直接内存需要
Netty如何优雅地解决TCP粘包、拆包问题
星辰@Sea
系统架构 Java tcp/ip 网络 网络协议 Netty
引言在TCP/IP协议族中,TCP(传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层协议。TCP协议确保了数据能够可靠地从一个端点传输到另一个端点,但它并没有提供消息边界的概念。这意味着,当数据被发送时,可能会出现“粘包”(数据包被合并)或“拆包”(数据包被分割)的问题。这对开发人员来说是一个挑战,因为如果不正确处理这些问题,可能导致应用程序的逻辑错误或性能问题。在本文中,我们将深入探讨
vertx
三笠爷
vert.x
vert.x是reactive(响应式编程),是一种思想,特点:事件驱动(发挥单台机器的性能):单台机器上,用少量线程处理大量并发异步处理请求(多个服务间通信阻塞较少,响应时间降低):https://vertx.io/官网基于netty的、运行在jvm之上的、支持多种编程语言的高性能异步、非阻塞、响应式全栈javaweb框架eclipse软件基金会顶级java开源项目之一在techempower.
Netty UDP 客户端发消息后接收服务器信息
一顿敲代码的小朋
netty java
在本站大神的文章的基础上,加入了我的项目需求,当客户端用UDP给服务端发送消息后,接收到服务端返回的消息再关闭客户端。UdpServer.javaimportio.netty.bootstrap.Bootstrap;importio.netty.channel.ChannelOption;importio.netty.channel.EventLoopGroup;importio.netty.ch
JAVA面试宝典:2020年程序员面试必备
Neo-ke
本文还有配套的精品资源,点击获取简介:Java面试宝典是求职或晋升的必备参考资料,涵盖了Java、Redis、SpringBoot、Netty、虚拟机、前端、SpringCloud、MySQL和RocketMQ等热门技术领域的最新知识。掌握这些知识点不仅有助于面试成功,还能提升专业技能,在IT行业保持竞争力。1.Java基础与核心技术Java作为一门面向对象的编程语言,在IT行业中广泛应用。本章将
JDK 官方迁移指南中文版(基于 JDK 8 → JDK 11 → JDK 17)
金州小铁匠
java 开发语言
JDK官方迁移指南中文版(基于JDK8→JDK11→JDK17)一、迁移前的准备工作环境评估与兼容性检查操作系统支持:确保当前系统支持目标JDK版本。例如,JDK17要求Windows10/11、macOSBigSur或更高版本,以及主流Linux发行版。第三方依赖审查:检查项目中使用的框架(如SpringBoot)、工具(如Maven/Gradle)和库(如Netty、Lombok)是否兼容目标
Netty解决TCP粘包拆包问题
is_Peng
Java基础 java netty socket 网络通信 网络
什么是TCP粘包/拆包TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是基于字节流传输的,就像河流一样,数据“流”式传输,数据中间没有分界。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以一个完整的数据包可能会拆分成多个包传输,或者多个数据包可能会合并成一个包传输,这就是所谓的TCP的粘包/拆包问题。如下图所示:正常业务逻辑上,Clien
Spark源码分析
数据年轮
Spark spark源码 spark 大数据 源码分析
过程描述:1.通过Shell脚本启动Master,Master类继承Actor类,通过ActorySystem创建并启动。2.通过Shell脚本启动Worker,Worker类继承Actor类,通过ActorySystem创建并启动。3.Worker通过Akka或者Netty发送消息向Master注册并汇报自己的资源信息(内存以及CPU核数等),以后就是定时汇报,保持心跳。4.Master接受消息
分库分表后,有哪些查询问题?该如何解决?
码炫课堂-码哥
java面试题 面试 分库分表
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对
2024Java零基础自学路线(Java基础、Java高并发、MySQL、Spring、Redis、设计模式、Spring Cloud)
ekskef_sef
面试 学习路线 阿里巴巴 java spring mysql
目录一、Java基础1、Java基础3、Java8新特性4、Java集合5、Java高并发6、Java代码实例二、MySQL数据库三、SpringBoot框架(35天)四、微服务SpringCloud四、Redis中间件五、MongoDB数据库六、Netty网络编程七、23种设计模式八、Dubbo九、JavaScript零基础入门十、Vue基础知识十一、数据结构与算法大家好,我是哪吒。现在网上的学
UDP协议转换TCP协议
在下陈平安
网络通信
UDP协议转换TCP协议项目背景:项目类似中间件作用是数据搬运,可以搬运文件,视频,音频。从互联网把数据搬运到内网中。有的时候拉取视频流数据的时候使用UDP拉取会存在丢包的情况通过TCP拉拉取视频流数据再通过UDP发送这样可以保证质量也能提高效率。着重说明协议转换使用的技术1.netty2.scoket过程描述测试利用两个视频开源平台LiveGBS一个放在内网中充当视频播放设备此处命名为SPA2一
2024最强Java面试八股文(精简、纯手打)
m0_74823021
面试 学习路线 阿里巴巴 java 面试 开发语言
2024最新最全国内大厂Java面试高频题库本小册内容涵盖:Java基础,JVM,多线程,数据库(MySQL/Redis)SSM,Dubbo,网络,MQ,Zookeeper,Netty,微服务,大数据,算法,项目,设计模式等,篇幅足足近2千页,大家面试前拿去提前刷刷,一、基础篇1.接口和抽象类的区别相似点:(1)接口和抽象类都不能被实例化(2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法不
async-http-client使用示例
光芒再现0394
http 网络协议 网络
文章目录概要整体架构流程技术名词解释技术细节小结概要async-http-client是一个用于Java平台的高性能、非阻塞HTTP客户端库,它允许开发者以异步的方式发送HTTP请求并处理响应,从而提高应用程序的性能和响应性。主要特点异步处理:基于Netty框架实现,支持异步发送HTTP请求和处理响应,避免了传统同步请求中的阻塞。支持多种请求方法:支持GET、POST、PUT、DELETE等常见的
Netty HTTP2 示例-响应式编程-013
ApiHug
ApiHug intellij-idea java spring spring boot
ApiHug×{Postman|Swagger|Api...}=快↑准√省↓GitHub-apihug/apihug.com:AllaboutheApihugapihug.com:有爱,有温度,有质量,有信任ApiHug-APIdesignCopilot-IntelliJIDEsPlugin|MarketplaceTheNextGenerationAPIDevelopmentPlatform-Ap
Reactor Netty TCP 服务器端-响应式编程-011
ApiHug
intellij-idea spring spring boot ApiHug
ApiHug×{Postman|Swagger|Api...}=快↑准√省↓GitHub-apihug/apihug.com:AllaboutheApihugapihug.com:有爱,有温度,有质量,有信任ApiHug-APIdesignCopilot-IntelliJIDEsPlugin|MarketplaceTheNextGenerationAPIDevelopmentPlatform-Ap
面试官:谈谈你对IO多路复用的理解?
java后端
“IO多路复用”是编程中常见的技术词汇,使用这种技术的框架有很多,如,Redis、Kafka、Netty、Nginx中都用到了此技术。那问题来了,什么是IO多路复用?它的具体实现技术有哪些?这些技术之间有什么区别?今天我们就来简单的探讨一下。1.什么是IO多路复用?IO多路复用技术是一种允许单个线程管理多个网络连接的技术,它使得服务器能够高效地处理大量的并发连接而不需要为每个连接创建一个独立的线程
xml解析
小猪猪08
xml
1、DOM解析的步奏
准备工作:
1.创建DocumentBuilderFactory的对象
2.创建DocumentBuilder对象
3.通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
4.通过Document的getElem
每个开发人员都需要了解的一个SQL技巧
brotherlamp
linux linux视频 linux教程 linux自学 linux资料
对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。
使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。下面是实现方式:
CREATE TABLE books (
id &
Quartz——CronTrigger触发器
eksliang
quartz CronTrigger
转载请出自出处:http://eksliang.iteye.com/blog/2208295 一.概述
CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。 二.Cron表达式介绍 1)Cron表达式规则表
Quartz
Informatica基础
18289753290
Informatica Monitor manager workflow Designer
1.
1)PowerCenter Designer:设计开发环境,定义源及目标数据结构;设计转换规则,生成ETL映射。
2)Workflow Manager:合理地实现复杂的ETL工作流,基于时间,事件的作业调度
3)Workflow Monitor:监控Workflow和Session运行情况,生成日志和报告
4)Repository Manager:
linux下为程序创建启动和关闭的的sh文件,scrapyd为例
酷的飞上天空
scrapy
对于一些未提供service管理的程序 每次启动和关闭都要加上全部路径,想到可以做一个简单的启动和关闭控制的文件
下面以scrapy启动server为例,文件名为run.sh:
#端口号,根据此端口号确定PID
PORT=6800
#启动命令所在目录
HOME='/home/jmscra/scrapy/'
#查询出监听了PORT端口
人--自私与无私
永夜-极光
今天上毛概课,老师提出一个问题--人是自私的还是无私的,根源是什么?
从客观的角度来看,人有自私的行为,也有无私的
Ubuntu安装NS-3 环境脚本
随便小屋
ubuntu
将附件下载下来之后解压,将解压后的文件ns3environment.sh复制到下载目录下(其实放在哪里都可以,就是为了和我下面的命令相统一)。输入命令:
sudo ./ns3environment.sh >>result
这样系统就自动安装ns3的环境,运行的结果在result文件中,如果提示
com
创业的简单感受
aijuans
创业的简单感受
2009年11月9日我进入a公司实习,2012年4月26日,我离开a公司,开始自己的创业之旅。
今天是2012年5月30日,我忽然很想谈谈自己创业一个月的感受。
当初离开边锋时,我就对自己说:“自己选择的路,就是跪着也要把他走完”,我也做好了心理准备,准备迎接一次次的困难。我这次走出来,不管成败
如何经营自己的独立人脉
aoyouzi
如何经营自己的独立人脉
独立人脉不是父母、亲戚的人脉,而是自己主动投入构造的人脉圈。“放长线,钓大鱼”,先行投入才能产生后续产出。 现在几乎做所有的事情都需要人脉。以银行柜员为例,需要拉储户,而其本质就是社会人脉,就是社交!很多人都说,人脉我不行,因为我爸不行、我妈不行、我姨不行、我舅不行……我谁谁谁都不行,怎么能建立人脉?我这里说的人脉,是你的独立人脉。 以一个普通的银行柜员
JSP基础
百合不是茶
jsp 注释 隐式对象
1,JSP语句的声明
<%! 声明 %> 声明:这个就是提供java代码声明变量、方法等的场所。
表达式 <%= 表达式 %> 这个相当于赋值,可以在页面上显示表达式的结果,
程序代码段/小型指令 <% 程序代码片段 %>
2,JSP的注释
<!-- -->
web.xml之session-config、mime-mapping
bijian1013
java web.xml servlet session-config mime-mapping
session-config
1.定义:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
2.作用:用于定义整个WEB站点session的有效期限,单位是分钟。
mime-mapping
1.定义:
<mime-m
互联网开放平台(1)
Bill_chen
互联网 qq 新浪微博 百度 腾讯
现在各互联网公司都推出了自己的开放平台供用户创造自己的应用,互联网的开放技术欣欣向荣,自己总结如下:
1.淘宝开放平台(TOP)
网址:http://open.taobao.com/
依赖淘宝强大的电子商务数据,将淘宝内部业务数据作为API开放出去,同时将外部ISV的应用引入进来。
目前TOP的三条主线:
TOP访问网站:open.taobao.com
ISV后台:my.open.ta
【MongoDB学习笔记九】MongoDB索引
bit1129
mongodb
索引
可以在任意列上建立索引
索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的索引优化技巧也适用于Mongodb
使用索引可以加快查询,但同时会降低修改,插入等的性能
内嵌文档照样可以建立使用索引
测试数据
var p1 = {
"name":"Jack",
"age&q
JDBC常用API之外的总结
白糖_
jdbc
做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。
ResultSetMetaData获取ResultSet对象的元数据信息
apache VelocityEngine使用记录
bozch
VelocityEngine
VelocityEngine是一个模板引擎,能够基于模板生成指定的文件代码。
使用方法如下:
VelocityEngine engine = new VelocityEngine();// 定义模板引擎
Properties properties = new Properties();// 模板引擎属
编程之美-快速找出故障机器
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
public class TheLostID {
/*编程之美
假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。
1.假设在某个时间得到一个数据文件ID的列表,是
关于Java中redirect与forward的区别
chenbowen00
java servlet
在Servlet中两种实现:
forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response);
redirect方式:response.sendRedirect(“/somePage.jsp”);
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知
[信号与系统]人体最关键的两个信号节点
comsci
系统
如果把人体看做是一个带生物磁场的导体,那么这个导体有两个很重要的节点,第一个在头部,中医的名称叫做 百汇穴, 另外一个节点在腰部,中医的名称叫做 命门
如果要保护自己的脑部磁场不受到外界有害信号的攻击,最简单的
oracle 存储过程执行权限
daizj
oracle 存储过程 权限 执行者 调用者
在数据库系统中存储过程是必不可少的利器,存储过程是预先编译好的为实现一个复杂功能的一段Sql语句集合。它的优点我就不多说了,说一下我碰到的问题吧。我在项目开发的过程中需要用存储过程来实现一个功能,其中涉及到判断一张表是否已经建立,没有建立就由存储过程来建立这张表。
CREATE OR REPLACE PROCEDURE TestProc
IS
fla
为mysql数据库建立索引
dengkane
mysql 性能 索引
前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。 最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。
学习C语言常见误区 如何看懂一个程序 如何掌握一个程序以及几个小题目示例
dcj3sjt126com
c 算法
如果看懂一个程序,分三步
1、流程
2、每个语句的功能
3、试数
如何学习一些小算法的程序
尝试自己去编程解决它,大部分人都自己无法解决
如果解决不了就看答案
关键是把答案看懂,这个是要花很大的精力,也是我们学习的重点
看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义
照着答案去敲
调试错误
centos6.3安装php5.4报错
dcj3sjt126com
centos6
报错内容如下:
Resolving Dependencies
--> Running transaction check
---> Package php54w.x86_64 0:5.4.38-1.w6 will be installed
--> Processing Dependency: php54w-common(x86-64) = 5.4.38-1.w6 for
JSONP请求
flyer0126
jsonp
使用jsonp不能发起POST请求。
It is not possible to make a JSONP POST request.
JSONP works by creating a <script> tag that executes Javascript from a different domain; it is not pos
Spring Security(03)——核心类简介
234390216
Authentication
核心类简介
目录
1.1 Authentication
1.2 SecurityContextHolder
1.3 AuthenticationManager和AuthenticationProvider
1.3.1 &nb
在CentOS上部署JAVA服务
java--hhf
java jdk centos Java服务
本文将介绍如何在CentOS上运行Java Web服务,其中将包括如何搭建JAVA运行环境、如何开启端口号、如何使得服务在命令执行窗口关闭后依旧运行
第一步:卸载旧Linux自带的JDK
①查看本机JDK版本
java -version
结果如下
java version "1.6.0"
oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]
ldzyz007
oracle mysql SQL Server
oracle &n
记Protocol Oriented Programming in Swift of WWDC 2015
ningandjin
protocol WWDC 2015 Swift2.0
其实最先朋友让我就这个题目写篇文章的时候,我是拒绝的,因为觉得苹果就是在炒冷饭, 把已经流行了数十年的OOP中的“面向接口编程”还拿来讲,看完整个Session之后呢,虽然还是觉得在炒冷饭,但是毕竟还是加了蛋的,有些东西还是值得说说的。
通常谈到面向接口编程,其主要作用是把系统设计和具体实现分离开,让系统的每个部分都可以在不影响别的部分的情况下,改变自身的具体实现。接口的设计就反映了系统
搭建 CentOS 6 服务器(15) - Keepalived、HAProxy、LVS
rensanning
keepalived
(一)Keepalived
(1)安装
# cd /usr/local/src
# wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz
# tar zxvf keepalived-1.2.15.tar.gz
# cd keepalived-1.2.15
# ./configure
# make &a
ORACLE数据库SCN和时间的互相转换
tomcat_oracle
oracle sql
SCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字,可以理解成ORACLE数据库的时间戳,从ORACLE 10G开始,提供了函数可以实现SCN和时间进行相互转换;
用途:在进行数据库的还原和利用数据库的闪回功能时,进行SCN和时间的转换就变的非常必要了;
操作方法: 1、通过dbms_f
Spring MVC 方法注解拦截器
xp9802
spring mvc
应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域。
python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理
先看一个实例,使用@access_required拦截:
?