in域名注册,如何使用Socket在客户端实现长连接?
长连接貌似是一个很高深莫测的知识,但是只要你做直播、IM、游戏、弹幕里面的任何一种,或者是你的app想要实时的接收某些消息,你就会要接触到长连接技术。本文主要教你如何在客户端如何使用Socket实现长连接。
Socket背景知识
要做长连接的话,是不能用http协议来做的,因为http协议已经是应用层协议了,并且http协议是无状态的,而我们要做长连接,肯定是需要在应用层封装自己的业务,所以就需要基于TCP协议来做,而基于TCP协议的话,就要用到Socket了。
Socket是java针对tcp层通信封装的一套网络方案
TCP协议我们知道,是基于ip(或者域名)和端口对指定机器进行的点对点访问,他的连接成功有两个条件,就是对方ip可以到达和端口是开放的
Socket能帮完成TCP三次握手,而应用层的头部信息需要自己去解析,也就是说,自己要制定好协议,并且要去解析byte
http也有长连接。在http1.0的时候,使用的是短连接,也就是说,每次请求一次数据,都要重新建立连接。但是从http1.1之后,我们看到头部会有一个
Connection:keep-alive
这个表示tcp连接建立之后不会马上销毁,而是保存一段时间,在这段时间内如果需要请求改网站的其他数据,都是使用这个连接来完成传输的。
Socket使用方式
Socket看上去不是很好用,因为他是基于java.io来实现的,你要直接跟InputStream和OutputStream打交道,也就是直接跟byte[]打交道,所以用起来并不是这么友好。
下面通过一个简单的例子,往一台服务器发\01 \00 \00 \00 \00这一串字节,服务器也返回相同的字节流,上代码:
@Test
public void testSocket() throws Exception {
logger.debug("start");
Socket socket = new Socket();
socket.connect(address);
byte[] output = new byte[]{(byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0};
socket.getOutputStream().write(output);
byte[] input = new byte[64];
int readByte = socket.getInputStream().read(input);
logger.debug("readByte " + readByte);
for (int i = 0; i < readByte; i++) {
logger.debug("read [" + i + "]:" + input[i]);
}
socket.close();
}
输出:
11:40:40.326 [main] DEBUG com.roy.test.SocketTest - start
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - readByte 5
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - read 1
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - read 0
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - read 0
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - read 0
11:40:40.345 [main] DEBUG com.roy.test.SocketTest - read 0
看出来写起来还是比较麻烦的,主要就是InputStream, OutputStream 和byte[]使用起来太不方便了。
SocketChannel blocking
Socket为了优化自己的封装和并发性能,推出了nio包下面的SocketChannel,这个相比于Socket的好处就是并发性能的提高和封装的优化了。
SocketChannel有两种方式——阻塞和非阻塞的,阻塞的用法和Socket差不多,都是在read和write的时候会阻塞线程,下面用一段代码来实现相同的功能。
@Test
public void testSocketChannelBlock() throws Exception {
final SocketChannel channel = SocketChannel.open(address);
ByteBuffer output = ByteBuffer.allocate(5);
output.put((byte) 1);
output.putInt(0);
output.flip();
channel.write(output);
logger.debug("write complete, start read");
ByteBuffer input = ByteBuffer.allocate(5);
int readByte = channel.read(input);
logger.debug("readByte " + readByte);
input.flip();
if (readByte == -1) {
logger.debug("readByte == -1, return!");
return;
}
for (int i = 0; i < readByte; i++) {
logger.debug("read [" + i + "]:" + input.get());
}
}
log 输出:
23:24:34.684 [main] DEBUG com.dz.test.SocketTest - write complete, start read
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - readByte 5
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - read [0]:1
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - read [1]:0
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - read [2]:0
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - read [3]:0
23:24:34.901 [main] DEBUG com.dz.test.SocketTest - read [4]:0
从上面的。封装优化主要体现在ByteBuffer,IntBuffer这一系列类的封装——因为是网络相关的,所以这里用到的主要是ByteBuffer。
ByteBuffer和byte[]最大的区别,就是ByteBuffer可以很方便的读取int, long等数据类型,他提供了getInt(), getInt(int offset)这样的方法,这种方法主要用在识别头部数据部分,因为头部数据一般都是由多种数据类型组成,比方说表示数据格式的contentType:String,表示长度的length:int等等,这些就是getInt()这样的方法主要的应用场景,而byte[]如果要取int,String相对来说就要复杂一些了,这是java.nio相比于java.io优势的一点。
这里需要说明一个比较坑的点,就是ByteBuffer.flip()这个方法,这个方法的作用主要是重置索引,在write()之前和read()之后调用,否则会因为索引不对,导致你的数据写不进去,读不出来。
ByteBuffer是一个功能强大的类,因为本文主要是讲Socket和SocketChannel,所以在这里就不做过多描述。具体ByteBuffer的详细介绍,可以参考:Java NIO系列教程(三) Buffer
而nio相比于io最大的优势还是在于并发性能,因为nio里面的n代表的就是non-blocking的意思,上面那个读取数据的代码也相对老旧,一般我们如果要用SocketChannel,都是用non-blocking的方式来实现的,而如果要用non-blocking模式,首先要介绍的就是Selector。
Selector
我们知道,传统io是阻塞的,也就是说,一个线程只能处理一个io流,也就是一个Socket。有了Selector之后,一个线程就能处理多个SocketChannel。
Selector的原
internet中的域名呈什么结构?
Internet的域名系统采用层次树状结构的命名方法。按照这种命名方法,网络上的任何一台主机或路由器都有一个惟一的层次结构的名字,即域名。域名的结构一般是:
·...三级域名.二级域名.顶级域名
其中顶级域名代表建立该网络的部门、机构或者该网络所在的地区、 国家等。
Internet域名系统,是由Internet上的域名注册机构来管理的他们负责管理向组织和国家开放的顶级域名。
假借区块链之名的骗局有哪些?
谢邀哦!
今天接地气小鹿继续来说案例哦。
说起坑爹的区块链项目,大家觉得会是怎样的呢?比如说空气币,资金盘,合约带单等等等,套路何其多,估计圈内的小伙伴们个个都被磨练出火眼金睛了对吧,一看不对劲,总能找到些套路的痕迹。
所以,这年头圈内的老鸟们越来越来越不好忽悠了,怎么办,于是有些人就想起了套路圈外人咯。所谓的圈外人其实就是那些对区块链技术并不了解,只是耳闻过传说中很高大上的区块链项目,而这一波人也很容被当做小韭菜给割了。于是最后的结果就是,区块链的路人缘就这么被败光光了。现在许多圈外人谈币色变,总觉得一涉及区块链,那么就是比特币,一谈到比特币,就跟骗子关联起来。话说这真的让小鹿还心痛,这么有着大好前景的技术,就这么被一些老鼠屎给黑了,小鹿真的不能忍。而这也是小鹿想坚持科普,坚持宣传防骗的原因。而且小鹿也希望可以尽可能用最接地气的方式,来让更多人了解区块链,并懂得更多区块链骗局的套路。
只求链圈无骗,大家可以安心投资开发,便是岁月静好,春暖花开。
好啦,上面是小鹿的一些个人小感慨,我们现在就进入正题吧。刚刚小鹿说了,有些套路打着区块链的旗号,确实玩骗子的套路,对不对。而且这类套路专骗圈外人。就比如说,前一段时间,如果不是个大财经板块爆出了“BCHC”骗局,那么圈内有多少人知道这个据说还上过BitTok交易所,号称“很快将会赶超比特币”的“市直排名前五”的币种呢?反正小鹿是没听过,小鹿身边的币友也没听过。然而这款大部分币友都没听过的币种,据说在圈外居然非常的火?
这是怎么回事?发币居然不找圈内人,这不禁让人觉得很可疑有木有。连小鹿都觉得这里面 一定大大的有猫腻。然而就是这种圈外币,居然还在印尼开起了千人峰会。但是,这边开在热热闹闹开着峰会,那边自家老窝就被人给端了。蜂巢财经直接吧BCHC的老底给揭了个底朝天。嘿嘿,我们就来看看它到底怎么圈钱的吧。
虽说人家BCHC也是发币,而且人家的币还上了交易所的。Emmmmm,不过我们就来说说这个被BCHC这个猪队友带累的BitTok交易所吧。据说这个交易所只支持三种币,分别是BTC,ETH还有就是BCHC了。但是除了BCHC外,其他两种币种的日交易量少的可怜基本都只有个位数,看着就像是个打掩护的幌子,因为跟日交易量可以达到数十万的BCHC形成鲜明的反差!所以,这么反常又诡异的交易所最后自然也被扒了,然而结果是这个所谓的交易所居然是个内侧的APP,什么鬼!
好吧,既然BCHC挂的交易所是个坑,那我们再来看看BCHC所谓的挖矿又是怎么回事。相信只要稍稍了解区块链的同学都懂,在区块链网络中的挖矿是通过算力来公平竞争记账权,而获得工作量奖励的过程。但是神奇的BCHC可不走寻常路,毕竟人家不圈圈内人,当然就不用按照圈内的规矩来啊。所以,人家的挖矿就是将挖矿码买到几万块钱,你入手就送BCHC。Emmmm,这套路怎么四成相似呢,这不就是网游里买系列号送币的套路么?神马时候挖矿变玩网游了,估计多少币友已经笑晕在电脑前了吧。难怪BCHC不圈币友,非是不愿,而是不敢啊。就这套路,稍稍懂区块链的同学一眼就能把他戳穿有没有。
其实从上面就可以看到这个所谓的BCHC很坑爹了,不过小鹿还要来进一步的印证一下。还记得小鹿曾经在如何识别坑爹区块链项目的文章里提到过,很多套路项目都是无法自由交易的。所谓无法自由交易,就是在你如要入手出手货币,或者提现的时候会有各类限制,而BCHC也是如此。打个比方,当你入手BCHC结果发现大涨之后,很多人就想赶紧抛售了对不对,这时候网站就会设置各种出手和抛售限制,让你无法如愿完成提现。如果存在这种情况,小鹿建议你也要多留个心眼咯。
好啦,其实这么零零总总的说下来,其实大家也都能看出这个项目确实存在非常多的问题。无奈它收割的却是许多连什么是区块链都不懂的圈外人这就让人很纠结了。这种做法不单单伤天害理,还把区块链和比特币的名声都连带搞臭了,但是小鹿也只能尽可能的多做科普,让更多的人来了解区块链,了解更多借用区块链项目圈钱的套路了。
最后,小鹿还是那句话哦,玩币有风险,投资需谨慎。如果发现身边有人玩连圈内人都搞不懂的所谓区块链项目,小鹿觉得还是有比较帮他们了解下项目背景哦,以防更多人上当。
如果还有什么问题不明白,欢迎留言或者私信来撩小鹿哦,小鹿会一一解答的。
制作网站需要什么软件?
自助网站制作在近几年已经非常流行,个人可以自己制作网站来建立博客,吸引粉丝;企业可以建立网站来展示形象,增加订单。挑选自助建站平台的时候,可以参考以下几个维度:
1.建站方式
有的建站系统是开源的,可以让你自己写代码编辑,这种可以让你做出个性化的功能,但是难度较高,并不适合小白。还有一种是模板类建站系统,开发商做好现成的网站模板,你只需选个模板再修改下文字、图片、添加自己需要的功能版块(或插件)就好。
总的来说,后一种目前比价常见,也更适合新手,所以如果你是个不懂技术的小白,那么尽量还是用模板类建站系统,比如「上线了」就是如此,新手直接套用模板就能快速生成一个网站。
2.成本
新手要尽量找性价比高的建站软件,避免吃亏。那么网站制作需要多少钱呢?其实建站软件其实没有统一的价格标准,你需要的功能和网站空间越多,那么价格越高;需要的功能和网站空间越少,那么价格越低。不过总体来说,价格都在免费、几百到小几千之间。如果超过这个区间,那你可能就吃亏了。
3.便捷程度
网站做好后,大部分建站者都会有修改的需求,如果网站修改太麻烦,浪费很多时间,那就不值得选择。大家要尽量找方便快捷的建站软件,比如「上线了」,除了PC端可以建站外,还可以用网站制作app,下载它的APP就能通过手机网站制作快速编辑网站,非常方便。
4.能否助力引流
建立一个网站,引流、吸引粉丝是很重要的目的,因此网站质量不能太低。这就需要用模板设计感强、基础功能丰富的建站软件,比如「上线了」,模板简洁现代风,符合当下审美潮流,能让网站有个很好的展示效果;同时各种功能也丰富,除了商城、博客、相册、产品展示、留言表单……等基础功能,你还可以利用“多语言网站”,打造多个语言的不同网站来为自己引流,这样曝光量和获取的流量肯定要比只有一个中文网站多。你的网站也能美观且高大上起来。
以上,希望对你有帮助。
dns分为哪两大类?
1.主域服务器
每个DNS域必须包含一台主域服务器。主域服务器包含有关此域中所有主机名及其IP地址和区域的信息。
主域服务器可以使用本地信息响应客户端的查询。此外,为了获取所需的信息,经常需要询问其他域名服务器,主域服务器上的信息存储在资源记录中。
二、辅助城市服务器
为了提供信息冗馀,每个域至少有一个辅助域名服务器。每个子域名服务器都包含区域数据网络的副本。子网域名服务器像主域服务器一样提供有关区域的信息。
为了响应用户的请求,辅助域名服务器通常需要询问其他服务器以获取所需的信息。与主域服务器一样,辅助域名服务器具有缓存,用于保存从其他服务器获取的信息。
三、Caching only域名服务器
Cachinonly服务器不提供有关该区的任何信息,在用户询问该区时,它仅发送到另一个域名服务器以获得响应,在客户询问同一查询时,它将该响应存储在自己的缓存中一段时间,而无需将该响应转发到另一个域名服务器。Caching only domain name server通常是为了减少DNS的传输量而构建的。