IO和socket编程
五一假期结束了,突然想到3周前去上班的路上看到槐花开的正好。放假也没能采些做槐花糕,到下周肯定就老了。一年就开一次的东西,比如牡丹,花期也就一周。而花开之时,玫瑰和月季无法与之相比。明日黄花蝶也愁。想起去年开车在美国最美的加州一号公路上,哼着美国乡村音乐,以最正确的方式打开着最美的风景,心里却为现在已经想不起来的一个什么理由不开心,好可惜。从来没把青春当做资本,却也不愿看看时光流走时自己的碌碌无为。
终于确定了今年要做的事情。然而就是这个也并不容易。年初签绩效的时候,老大问我一些想法,说我能力比较强,老是做项目对我的成长不好。我说没关系,成长这种事终究要靠自己的。我之所以这样说是因为自己也没想到解决办法。那么这时候说什么也只是给别人出难题而已。为难别人的事情是绝对不能做的。所以我去阿里面过两次试,一次过了P7,一次技术面试没过,就没有什么P几了。朋友们听说我去面试很吃惊,好多同事要挖我的,没感觉我要换地方啊。我的简历根本就不需要阿里的镀金,我所需要的只是把自己的实力变成真金而已。面试和换工作对我来说是两码事。面试更多的是一个过程,和现有认知的碰撞,认识自我的过程。很多工作过很多年的人都不愿去面试,换工作就找个有熟人的地方,面试只是个过场。有些人是知道自己要做什么,更多的一些人就是找个地方呆着,一辈子也就那样了。如果说面试没过是件很伤面子的事情,所以不愿尝试,那么说他们再难突破,我觉得不为过。我并不是很在乎,因为我相信我自己,知道一切都会好起来。如果有人嘲笑你的梦想或者你为梦想做的努力,不要理会他。因为当你终究超越,他和你完全不在一个档次的时候,你就不会在乎他怎么想了。而一个嘲笑别人梦想的人,从心理学来分析,他是一个自己不愿意努力还想把别人拉下水的人,这种人离他远一点好了。
第一次听到中间件这个名词是在人人的时候,那时候的中间件是基于ICE的,用C++写的。推荐几度人脉,新鲜事(feed流),antispam这些当时觉得最有技术含量的工作都包含在中间件里。但是这些东西都已经很成熟了,因为是C++写的,需要专人维护,但是维护的人平时又很闲,非常鸡肋。所以在C++的哥哥都离职之后,就用java改写了。改写之后用的是hessian协议了,就开始说RPC了,不讲ICE了。有些东西,错过了就是一辈子。因为当时是菜鸟一枚,所以到现在也没了解什么是ICE(下次同事聚会的时候可以唠一唠,mark一下)但是那时候还没有zookeeper(说的自己好像是考古文物~~),我们自己写了一个用于配置管理的,用socket作为广播站发送UDP报文给所有业务应用服务,用心跳监控数据库的健康状况给业务端发消息的。这种做法,估计也和ICE思想的移植有关。想起五四新文化运动时,胡适说:"我们这一代的白话,如同裹小了的脚放不好一样写不好白话。" 我从山中来,带着兰花草…… 额……又跑题了,拉回来。
转载请注明原文地址 http://www.cnblogs.com/xiexj/p/6793016.html 谢谢哦~~
今天的主题是IO。因为ES和Solr相比,最吸引人的一个优点是它使用了Netty框架。而Solr使用了jetty,当然用tomcat,resin这样的web容器都能跑Solr.而网络编程框架的选用直接决定了其高并发的能力。像我们目前项目中数据量限制在GB级别上,ES的PB级数据支持我们用不上,甚至在特定场景下,都无需分词,很少的索引,只做存储,以时间换空间,其实Solr如果解决了IO读写性能瓶颈的问题,更能发挥其优势。话说咱也是做过socket编程的,除了上面说的直接用socket发UDP广播来做配置管理健康检查,在离线服务里我还用http请求直接用浏览器作为客户端,指定一个端口绑定一个socketServer,用ScheduledExecutorService以固定时延用accept方法接收有没有搜索那边兄弟发过来的补发消息请求。如果有,就将socket的inputstream解析处理后写的返回结果到outputstream。虽然写代码是超级简单了,而且是阻塞请求,要不是因为是手动补发数据用的肯定有并发问题。但是足以说明咱也是知道socket编程原理的,只是…… 这个水平就暂时不考虑做自己的网络编程框架了。
IO其实和socket编程是两个概念。IO是socket编辑必须要考虑的问题之一,IO不仅在网络中有,文件系统中也要考虑。所以他们的关系是这样:
当然,其实维度要多的多,维度上的节点也多的多。我总是试图将脑子里的东西表现出来,其实说起来挺简单的。各种不同的维度都是网络编程框架要考虑的问题。netty和mina都是网络编程框架,jetty和tomcat更多被称为web容器。但是他们都主要解决和客户端通信的问题。因为socket编程更接近于底层,需要自己去解决IO的问题,自己去决定用阻塞还是非阻塞,所以常将他们连在一起说。
阻塞的IO,在我做过的socket编程里都表现的很清楚了。打开一个连接一直阻塞在那里到accept到数据处理后关闭。accept就是"我住长江头,君住长江尾"里日日思君不见君的那个苦苦期盼的人。IO是面向流的,NIO是面向缓存区的,缓冲区本质是个数组,存的是整块的数据,所以又叫面向块的。NIO的基本原理挺好理解的。它包括三个基本要素:选择器Selector,通道channel,缓冲区buffer。看过人家包山楂饼的。山楂被生产线压成山楂片之后,会到一个大盒子里面。一个生产线就是一个通道。一个盒子就是一个缓冲区。搬运工会把这些装满的盒子放到特定的负责将山楂片包成一条一条的工人那里。搬运工是选择器。包山楂片是线程来完成的。选择器接触的工序是向Selector注册通道,SelectionKey (包含属性:interest集合,ready集合,Channel,Selector,可选的附加的对象),通过Selector选择通道,唤醒,关闭。框架就是领班。搬运工对领班说我是负责搬运盒子的(向Selector注册通道), 领班就去看这个搬运工,了解他的特长(interest集合)是搬运,已经搬完上个盒子正在等着搬运下一个盒子(ready集合),要处理的是没包装的山楂片盒子(Channel),知道他的所需SelectionKey属性后,就决定让他搬一个盒子(通过Selector选择通道),于是叫他去搬运(唤醒),看到他送去给到了包山楂片的工人就放心了(关闭)。通道的数据不仅可以取出,还可以放入。放入也是搬运工一盒子一盒子放的。所以选择器也有很多选项:建立连接,就绪,读出,写入。读出和写入一个是服务器端,一个是客户端。都是通过通道来通信。告诉你们一个秘密,小姨家的山楂树都无肥无农药,直接对外出口,但是山楂的压碎过程都是脱了鞋袜用脚踩的。知道之后再也没吃过山楂片。
看,山楂的工作流和NIO是一样的。情商高的郭靖最终能打过智商高的杨康。对别人的用心和关心最终会转化为自己的智慧。而爱一个人要比被爱更幸福。看着一个背景会觉得很像心里的那个人,而“真的是你”多少次依然惊喜。明明是算好了人家几点经过,而见到的时候“好巧啊”依然是那么真心。渐渐的,心里的那个人会变成自己的一部分。发现自己和那个人一样聪明,一样善良。因为爱竟然是那么神奇的东西,它可以打开一个通道,可以知道自己喜欢的人在想什么,会在她需要的时候出现。心灵感应竟然是真的。
IO和socket编程的更多相关文章
- Java 中的 IO 与 socket 编程 [ 复习 ]
一.Unix IO 与 IPC Unix IO:Open-Read or Write-Close IPC:open socket - receive and send to socket - clos ...
- 从 Socket 编程谈谈 IO 模型(三)
快过年啦,估计很多朋友已在摸鱼的路上.而我为了兄弟们年后的追逐,却在苦苦寻觅.规划,导致文章更新晚了些,各位猿粉谅解. 上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让 BIO.NIO 编程过程 ...
- 02--Java Socket编程--IO方式
一.基础知识 1. TCP状态转换知识,可参考: http://www.cnblogs.com/qlee/archive/2011/07/12/2104089.html 2. 数据传输 3. TCP/ ...
- IO之Socket网络编程
一.Socket Socket不是Java中独有的概念,而是一个语言无关标准.任何可以实现网络编程的编程语言都有Socket. 1,Socket概念 网络上的两个程序通过一个双向的通信连接实现数据的交 ...
- Socket 编程IO Multiplexing
Linux Socket 编程中I/O Multiplexing 主要通过三个函数来实现:select, poll,epoll来实现.I/O Multiplexing,先构造一张有关描述符的列表,然 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- socket编程-java
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- socket编程基础
socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...
- Linux Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
随机推荐
- 在VM中给Linux安装Tool
1.导入tool 2.解压tool 3.打开终端,进入tool的目录,输入 ./XXXXXXX.pl 4.进入安装界面,不断回车即可
- String及其常用API
String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...
- 简学Python第六章__class面向对象编程与异常处理
Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...
- 【CNMP系列】VIM编辑器详解
缘起 大学的时候做过Linux内核驱动程序研发,之前写C语言就是用的Vim编辑器,当年的Vim还不如今天之强大,当时的插件也没有现在这么多,只是觉得这个编辑器能满足我想要的所有,查看Linux内核代码 ...
- Python 爬取qqmusic音乐url并批量下载
qqmusic上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫. 至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在ur ...
- js中关于string的一些常用的方法
最近总结了一些关于string中的常用方法, 其中大部分的方法来自于<JavaScript框架设计>这本书, 如果有更好的方法,或者有关于string的别的常用的方法,希望大家不吝赐教. ...
- zookeeper的安装与部署-集群
1.Zookeeper的下载与解压 通过后面的链接下载Zookeeper: Zookeeper下载在此我们下载zookeeper-3.4.5下载后解压至安装目录下,本文我们解压到目录:/ ...
- 从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类
一.关于起因 之前发过一篇博文,是关于VB6中跟踪鼠标移出事件的示例(http://www.cnblogs.com/alexywt/p/5891827.html) 随着业务状况的不断发展,提出了更多的 ...
- nginx 配置禁用ip地址访问
做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描.拉取.注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables . Nginx 的deny指令或者是程序来ban掉这些 ...
- 手机交互应用服务(状态栏提示信息Notifications)
官方的一个简单的例子: NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon ...