eb

阅读 / 问答 / 标签

Placebo的《Meds》 歌词

歌曲名:Meds歌手:Placebo专辑:Placebo: We Come in Pieces能把pop推向无底的深渊的力量rock"n"rollI was alone, Falling free,Trying my best not to forgetWhat happened to us,What happened to me,What happened as I let it slip.I was confused by the powers that be,Forgetting names and faces.Passersby were looking at meAs if they could erase itBaby did you forget to take your meds?Baby did you forget to take your meds?I was alone,Staring over the ledge,Trying my best not to forgetAll manner of joyAll manner of gleeAnd our one heroic pledgeHow it mattered to us,How it mattered to me,And the consequencesI was confused,By the birds and the beesForgetting if I meant itBaby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?And the Sex and the drugs and the complicationsAnd the Sex and the drugs and the complicationsAnd the Sex and the drugs and the complicationsAnd the Sex and the drugs and the complicationsBaby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?Baby did you forget to take your meds?I was alone,Falling free,Trying my best not to forgethttp://music.baidu.com/song/52777169

Placebo的《Special K》 歌词

歌曲名:Special K歌手:Placebo专辑:Special KPlacebo - Special KComing up beyond beliefOn this coronary thiefMore than just a leitmotifMore chaotic, no reliefI"ll describe the way I feelWeeping wounds that never healCan the savior be for realOr are you just my seventh seal?No hesitation, no delayYou come on just like special KJust like I swallowed half my stashI never ever want to crashNo hesitation, no delayYou come on just like special KNow you"re back with dope demandI"m on sinking sandGravityNo escaping gravityGravityNo escaping... not for freeI fall down... hit the groundMake a heavy soundEvery time you seem to come aroundI"ll describe the way I feelYou"re my new Achilles heelCan this savior be for realOr are you just my seventh seal?No hesitation, no delayYou come on just like special KJust like I swallowed half my stashI never ever want to crashNo hesitation, no delayYou come on just like special KNow you"re back with dope demandI"m on sinking sandGravityNo escaping gravityGravityNo escaping... not for freeI fall down... hit the groundMake a heavy soundEvery time you seem to come aroundNo escaping gravityNo escaping gravityNo escaping gravityNo escaping gravityGravityGravityGravityhttp://music.baidu.com/song/2717890

请介绍一下英国的placebo乐队(百忧解)

Placebo一支中性色彩浓厚的乐队,1994年组建于伦敦.国外有人说他们是GLAM化的Nirvana,也就是说,他们在音乐上和NIRVANA很相似,而形象上就比较女里女气一点. 乐队的创建者是主唱兼吉他手Brian Molko(美国和苏格兰的混血)和瑞典人贝司手Stefan Olsdal.乐队组建之初曾取名为Ashtray Heart,并受到80年代独立大牌Sonic Youth乐队的巨大影响. 96年,乐队的单曲Nancy Boy成为超级热门歌曲,并一直传唱至今.这首歌也使Placebo成为Brit-Pop运动中的巨大收益者之一. 之后他们的故事就全是出专集,巡演和搂钱了.所以列一下专集列表也差不多就够了. 专集列表 Placebo (1996) Without You I"m Nothing (1998) Black Market Music (2000) Sleeping With Ghosts (2003) Once More With Feeling - Singles 1996-2004 (2004

double-blind, placebo-controlled

身体瘦弱的人可以通过加强锻炼来帮助改善自己的是不是状况,有部分的人也可以通过服用增肌粉来帮助增肥,服用增肌粉最好是在一定强度锻炼后再食用增肌粉,锻炼前后30分钟,这时是营养补充的最佳时机。每次食用增肌粉不宜过多,过多的食用不一定能很好的吸收,反而还会带来不好的效果

Placebo的《Daddy Cool》 歌词

歌曲名:Daddy Cool歌手:Placebo专辑:CoversDaddy CoolPlaceboCovers"Daddy Cool"by poppyranShe"s crazy like a foolWhat about it Daddy CoolI"m crazy like a foolWhat about it Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolShe"s crazy like a foolWhat about it Daddy CoolI"m crazy like a foolWhat about it Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy Cool(spoken) She"s crazy about her daddyOh she believes in himShe loves her daddyShe"s crazy like a foolWhat about it Daddy CoolI"m crazy like a foolWhat about it Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy CoolDaddy, Daddy Coolhttp://music.baidu.com/song/3469399

placebo respimat 是什么意思

Respimat 是一种用于慢性阻塞性肺疾病, 包括慢性支气管炎的新颖喷雾吸入器。Placebo 的意思是 安慰剂,也就是说这是一种无实际疗效的安慰剂喷雾吸入器。

Placebo的《I Feel You》 歌词

歌曲名:I Feel You歌手:Placebo专辑:CoversQueensberry - I Feel YouI tried so hard to get over itI tried so hard but I coulden"t quietI tried both this and thatbut this and that won"t get your backOh-oh-oh-ohI never thought I could let you gobut it"s time that I let you knowI"m not the supid kindyou showed me all the signsI clearly was too blindBut deep insideI can feel what you feelwhat you need is somerthing realI feel you,I feel youI can feel what you feellet me give you something realI feel you,I feel youI"ve got nothing left to hideLove means swallowing my prideI feel you,I feel youit"s a chemical insideI said it"s over but I liedI feel you,I feel youI know it"s wrong but I"ll take a riskwhat"s on my mind? Cann you take a guess?You wanted a virgin blessedthen me undressedWell,what comes next?Oh-oh-oh-ohI never thought I could let you gobut it"s time that I let you knowI"m not the sipid kindyou showed me all the signsI clearly was too blindBut deep insideI can feel what you feelwhat you need is somerthing realI feel you,I feel youI can feel what you feellet me give you something realI feel you,I feel youI"ve got nothing left to hideLove means swallowing my prideI feel you,I feel youit"s a chemical insideI said it"s over but I liedI feel you,I feel youI know I`m playing with firebut that won`t hold me backI know I`m playing with firebut that won`t hold me backI know I`m playing with firebut that won`t hold me backI can feelwhat you feelwhat you need is something realI feel you I feel youI can feelwhat you feellet me give you something realI feel you I feel youI`ve got nothing left to hidelove means swalloing my prideI feel you I feel youIt`s a chemical insideI said it`s over but I liedI feel you I feel youI know I`m playing with firebut that won`t hold me back(won`t hold me back)http://music.baidu.com/song/3469398

placebo effect名词解释

placebo effect 安慰剂效应安慰剂效应 [ān wèi jì xiào yìng]安慰剂效应,指病人虽然获得无效的治疗,但却“预料”或“相信”治疗有效,而让病患症状得到舒缓的现象。又名伪药效应、假药效应、代设剂效应(英文:Placebo Effect,源自拉丁文placebo解“我将安慰”)安慰剂效应于1955年由毕阙博士提出,亦理解为“非特定效应”(non-specific effects)或受试者期望效应。

Placebo好听的歌曲

去豆瓣找专辑听

Placebo的《the crawl》 歌词

歌曲名:the crawl歌手:Placebo专辑:without you i m nothingPlacebo - The CrawlIt takes the pain awaythat could not make you stayit"s way to broke to fixno glue, no bag of tricksLay me down, the lie will unfurllay me down to crawl.Your smile would make me sneezewhen we were SiameseAmazing grace in hereI"d pay to have you near.Lay me down, the lie will unfurllay me down to crawl.Don"t go and lose your faceat some stranger"s placeand don"t forget to breatheand pay before you leaveLay me down, the lie will unfurllay me down to crawl.Lay me down, the lie will unfurllay me down to crawl.http://music.baidu.com/song/667655

Placebo的《i know》 歌词

歌曲名:i know歌手:Placebo专辑:PlaceboI know, you love the song but not the singerI know, you"ve got me wrapped around your fingerI know, you want the sin without the sinnerI knowI knowI know, the past will catch you up as you run fasterI know, the last in line is always called a bastardI know, the past will catch you up as you run fasterI knowI knowI know, you cut me loose in contradictionI know, I"m all wrapped up in sweet attritionI know, it"s asking for your benedictionI knowI knowI know, the past will catch you up as you run fasterI know, the last in line is always called a bastardI know, the past will catch you up as you run fasterI knowI knowI know, the past will catch you up as you run fasterI know, the last in line is always called a bastardI know, the past will catch you up as you run fasterI knowI know.Placebo是英国1994年组建的一支摇滚乐队。Placebo 中文译名为“安慰剂”,乐队的名字 Placebo 取自拉丁语,含义是“我愿意”(唱赞美诗前所说的第一个词)。是一个三人乐团,主唱兼吉他手Brian Molko,鼓手Steve Forrest,以及Stefan Olsdal(贝司、吉他和键盘)。组队国籍:英国组建时间:1994风格类型Industrial(工业摇滚)Alternative Pop/Rock(另类流行/摇滚)Britpop(英伦摇滚)Neo-Glam(Neo-Glam)Punk Revival(复兴朋克)Punk-Pop(流行朋克)

关于PLACEBO乐队!!在线等!

Brian Molko Placebo的vocal与guitarist。生于1972年12月十日,双亲分别为苏格兰人及美国人.在他的孩提时代,由于父亲的工作上的缘故(国际银行家)所以一直没有固定的住所,从赖比瑞亚,黎巴嫩到卢森堡,都是他曾经住过的地方。 在卢森堡时,Brian被送到一间私立的美国学校.和其它学生不同的是,比起运动,他更醉心于戏剧.当时Stevan也是同一间学校的学生,但两人实际上却没有交谈过.并且在学校的众多人群中,Stefen是个很会运动的学生,Brian相形之下逊色了不少.在17岁的那一年,Brian到伦敦修读戏剧.当时他的父亲希望它能够跟随父亲的脚步,成为一名银行家.幸运的是,他比较想要在摇滚乐上有所成就. 此外,相较于他的音乐,媒体似乎把更多的焦点放在Brian枕边人的真面目,对于他的形象及[性向]的推测也越来越多.但毫无怀疑的,像先前的DAVID BOWIE一般,Brian早已经成为音乐舞台上最令人关注的角色之一了

求Placebo---My Sweet Prince的歌词的中文意思。

安慰剂——我亲爱的王子

Placebo的音乐属于什么音乐

PLACEBO独特的GLAM-ROCK风格

有谁知道placebo?

英国乐队~96年出道出过四张专集~(据官网介绍明年初会出新专集)主唱brain molko,很漂亮的男人!音乐走punk rock路线,也被认为是七十年代glamrock的继承人.欲知详情可以到这里:http://brianmolko.nease.net/这是一个非官方的brian的中文fansclub,也可以到这里:http://www.placeboworld.co.uk/他们的官方网站~前阵子市面上有他们的mtv以及巴黎演唱会卖~有兴趣可以买来看看~~很不错哦~~是我近来很喜欢的乐队~

Placebo是什么风格?

早期以华丽摇滚为主,后来加进朋克,这几年又开始加一些电子。

你是怎样看待Placebo?

以前的时候听了一阶段药团,渐渐不听;现在大二又拾起来,突然一下子特别特别特别喜欢,把所有专辑和live都翻了一遍,下了六十首就在这里面反反复复听。开始不习惯Brian的嗓音,大概声音略尖锐也是很多人弃了的原因吧…但是听多了就上瘾,听他唱什么都觉得好听。虽然这么说略俗,可是觉得他的声音真的有一股绝望的力量。其实Brian低音也特别迷人,长得也真的很美啊。还有就是,cebo似乎几乎每首歌都会有一个戳到我的点,一段吉他,一句歌词,一段鼓,一个音也好。然后就为此着迷。自己能找到一个如此对味的乐队还挺幸运的。补充一点,有人觉得快歌每首都一样,可是对我来说,每首都不一样啊。特点很鲜明。

placebo是什么意思,无效对照剂翻译

翻译如下placebon.安慰剂;宽心话;为死者所诵的晚祷词;(试验药物用的)无效对照剂例句Theplaceboeffectcanbeunderstoodonlyifweacknowledgetheunityofmindandbody.只有我们承认身心一体,安慰剂效果才能被理解。

Placebo是什么意思

Placebo: [ plə"si:bəu ] n. 安慰剂英英解释: 名词placebo:1. an innocuous or inert medication; given as a pacifier or to the control group in experiments on the efficacy of a drug2. (Roman Catholic Church) vespers of the office for the dead

placebo是什么意思,安慰剂,对照剂翻译

placebo 安慰剂placebo 英 [plu0259u02c8si:bu0259u028a] 美 [plu0259u02c8si:bou028a] n. 安慰剂;宽心话;为死者所诵的晚祷词;(试验药物用的)无效对照剂 词汇难度:SAT / GRE 复数: placebos 1 N-COUNT (用于测试新药效力的)无效对照剂;(用以安慰想象自己得病的人的)安慰剂 A placebo is a substance with no effects that a doctor gives to a patient instead of a drug. Placebos are used when testing new drugs or sometimes when a patient has imagined their illness.

placebo是什么意思,安慰剂,对照剂翻译

placebo安慰剂placebo英[plu0259u02c8si:bu0259u028a]美[plu0259u02c8si:bou028a]n.安慰剂;宽心话;为死者所诵的晚祷词;(试验药物用的)无效对照剂词汇难度:SAT/GRE复数:placebos1N-COUNT(用于测试新药效力的)无效对照剂;(用以安慰想象自己得病的人的)安慰剂Aplaceboisasubstancewithnoeffectsthatadoctorgivestoapatientinsteadofadrug.Placebosareusedwhentestingnewdrugsorsometimeswhenapatienthasimaginedtheirillness.

求葡萄酒基本信息:Yvorne,chateau de rayne-vigneau,richebourg,taittinger"prelude“,tardo santo thoma

楼主,我还算是个对葡萄酒有一点了解的人,但你写的东西,我不知所云。

简述WEB系统的架构原理

简述WEB系统的架构原理 这个话题太大了。 一般来说,WEB系统,主要是指后端,前端就是各种浏览器了。 那么简单来讲,只要是能与浏览器通过网路互动的系统,都可以算是WEB系统。最简洁的就是用NODEJS写一个echo,就是客户端发什么内容,就回什么内容。 而在实际应用中,WEB系统的架构,一般有这么几个部分:负载均衡、授权验证(可选)、静态内容服务、动态内容服务(业务逻辑)、资料库、运维后台。 1)负载均衡是为了改善使用者体验、充分利用伺服器资源,主要功能是将新的请求转发到不那么忙的伺服器进行处理。 2)授权验证,是在对浏览器发起的请求进行授权校验,如果不是合法的请求,就予以拒绝或者重定向至登入页面。 3)静态内容服务,是指图片、CSS等不会根据不同使用者而变化的静态内容,将其直接返回给使用者。因为不需要进行逻辑判断,效能主要取决于I/O读写,响应可以非常快。超大型网站,也会把一部分动态内容,例如对访问量大的新闻页,做静态处理,以提升响应速度。静态内容服务的典型是CDN。 4)动态内容服务,是根据使用者请求的不同,而进行响应的业务逻辑处理。比如对使用者资料的CRUD(增删查改)。这是绝大多数WEB系统的核心所在,一般会呼叫资料库和资料快取。具体实现会根据业务需要而变化,也可以变得非常复杂。 5)资料库,是资料所在,既有经典的关系型传统资料库系统,也有为了提升访问效能、减轻的记忆体资料库。 6)运维后台,是为了方便监控执行状态、升级维护系统,不直接参与对外服务。 先写这么多吧。有具体的问题了,可以再问。 简述tn系统的基本保护原理 TN系统是电源系统有一点直接接地,负载装置的外露导电部分通过保护导体连线到此接地点的系统,即采用接零措施的系统。 工作原理 在TN系统中,所有电气装置的外露可导电部分均接到保护线上,并与电源的接地点相连,这个接地点通常是配电系统的中性点。 TN系统的电力系统有一点直接接地,电气装置的外露可导电部分通过保护导体与该点连线。 TN系统通常是一个中性点接地的三相电网系统。其特点是电气装置的外露可导电部分直接与系统接地点相连,当发生碰壳短路时,短路电流即经金属导线构成闭合回路。形成金属性单相短路,从而产生足够大的短路电流,使保护装置能可靠动作,将故障切除。 如果将工作零线N重复接地,碰壳短路时,一部分电流就可能分流于重复接地点,会使保护装置不能可靠动作或拒动,使故障扩大化。 在TN系统中,也就是三相五线制中,因N线与PE线是分开敷设,并且是相互绝缘的,同时与用电装置外壳相连线的是PE线而不是N线。因此我们所关心的最主要的是PE线的电位,而不是N线的电位,所以在TN-S系统中重复接地不是对N线的重复接地。如果将PE线和N线共同接地,由于PE线与N线在重复接地处相接,重复接地点与配电变压器工作接地点之间的接线已无PE线和N线的区别,原由N线承担的中性线电流变为由N线和PE线共同承担,并有部分电流通过重复接地点分流。由于这样可以认为重复接地点前侧已不存在PE线,只有由原PE线及N线并联共同组成的PEN线,原TN-S系统所具有的优点将丧失,所以不能将PE线和N线共同接地。 由于上述原因在有关规程中明确提出,中性线(即N线)除电源中性点外,不应重复接地。 简述SPOOLing系统的基本原理 SPOOLing技术的特点: (1)提高了I/O速度.从对低速I/O装置进行的I/O操作变为对输入井或输出井的操作,如同离线操作一样,提高了I/O速度,缓和了CPU与低速I/O装置速度不匹配的矛盾. (2)装置并没有分配给任何程序.在输入井或输出井中,分配给程序的是一储存区和建立一张I/O请求表. (3)实现了虚拟装置功能.多个程序同时使用一独享装置,而对每一程序而言,都认为自己独占这一装置,不过,该装置是逻辑上的装置. 微机原理 简述你对8086系统的认识 8086 释出年份 1986 电晶体数 2.9万个, 主频4.77(MHZ) 资料汇流排宽度(16位) 外部汇流排 16位 地址汇流排20位 定址空间1M 快取记忆体 无 暂存器组 可见的 通用暂存器 专用暂存器 段暂存器 通用暂存器中 AX 累加器 BX 经常用作基址暂存器 CX 作为通用暂存器使用 DX 一般和AX组合用.DX 用来存放高位 SP 堆叠指标 BP 基址指标 DI 目的指标 SI 源变址 专用暂存器 有FLAGS标志 与资料相关的定址方式 立即定址 暂存器具 直接 暂存器间接 暂存器相对 基址变址 相对基址 比例变址 基址变址 相对基址比例变址 指令系统分为以下6组 资料传送指令串处理指令算术指令控制转移指令逻辑指令处理机控制指令 具体的指令,太多了, 好像回答不对题,算了, 简述牵引供电系统的供电原理. 牵引供电是指拖动车辆运输所需电能的供电方式。牵引供电系统是指铁路从地方引入220(110)KV电源,通过牵引变电所降压到27.5KV送至电力机车的整个供电系统。 例如城市电车,地铁等,我们主要研究的内容是电气化铁道牵引供电系统。在我们这里简称牵引供电系统。 牵引供电方式: 直接供电方式(TR) 直接供电方式较为简单,是将牵引变电所输出的电能直接供给电力机车的一种供电方式,主要装置有牵引变压器、断路器、隔离开关、所用变、电压互感器、电流互感器、母线、接地系统、交流盘、直流盘、矽整流盘、控制盘、保护盘等装置。 直供方式的优点:结构简单、投资省 缺点:由于牵引供电系统为单相负荷,该供电方式的牵引回流为钢轨,是不平衡的供电方式,对通讯线路产生感应影响大。 回路电阻大,供电距离短(十几公里) 。 BT(吸流变压器)供电方式 这种供电方式,在接触网上每隔一段距离装一台吸流变压器(变比为1:1),其原边串入接触网,次边串入回流线(简称NF线,架在接触网支柱田野侧,与接触悬挂等高),每两台吸流变压器之间有一根吸上线,将回流线与钢轨连线,其作用是将钢轨中的回流“吸上”去,经回流线返回牵引变电所,起到防干扰效果。 由于大地回流及所谓的“半段效应”,BT供电方式的防护效果并不理想,加之“吸——回”装置造成接触网结构复杂,机车受流条件恶化,近年来已很少采用。 AT(自耦变压器)供电方式 采用AT供电方式时,牵引变电所主变输出电压为55kV,经AT(自耦变压器,变比2:1)向接触网供电,一端接接触网,另一端接正馈线(简称AF线,亦架在田野侧,与接触悬挂等高),其中点抽头则与钢轨相连。AF线的作用同BT供电方式中的NF线一样,起到防干扰功能,但效果较前者为好。此外,在AF线下方还架有一条保护(PW)线,当接触网绝缘破坏时起到保护跳闸作用,同时亦兼有防干扰及防雷效果。 显然,AT供电方式接触网结构也比较复杂,田野侧挂有两组附加导线,AF线电压与接触网电压相等,PW线也有一定电位(约几百伏),增加故障机率。当接触网发生故障,尤其是断杆事故时,更是麻烦,抢修恢复困难,对运输干扰极大。但由于牵引变电所馈出电压高,所间距可增加一倍,并可适当提高末端网压,在电力系统网路比较薄弱的地区有其优越性。 直供+回流(DN)供电方式(TRNF) 带回流线的直接供电方式取消BT供电方式中的吸流变压器,保留了回流线,利用接触网与回流线之间的互感作用,使钢轨中的回流尽可能地由回流线流回牵引变电所,因而部分抵消接触网对临近通讯线路的干扰,其防干扰效果不如BT供电方式,通常在对通讯线防干扰要求不高的区段采用。这种供电方式装置简单,因此供电装置的可靠性得到了提高;由于取消了吸流变压器,只保留了回流线,因此牵引网阻抗比直供方式低一些,供电效能好一些,造价也不太高,所以这种供电方式在我国电气化铁路上得到了广泛应用。 这种供电方式实际上就是带回流线的直接供电方式,NF线每隔一定距离与钢轨相连,既起到防干扰作用,又兼有PW线特性。由于没有吸流变压器,改善了网压,接触网结构简单可靠。近年来得到广泛应用。 同轴电力电缆供电方式 同轴电力电缆供电方式是在牵引网中沿铁路埋设同轴电力电缆,其内部导体作为馈电线与接触网并联,外部导体作为回流线与钢轨并联的供电方式。 这种供电方式由于投资大,一般不采用。 简述动态web应用系统的实现原理和工作流程? webwork工作流程与原理 关键字: webwork 首先浏览器按照web.xml中指定的格式(比如:以.do结尾的请求)发起请求,servlet接收请求后从url中解析出action名称,同时遍历HttpServletRequest、HttpSession、ServletContext 中的资料,并将其复制到 Webwork的Map实现中,至此之后,所有资料操作均在此Map结构中进行,从而将内部结构与Servlet API相分离。 接着ActionProxyFactory建立对应的ActionProxy例项。ActionProxyFactory 将根据Xwork 配置档案(xwork.xml)中的设定,建立ActionProxy例项,ActionProxy中包含了Action的配置资讯(包括Action名称, 对应实现类等等)。ActionProxy建立对应的Action例项,并根据配置进行一系列的处理程式。包括执行相应的预处理程式(如通过Interceptor 将Map 中的请求资料转换为Action所需要的Java 输入资料物件等),以及对Action 执行结果进行后处理 是不是这个? 请简述动态web应用系统的实现原理和工作流程 客户端传送请求(POST/GET)-----伺服器端接受响应-----伺服器端处理请求-----返回处理结果-----客户端接受结果并处理(比如显示在网页上等) 请简述汽车电控系统的控制原理。 所谓的ESP(电子稳定程式,简称:ESP),电子稳定控制系统,旨在提高车辆的操控效能,而当汽车达到其动态范围失控的系统或程式有效地防止已知的。资讯的轮的运动,传递给电子分析系统。那么汽车四个车轮可以调整。是一种先进的技术。防止滑脱有很大帮助控制。由于ABSF 我想你指的是ABS防抱系统吧,它是一种ESP的,是防止刹车,车轮与地面打滑失控。 简述GPS导航系统的基本原理 GPS定位系统的工作原理是由地面主控站收集各监测站的观测资料和气象资讯,计算各卫星的星历表及卫星钟改正数,按规定的格式编辑导航电文,通过地面上的注入站向GPS卫星注入这些资讯。测量定位时,使用者可以利用接收机的储存星历得到各个卫星的粗略位置。根据这些资料和自身位置,由计算机选择卫星与使用者联线之间张角较大的四颗卫星作为观测物件。观测时,接收机利用码发生器生成的资讯与卫星接收的讯号进行相关处理,并根据导航电文的时间标和子帧计数测量使用者和卫星之间的伪距。将修正后的伪距及输入的初始资料及四颗卫星的观测值列出3个观测方程式,即可解出接收机的位置,并转换所需要的座标系统,以达到定位目的。 GPS定位系统又叫GPRS,简单来说GPS定位系统是靠你的车载终端中内建一张手机卡,通过手机讯号传输到后台,来实现定位,GPS终端就是这个后台,可以帮你实现一键导航、后台服务、等各种人 *** 。GPS定位系统随着社会的发展被应用到越来越多的行业,它起到前期监督,后期管理的作用,统一分配,便于管理,提高我们的工作效率,降低成本 简述档案系统的结构 这与具体的作业系统有关系。 档案的组成结构一般分为物理结构和逻辑结构。物理结构是指档案在磁碟上的储存方式,而逻辑结构是指档案资讯的逻辑结构。象我们常提到的FAT,FAT32,NTFS等等都是档案的物理结构,它规定了档案资讯在磁碟上的储存方式,与具体的档案无关。而档案的逻辑结构则不同,它规定的是具体的一类档案中资讯的组织方式,象记录式档案和流档案等等。档案的逻辑结构多种多样,几乎每个种类的档案都有自己特殊的结构,比如WORD文件,比如BMP档案,比如MP3等

魔兽世界TidyPlates插件设置怎么管理debuff图标显示?

LZ难道是看了nga法师区Xmagic发的帖子才来求助的吗?楼主先打/hub 就会弹出设置菜单然后找到Buff/debuff 勾上Show Aura Timers然后在Filter Mode: 选择All my debuffs

有人知道platebuffs这个插件怎么设置吗

我表示被难住了.....platebuffs的设置只能设置技能下面的小字的CD提示而且你是用的WOW自带的姓名板 所以技能图标中央的CD提示模块应该是其他的插件加载的我推荐你尝试一下几个方法1.找一下你用的一些技能CD提示的插件 关闭一下技能CD的显示2.去找一款姓名板插件 TidyPlates就很好 而且支持platebuffs

wow关于Tidy plates DEBUFF显示问题~

图示样式 改成精简

魔兽世界插件 tidy Plates 这么在血条上方显示debuff 我弄了半天也没弄出来

打pvp还pve,pvp的话用plates buffs

有台zebra110Xi3-300条码打印机,提示 RIBBON OVER 错误,怎样解决啊?

安装了碳带却提示色带用尽,大概是感应器异常了,进行感应器校准试试:1,在打印机参数里找到 介质和色带(MEDIA AND RIBBON)进行感应器校准。(图一)2,按 + 一下,显示装载背衬(LOAD BACKING)。(图二)3,按 + 一下,显示取出色带 REMOVE RIBBON,这时把碳带去掉,合上打印头。(图三)4,按 + 一下,等待然后显示全部重新载入(RELOAD ALL),按 + 一下开始校准。(图四)5,打印机会出很长一段空白纸,等待其停止,校准完毕,保存退出,重启打印机如果校准了几次问题仍在,那是感应器坏了,联系商家检测维修吧。希望可以帮助到你,http://www.gflabel.com/

如何解决zebra打印机液晶屏显示Ribbon out

您好,我正在帮您查询相关的信息,马上回复您。

求高手指教学习JavaWeb的完整流程

1. java基础。这是最基本的,也是最重要的,熟悉java语言基础不只在面试的时候有帮助,在以后的开发过程中也是不可或缺的。从一无所知到基本上能够写出一些小程序,我是花了有两个多月的时间的。但是我的java基础还不行,所以打算最近再恶补一下thinking in java这本经典。 2. HTML+CSS+Javascript。学完java基础之后,如果真的要学web开发,那么就必须得学习HTML+CSS+Javascript,能够写出静态的页面。这些算比较简单的,但是javascript的话,我没有学得很好,但是还是算会用。 3.SQL语法,MySQL,Oracle数据库操作,PL/SQL语言。因为我们做的系统大部分是信息管理系统,所以数据库操作是必须的,最好也找数据库设计相关的书来看。 4. JDBC+JSP+Servlet的开发。应该要先了解MVC的概念,了解如何用JSP+Servlet来实现MVC结构的系统。这也是非常重要的,MVC这种思想虽然现在有些人觉得它很旧,很out了,但是目前大部分的系统还是用这种思想来实现的。而且这三种技术也是基础中的基础。我当时花了一个多月的时间学的,而且还写了一个《汽车销售》的课程设计。 5. SSH。然后就开始进入流行的开源框架这一块了。SSH绝对是目前最流行的JavaEE开发技术,特别是在国内,虽然有些公司有自己的框架,但是大部分也是基于SSH的,或者说思想和SSH是一致的。所以这三个框架也是必备的。我是花了有三个月的时间在这上面,而且也只是会用而已,对其中一些比较核心的东西还是不懂。 6. AJAX。AJAX的话算是比较简单,学习完它的原理后,可以用一些流行的开源框架来实现,如果DWR。也可以顺便学习一下JQUERY和Prototype,可以让你的AJAX应用更加便捷。 7. XML。XML也是重中之重,开发时的法宝之一。 8. 如果学习完以上七个部分,那么去一般做Java Web的软件公司都是没有问题的了。但是现在关键的是熟手多,高手少。真正要成为高手,还有很长的路要走,包括时刻关注java web的发展,不断地学习一些新的技术,一些新的框架。也要开始学着如何去架构,包括如何去做性能调优,如何去做更好的数据库设计,如果去做项目管理等。

我的电脑不能开机了,reboot and select proper boot device or insert boot media in selec...

"重新启动并选择适当的开机装置或插入开机媒体在选定的启动设备和按一个键"

电脑一开机就有英文母Reboot and Select proper Boot device or Insert Boot Media in selec

分析:电脑显示未找到启动磁盘。如果此前未曾修改CMOS启动项,则一般为硬盘出现故障如接触不良或损坏而未能通过开机通电自检,或者是硬盘主引导记录损坏,或者是主机插入非启动光盘或U盘。处理办法:1、关机断电开机箱,重新插拔硬盘电源线和数据线(若为笔记本电脑则只需重新插拔硬盘),再开机,按DEL键(笔记本为F2或其它)进入CMOS中BOOT选项卡,看能否检测到硬盘信息。如能则将硬盘设置为第一启动项。按F10键保存按Y键确定退出重启。2、如果检测到硬盘但仍无法启动,则使用系统U盘或光盘启动电脑后,运行DISKGENIUS对硬盘进行检测,并重建主引导记录MBR。3、如果以上操作无效,则需要重装系统。重装系统方法很多,推荐光盘重装系统。4、如不能检测到硬盘,则更换硬盘电源线和数据线,无效再更换硬盘,并重装系统。5、如果CMOS中将光盘或U盘启动设置在硬盘启动之前,则需要将插入在光驱或主机USB接口上的非启动光盘或U盘取出。

我家电脑原是双硬盘后来我其中一个硬盘卸下来了,然后再启动电脑就显示reboot and selec

没有操作系统

TCL电脑开机出现Rebootandselec怎么办

磁盘错误,按任意键重新启动!可能的情况是你要看你的硬盘有没有坏道。如果有的话估计坏道是存在在引导区,用FIDISK命令重新分区是最简单的,测试方法!至于你说的重装,估计有7成把握可以解决! 你的电脑可能检测不到硬盘(检测不到硬盘的症状:开机时IDE检测中不显示硬盘信息)这样进系统前就显示"“reboot and select proper boot device or insert boot media in selected boot device and press a key” 而检测硬盘成功就能进入系统。 硬盘检测失败的原因: 1) 主板BIOS没电,记不到硬盘信息,如果你的系统日期不正确的话,很可能是这个原因。 解决办法:更换BIOS电池,重新进BIOS内检测硬盘。 2) IDE线质量不好或插得不牢。 解决办法:换一条IDE线或将IDE线插在主板另一个IDE槽里,连硬盘的线不要与其它IDE设备一起连接,例如光驱,分开两条IDE线连,正确设置主/从盘。 3)硬盘故障,可能需要更换。 4)如果你的电脑每次都能检测到硬盘而不能进入系统的话,把硬盘重新完全格式化,再重新装系统

Netty源码-内存泄漏检测toLeakAwareBuffer

Netty在实现 ByteBuf 时采用了引用计数法进行 ByteBuf 的回收,使用引用计数法进行回收的 ByteBuf 都扩展了 AbstractReferenceCountedByteBuf 类,在使用 AbstractReferenceCountedByteBuf 时需要调用 AbstractReferenceCountedByteBuf.retain 方法递增引用计数器,在使用完毕时则需要调用 AbstractReferenceCountedByteBuf.release 方法递减引用计数器,当计数器为 0 时,会进行 ByteBuf 的回收工作:池化的 ByteBuf 不会进行实际的内存释放,会将占用的内存归还给内存池,非池化的 ByteBuf 则会直接释放内存(为了叙述简单,后面释放内存则指真正释放内存或者将内存归还给内存池)。 通过上面的描述可知, ByteBuf 的正确回收依赖 retain 和 release 方法的正确调用,内存提前释放(即在使用 ByteBuf 时没有调用 retain 方法,导致提前释放)应用会报错,用户也能及时感知到;但是如果使用完 ByteBuf 忘了调用 release 则会导致内存不能及时得到回收,造成内存泄漏,且内存泄漏用户无法及时感知,久而久之就会发生OOM。为了解决这种问题,Netty采用了内存泄漏检测机制,发生内存泄漏时会通过日志将内存泄漏信息打印出来,报告给用户。 Netty的内存泄漏检测使用了 WeakReference ,即弱引用,了解过Java四种引用类型(强、软、弱、虚)和引用队列( ReferenceQueue )的读者知道,弱引用持有的对象会在虚拟机触发GC时(不管回收之后内存是否够用)被回收掉,如果使用具有引用队列参数的构造函数实例化 WeakReference 时,弱引用持有的对象在GC被回收时,弱引用自身会被放入引用队列。 为了后面能更好的理解Netty内存泄漏检测的细节,下面先看几个弱引用的例子,在下面的几个例子中,我们使用的数据类和自定义的弱引用类子类如下: 好了,三个例子已经介绍完毕,后面在介绍Netty内存泄漏检测时就使用了这里的例子结果,在具体介绍时会和这里的例子一一对应。 Netty中将普通 ByteBuf 转为具有内存泄漏检测功能的 ByteBuf 是通过 AbstractByteBufAllocator.toLeakAwareBuffer 方法实现的,我们直接在Eclipse中看该方法的调用层次即可知道Netty在哪里对 ByteBuf 进行了转换,该方法调用如下图所示: 可见池化内存分配器在分配heap或者direct ByteBuf 时都进行了转换,非池化内存分配器仅在分配direct ByteBuf 时进行了转换。个人理解时采用池化内存需要特别关注内存释放,否则为了实现池化内存预先分配的一大块内存会因为没有释放被很快分配完,造成后面没有内存进行分配。非池化分配的直接内存也需要特别注意释放,放置内存泄漏;非池化分配的heap内存(其实就是一个 byte 数组)则可以在对象被回收时同时被回收掉,发生内存泄漏的可能性较小。 本节介绍Netty中内存泄漏检测相关的类,仅做一个大致介绍,类中的重要方法我们放在后面介绍。 主要负责使用 track 方法对指定的 ByteBuf 进行内存检测泄漏进行追踪,并返回负责追踪的 ResourceLeakTracker 类实例,同时在调用 track 方法时,也会根据指定的检测级别汇报最近的内存泄漏检测结果。该类由工厂类 ResourceLeakDetectorFactory 负责实例化,默认的实现为 ResourceLeakDetector ,在 ResourceLeakDetectorFactory 类的默认实现 DefaultResourceLeakDetectorFactory 中,也会根据用户是否配置了 io.netty.customResourceLeakDetector 来决定采用默认实现 ResourceLeakDetector 还是使用用户自定义的 ResourceLeakDetector ,用户自定义的 ResourceLeakDetector 必须是其子类。 默认实现为 DefaultResourceLeak , DefaultResourceLeak 实现了 ResourceLeakTracker 和 ResourceLeak 接口,同时也继承了类 WeakReference ,是一个弱引用实现。首先,同上面 例2 的结果一样,如果在使用 ByteBuf 时忘了调用 AbstractReferenceCountedByteBuf.release 方法,那么将不会调用 DefaultResourceLeak.clear 方法去手动清空该弱引用持有的实际对象,在发生GC时,会由垃圾收集器对弱引用持有的实际对象进行回收,即发生了内存泄漏,同时该弱引用自身也会被加入到引用队列中,该引用队列是 ResourceLeakDetector 的成员域,上面介绍 ResourceLeakDetector 类时说到该类会在用户 track 指定 ByteBuf 是汇报检测结果,该类的汇报数据来源就是引用队列。 DefaultResourceLeak 同时还提供了 record 方法可以让用户在指定时机选择调用,这个方法可以记录用户的调用轨迹(堆栈)。 Record 同时也是一种单链表,在 DefaultResourceLeak 中就使用单链表记录用户的调用轨迹。 DefaultResourceLeak 供用户记录程序调用轨迹的类,也就是 DefaultResourceLeak.record 方法返回的对象,继承自 Throwable ,因此可以使用 Throwable.getStackTrace 方法获得调用轨迹信息,打印在内存泄漏报告中可以让用户更好的排除内存泄漏问题。 在上面介绍 ResourceLeakTracker 时,说到其默认实现为 DefaultResourceLeak , DefaultResourceLeak 提供了 record 方法记录用户的调用轨迹,用户可在调用 ByteBuf 方法时调用 record 方法记录调用轨迹,调用的频率越多,后面在汇报内存泄漏情况时就能打印出越详细的信息,这样也能更方便的排查问题。 Netty提供了两个 ByteBuf 的封装类供选择,就对应不同的 record 调用频率,每个封装类都持有 ResourceLeakTracker 对象,Netty根据配置的内存检测级别(下一节介绍相关配置参数)使用不同的 ByteBuf 封装类。 Netty提供的两个 ByteBuf 封装类就是 SimpleLeakAwareCompositeByteBuf 和 AdvancedLeakAwareCompositeByteBuf , AdvancedLeakAwareCompositeByteBuf 是 SimpleLeakAwareCompositeByteBuf 的子类, SimpleLeakAwareCompositeByteBuf 类仅仅持有 ResourceLeakTracker 对象,但是看其源码,发现没有调用过 record 方法,所以只能知道是否发生了内存泄漏时,无法打印出任何调用轨迹信息。 AdvancedLeakAwareCompositeByteBuf 作为 SimpleLeakAwareCompositeByteBuf 的子类,在 ByteBuf 的多个方法中调用了 record 方法,所以在发生内存泄漏时,能够打印出比较详细的调用轨迹信息。 在 AdvancedLeakAwareCompositeByteBuf 类中使用了配置参数 io.netty.leakDetection.acquireAndReleaseOnly 来控制是否只是在调用增加或减少引用计数器的方法时才调用 record 方法记录调用轨迹,默认为false。 AdvancedLeakAwareCompositeByteBuf 中 retain 和 release 方法因为改变了引用计数器就直接调用了 record 方法,而该类中的其他方法则根据 io.netty.leakDetection.acquireAndReleaseOnly 的配置决定是否调用 record 方法,这里为了节省篇幅就不列出 AdvancedLeakAwareCompositeByteBuf 类中调用 record 的方法了,读者可自行查看。 在介绍相关配置参数之前,我们先看下Netty提供的内存泄漏检测级别: Level.ADVANCED 和 Level.PARANOID 使用的 ByteBuf 包装类都是 AdvancedLeakAwareCompositeByteBuf ,我们上面介绍 ResourceLeakDetector 类时提到该类使用 track 方法对指定的 ByteBuf 进行内存检测泄漏进行追踪,并返回负责追踪的 ResourceLeakTracker 类实例,同时在调用 track 方法时,也会根据指定的检测级别汇报最近的内存泄漏检测结果。如果内存泄漏检测级别为 Level.PARANOID 时则每次调用 track 方法都会进行内存泄漏报告;如果级别为 Level.ADVANCED 或者 Level.SIMPLE 则会以一定频率进行内存泄漏报告,而不是每次 track 都进行报告。 是否关闭Netty内存泄漏检测功能,默认为false。如果该参数配置为false,则默认的内存泄漏检测级别根据此参数的配置为 Level.DISABLED ,否则默认的级别为 Level.SIMPLE 。 配置内存泄漏检测级别的参数,用于老版本的配置参数。 新的内存泄漏检测级别参数,如果没有配置,则会采用老版本参数配置的级别作为最终配置。 在第4节介绍内存泄漏检测相关类时,我们介绍过 DefaultResourceLeak 提供了 record 方法记录用户的调用轨迹,如果当前保存的调用轨迹记录数 Record 大于参数 io.netty.leakDetection.targetRecords 配置的值,那么会以一定的概率(1/2^n)删除头结点之后再加入新的记录,当然也有可能不删除头结点直接新增新的记录。 该参数的默认为4。 上面介绍过,在 AdvancedLeakAwareCompositeByteBuf 类中使用了配置参数 io.netty.leakDetection.acquireAndReleaseOnly 来控制是否只是在调用增加或减少引用计数器的方法时才调用 record 方法记录调用轨迹,默认为false。 在介绍 ResourceLeakDetector 类时提到过,默认的 ResourceLeakDetector 类就是 ResourceLeakDetector ,但是用户可以使用参数 io.netty.customResourceLeakDetector 来决定采用默认实现 ResourceLeakDetector 还是使用用户自定义的 ResourceLeakDetector 。 我们在第二节介绍了Netty中将普通 ByteBuf 转为具有内存泄漏检测功能的 ByteBuf 是通过 AbstractByteBufAllocator.toLeakAwareBuffer 方法实现的。 这里我们先看下该方法的源码: 上面的源码中是调用 AbstractByteBuf.leakDetector.track(buf) 返回 ResourceLeakTracker 类对象的,这里我们看下默认的 ResourceLeakDetector 中 track 方法实现: 我们看到 AbstractByteBufAllocator.toLeakAwareBuffer 对 ResourceLeakDetector.track 返回的 DefaultResourceLeak 和传入的 ByteBuf 对象进行封装,返回了具有内存泄漏检测功能的 ByteBuf 封装类 SimpleLeakAwareCompositeByteBuf 或其子类 AdvancedLeakAwareCompositeByteBuf 。如果应用程序在使用 ByteBuf 正确调用了 retain 和 release 方法,则在引用计数器为0时,则会清除弱引用持有的实际对象,发生GC时, DefaultResourceLeak 也不会被放入引用队列中(见前面第2节 例3 结果)。 但是如果应用程序在使用 ByteBuf 没有正确调用 retain 和 release 方法,则不会清除弱引用持有的实际对象,此时如果实际上已经没有强引用指向该 ByteBuf ,那么在发生GC时,垃圾收集器会回收该 ByteBuf ,而弱引用 DefaultResourceLeak 会被放入引用队列中(见前面第2节 例2 结果),加入到引用队列中的就是识别到的发生内存泄漏的 ByteBuf 。在 ResourceLeakDetector.track 方法中调用的 reportLeak 输出的就是引用队列中的弱引用 DefaultResourceLeak : 到这里,已经基本上介绍完Netty内存检测的实现原理,下面我们再看下 DefaultResourceLeak.record 是如何记录调用轨迹的: 最后我们再看下 Record 是如何输出调用轨迹的,前面我们说到 Record 继承自类 Throwable ,因此可使用 getStackTrace 方法获取实例化该对象时的调用轨迹,所以上面在输出内存泄漏报告时就调用了 Record.toString 方法:

LeBron James生平的比赛记录?

sofa

lebron james的中文资料

http://baike.baidu.com/view/5240.html?wtp=tt

格力除湿机DH20EB开机不到5分钟就停了是什么原因要怎么排除故障?

1、首先将除湿机电源插入到电源插座,这是电源就接通电了。然后我们就可以找到除湿机的界面控制面板。如图所示:请点击输入图片描述2、此时面板上有很多按钮,这是我们先按下面板上的开关按钮,将除湿机打开。如图所示:请点击输入图片描述3、打开电源之后,此时除湿机就会开始工作,前面会有排风口出来,用于除湿。如图所示:请点击输入图片描述4、面板上面,会显示很多功能,湿度,代表的是室内空气的湿度,在除湿时,湿度会下降的。湿度下面有两个按钮,是用于调节湿度控制的。一个是调大,一个是调小,意思是,你可以设置指定的湿度,就像空调一样,当湿度降到这个设置值时,除湿机就会停止工作,当大于这个值时,就会自动工作。同空调工作原理一样,如图所示:请点击输入图片描述5、另外界面上还可以设置除湿时间,定时设置,设置好时间,除湿机就会工作相应的时间后,就会停止工作。还可以设置风速的大小,自己根据情况设置。如图示所示:请点击输入图片描述请点击输入图片描述6、后面还有除湿机的运行状态和滤网清洁方面,这个是默认的不用管。另外一个就是水满显示灯,当水满后,为了防止水溢出,界面会提示水满,亮红灯,此时只需要把水倒出,重新安装进去即可,如图所示操作。请点击输入图片描述

如何获取dubbo上注册的referencebean

开源的dubbo已支持4种组件作为注册中心,我们部门使用推荐的zookeeper做为注册中心,由于就瓶颈来说不会出现在注册中心,风险较低,未做特别的研究或比较。zookeeper,推荐集群中部署奇数个节点,由于zookeeper挂掉一半的机器集群就不可用,所以部署4台和3台的集群都是在挂掉2台后集群不可用redismulticast,广播受到网络结构的影响,一般本地不想搭注册中心的话使用这种调用dubbo简易注册中心对于zookeeper客户端,dubbo在2.2.0之后默认使用zkclient,2.3.0之后提供可选配置Curator,提到这个点的原因主要是因为zkclient发现一些问题:①服务器在修改服务器时间后zkClient会抛出日志错误之类的异常然后容器(我们使用resin)挂掉了,也不能确定就是zkClient的问题,接入dubbo之前无该问题②dubbo使用zkclient不传入连接zookeeper等待超时时间,使用默认的Integer.MAX_VALUE,这样在zookeeper连不上的情况下不报错也无法启动;目前我们准备寻找其他解决方案,比如使用curator试下,还没正式投入。

Web项目开发为何要走前后端分离模式?

把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署,两个不同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发,开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。具体好处有以下几点: 1.彻底解放前端 前端不再需要向后台提供模板或是后台在前端html中嵌入后台代 2.提高工作效率,分工更加明确 前后端分离的工作流程可以使前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的json文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。 3.局部性能提升 通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。 4.降低维护成本 通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。 5.实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。 6.即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。 7.可以使后台能更好的追求高并发,高可用,高性能;使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。我理解的前后端分离,前端是需要起服务器的,减少学习成本,可以用node,前端也要有域名的如果是半分离, 那么前端提供js文件(css等)这个我也做过,前后端都用node就不说了,如果是两种语言, 如果一个工程文件下开发,webpack下直接打包进后台语言的静态目录下。 如果是两个工程,那么前端只提供生成的js(css)文件,git pull后台项目,扔进静态目录,这样又涉及到版本控制的问题,一般我会生成一个配置文件,直接读取的,内容是xxx.hash.js这种文件名,然后document.wirte动态写入js/css前端起服务器就不需要动态引入了,直接html插件生成文件,更好的控制版本半分离 还有一个问题,例如首页同构,如果更改xxx.blade.php文件,这就又动了php文件,甚至包括nginx反向代理啊,ssl这种缓存啊,都比较麻烦,你要是改了点啥,自己的ok了,后台的崩了,那就挺操蛋了,大公司有专门的运维还好,小公司真的是一团糟 后台我们采取全分离,nginx前端管理,至于升级nginx版本,http2,反向代理,https证书,都是前端自己弄,毕竟小公司,每个人水平都不一致,自己负责自己的比较好 但是这个跨域又要稍微处理一下,至今我这边后台还是*,我也没法说什么 阿里云这么便宜,如果把成本浪费在人力上,会变得很贵 一个人的精力有限,前后端分离有助于我们更专注我们所要注重的技术点,俗话说:“术业有专攻”。 比如我们后端,前后端分离有助于我们把注意力放在java基础,设计模式,jvm原理,spring+springmvc原理及源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构(dubbo,dubbox,spring cloud),弹性计算架构,微服务架构(springboot+zookeeper+docker+jenkins),java性能优化,以及相关的项目管理等等。 而前端也可以集中精力在前端的展示上。 总的来说,前后端分离利大于弊。这也是越来越少用jsp的原因。补充两点 1.每次请求的数据量变小,也意味着更少的响应时间。 2.也不是每个应用用前后端分离都是最合适的,要根据应用规模,工期综合判断。

web层直接调用 dubbo的服务,合适吗

连加不发布服务 DUBBO的配置属性里面对消费端提供了不从注册中心发现服务的机制,直接配置远程接口的地址,这样可以保证消费端连接到制定的环境接口。

horjzon跑步机电子屏显示lubebelt是什么问题?

使用时间过长,没有进行保养清理。 内置程序保养模式自动出现,同时按着停止键和速度加键5秒响三声ok。注意事项 编辑在上跑步机运动前应先做热身活动,如压腿、下蹲、拉伸肌肉、屈伸关节等提高肌肉的温度,使肌肉变得更加柔软而不易拉伤。上跑步机后应从慢走、慢跑等“动态”热身开始,逐步加大运动量,此过程通常以10至15分钟为宜。下跑步机时也应该逐步减慢速度,以免出现眩晕感。其次,不宜跑步时扶着把手跑。跑步扶着把手,身体重心前倾,会加大腰椎的压力,时间久了就会造成腰肌劳损。此外,跑步过程中,脚掌落地时受到的冲击力差不多是体重的5倍,重心前倾会给腿部和脚部关节带来更大的冲击力。在跑步机上锻炼时一定要收腹挺胸、收紧腰背部肌肉。最后,在家使用跑步机时不能光脚跑步或只穿袜子。因为光脚跑步时,跑步机的震动会对膝、踝等关节造成不必要的伤害,脚底出汗还容易滑倒。仅穿双厚袜子能起到一定的减震效果,但毕竟袜子没有运动鞋底的弹性,代替不了运动鞋。所以,在跑步机上运动最好穿慢跑鞋。

spinal column和vertebral column的区别?

spinal脊柱的 脊椎的 脊椎骨的 Health evaluation of spinal column in fighter pilots——X-rays,CT,MRI findings and clinical evaluation 飞行员脊柱健康评价——X线、CT、MRI所见及临床调查 ;vertebral 脊椎的 MRI Evaluation of Giant Cell Tumor of Vertebral Column (Report of 3 Cases and Review of the Literature) 椎体骨巨细胞瘤MRI表现(附3例报告及文献复习)

谷歌草图大师附赠的layout3和stylebuilder2是干什么的呢?

LayOut是GoogleSketchUp专业版的一种功能,它是一个工具集,可以更轻松地建立包含SketchUp模型的设计演示。StyleBuilder则是用来修改线条的软件,修改完后应用到风格里就可以了。作用不是特别大,因为它只能改线条笔触,背景呀什么的直接在SKETCHUP里改。1、打开layout,常见的工具和sketchup差不多,每选择一个,左下角有每个命令的描述。2、直线工具是自带白色的填充背景的。3、捕捉的时候,蓝色的是中点,绿色的是在线上,红色叉的是交点。4、直线下面还有一个手绘线,是可以手绘曲线的。5、手绘一条线出来,可以看见,它和直线一样,自带白色的背景,把第一条画的曲线有部门遮盖的。

yuoarebutfull什么意思

you are beautiful你很漂亮

有人用过 mojo 的websocket吗

  有的。WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。  在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双向通信,但效率较低,并需要服务器有较好的支持; flash中的socket和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使用这两项功能. 可以预见,如果websocket一旦在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

如何判断一个页面是否使用了WebSocket

抓包分析了,wiresharke

如何发送binarywebsocketframe

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。引擎支持最新的WebSocket Version 13。在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。头文件中的准备工作首先需要include WebSocket的头文件。#include "network/WebSocket.h"cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。 class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate 并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws); virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data); virtual void onClose(cocos2d::network::WebSocket* ws); virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error); 后面我们再详细介绍每个回调接口的含义。新建WebSocket并初始化WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket(); init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://"._wsiSendText->init(*this, "ws://echo.websocket.org") WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。void WebSocketTestLayer::onOpen(network::WebSocket* ws) { if (ws == _wsiSendText) { _sendTextStatus->setString("Send Text WS was opened."); } } onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data) { if (!data.isBinary) { _sendTextTimes++; char times[100] = {0}; sprintf(times, "%d", _sendTextTimes); std::string textStr = std::string("response text msg: ")+data.bytes+", "+times; log("%s", textStr.c_str()); _sendTextStatus->setString(textStr.c_str()); } } onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。void WebSocketTestLayer::onClose(network::WebSocket* ws) { if (ws == _wsiSendText) { _wsiSendText = NULL; } CC_SAFE_DELETE(ws); } onError客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error) { log("Error was fired, error code: %d", error); if (ws == _wsiSendText) { char buf[100] = {0}; sprintf(buf, "an error was fired, code: %d", error); _sendTextStatus->setString(buf); } } send消息到服务器在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。发送文本_wsiSendText->send("Hello WebSocket, I"m a text message."); 发送二进制数据(多了一个len参数)_wsiSendBinary->send((unsigned char*)buf, sizeof(buf)); 主动关闭WebSocket这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。_wsiSendText->close(); 在Lua中使用详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。wsSendText = WebSocket:create("ws://echo.websocket.org") 定义并注册消息回调函数回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。local function wsSendTextOpen(strData) sendTextStatus:setString("Send Text WS was opened.") end local function wsSendTextMessage(strData) receiveTextTimes= receiveTextTimes + 1 local strInfo= "response text msg: "..strData..", "..receiveTextTimes sendTextStatus:setString(strInfo) end local function wsSendTextClose(strData) print("_wsiSendText websocket instance closed.") sendTextStatus = nil wsSendText = nil end local function wsSendTextError(strData) print("sendText Error was fired") end Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。if nil ~= wsSendText then wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN) wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE) wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE) wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR) end send消息Lua中发送不区分文本或二进制模式,均使用下面的接口。wsSendText:sendString("Hello WebSocket中文, I"m a text message.") 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。wsSendText:close() 在JSB中使用详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。this._wsiSendText = new WebSocket("ws://echo.websocket.org"); 设置消息回调函数JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。this._wsiSendText.onopen = function(evt) { self._sendTextStatus.setString("Send Text WS was opened."); }; this._wsiSendText.onmessage = function(evt) { self._sendTextTimes++; var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes; cc.log(textStr); self._sendTextStatus.setString(textStr); }; this._wsiSendText.onerror = function(evt) { cc.log("sendText Error was fired"); }; this._wsiSendText.onclose = function(evt) { cc.log("_wsiSendText websocket instance closed."); self._wsiSendText = null; }; send消息发送文本,无需转换,代码如下:this._wsiSendText.send("Hello WebSocket中文, I"m a text message."); 发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。_stringConvertToArray:function (strData) { if (!strData) returnnull; var arrData = new Uint16Array(strData.length); for (var i = 0; i < strData.length; i++) { arrData[i] = strData.charCodeAt(i); } return arrData; }, send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。var buf = "Hello WebSocket中文, I"m a binary message."; var binary = this._stringConvertToArray(buf); this._wsiSendBinary.send(binary.buffer); 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。onExit: function() { if (this._wsiSendText) this._wsiSendText.close();

如何创建通过 WebSocket 进行通信的 WCF 服务

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。引擎支持最新的WebSocket Version 13。在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。头文件中的准备工作首先需要include WebSocket的头文件。#include "network/WebSocket.h"cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。 class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate 并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws); virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data); virtual void onClose(cocos2d::network::WebSocket* ws); virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error); 后面我们再详细介绍每个回调接口的含义。新建WebSocket并初始化WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket(); init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://"._wsiSendText->init(*this, "ws://echo.websocket.org") WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。void WebSocketTestLayer::onOpen(network::WebSocket* ws) { if (ws == _wsiSendText){_sendTextStatus->setString("Send Text WS was opened.");} } onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data) { if (!data.isBinary){_sendTextTimes++; char times[100] = {0};sprintf(times, "%d", _sendTextTimes);std::string textStr = std::string("response text msg: ")+data.bytes+", "+times;log("%s", textStr.c_str());_sendTextStatus->setString(textStr.c_str());} } onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。void WebSocketTestLayer::onClose(network::WebSocket* ws) { if (ws == _wsiSendText){_wsiSendText = NULL;}CC_SAFE_DELETE(ws); } onError客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error) {log("Error was fired, error code: %d", error); if (ws == _wsiSendText){ char buf[100] = {0};sprintf(buf, "an error was fired, code: %d", error);_sendTextStatus->setString(buf);} } send消息到服务器在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。发送文本_wsiSendText->send("Hello WebSocket, I"m a text message."); 发送二进制数据(多了一个len参数)_wsiSendBinary->send((unsigned char*)buf, sizeof(buf)); 主动关闭WebSocket这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。_wsiSendText->close(); 在Lua中使用详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。wsSendText = WebSocket:create("ws://echo.websocket.org") 定义并注册消息回调函数回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。local function wsSendTextOpen(strData)sendTextStatus:setString("Send Text WS was opened.") endlocal function wsSendTextMessage(strData)receiveTextTimes= receiveTextTimes + 1local strInfo= "response text msg: "..strData..", "..receiveTextTimessendTextStatus:setString(strInfo) endlocal function wsSendTextClose(strData)print("_wsiSendText websocket instance closed.")sendTextStatus = nilwsSendText = nil endlocal function wsSendTextError(strData)print("sendText Error was fired") end Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。if nil ~= wsSendText thenwsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN)wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE)wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE)wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR) end send消息Lua中发送不区分文本或二进制模式,均使用下面的接口。wsSendText:sendString("Hello WebSocket中文, I"m a text message.") 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。wsSendText:close() 在JSB中使用详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。this._wsiSendText = new WebSocket("ws://echo.websocket.org"); 设置消息回调函数JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。this._wsiSendText.onopen = function(evt) {self._sendTextStatus.setString("Send Text WS was opened."); };this._wsiSendText.onmessage = function(evt) {self._sendTextTimes++; var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes;cc.log(textStr);self._sendTextStatus.setString(textStr); };this._wsiSendText.onerror = function(evt) {cc.log("sendText Error was fired"); };this._wsiSendText.onclose = function(evt) {cc.log("_wsiSendText websocket instance closed.");self._wsiSendText = null; }; send消息发送文本,无需转换,代码如下:this._wsiSendText.send("Hello WebSocket中文, I"m a text message."); 发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。_stringConvertToArray:function (strData) { if (!strData) returnnull;var arrData = new Uint16Array(strData.length); for (var i = 0; i < strData.length; i++) {arrData[i] = strData.charCodeAt(i);} return arrData; }, send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。var buf = "Hello WebSocket中文, I"m a binary message."; var binary = this._stringConvertToArray(buf);this._wsiSendBinary.send(binary.buffer); 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。onExit: function() {if (this._wsiSendText)this._wsiSendText.close();

如何建立websockets连接

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。Cocos2d-x引擎集成libwebsockets,并在libwebsockets的客户端API基础上封装了一层易用的接口,使得引擎在C++, JS, Lua层都能方便的使用WebSocket来进行游戏网络通讯。引擎支持最新的WebSocket Version 13。在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/WebSocketTest.cpp文件。头文件中的准备工作首先需要include WebSocket的头文件。#include "network/WebSocket.h"cocos2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。使用WebSocket的类,需要public继承这个Delegate。 class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate 并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws); virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data); virtual void onClose(cocos2d::network::WebSocket* ws); virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error); 后面我们再详细介绍每个回调接口的含义。新建WebSocket并初始化WebSocket.org 提供了一个专门用来测试WebSocket的服务器"ws://echo.websocket.org"。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket(); init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的"ws://"标识是WebSocket协议,加密的WebSocket为"wss://"._wsiSendText->init(*this, "ws://echo.websocket.org") WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。void WebSocketTestLayer::onOpen(network::WebSocket* ws) { if (ws == _wsiSendText) { _sendTextStatus->setString("Send Text WS was opened."); } } onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data) { if (!data.isBinary) { _sendTextTimes++; char times[100] = {0}; sprintf(times, "%d", _sendTextTimes); std::string textStr = std::string("response text msg: ")+data.bytes+", "+times; log("%s", textStr.c_str()); _sendTextStatus->setString(textStr.c_str()); } } onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。void WebSocketTestLayer::onClose(network::WebSocket* ws) { if (ws == _wsiSendText) { _wsiSendText = NULL; } CC_SAFE_DELETE(ws); } onError客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error) { log("Error was fired, error code: %d", error); if (ws == _wsiSendText) { char buf[100] = {0}; sprintf(buf, "an error was fired, code: %d", error); _sendTextStatus->setString(buf); } } send消息到服务器在init之后,我们就可以调用send接口,往服务器发送数据请求。send有文本和二进制两中模式。发送文本_wsiSendText->send("Hello WebSocket, I"m a text message."); 发送二进制数据(多了一个len参数)_wsiSendBinary->send((unsigned char*)buf, sizeof(buf)); 主动关闭WebSocket这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。close会触发onClose消息,而后onClose里面,我们释放内存。_wsiSendText->close(); 在Lua中使用详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/WebProxyTest.lua文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。wsSendText = WebSocket:create("ws://echo.websocket.org") 定义并注册消息回调函数回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。local function wsSendTextOpen(strData) sendTextStatus:setString("Send Text WS was opened.") end local function wsSendTextMessage(strData) receiveTextTimes= receiveTextTimes + 1 local strInfo= "response text msg: "..strData..", "..receiveTextTimes sendTextStatus:setString(strInfo) end local function wsSendTextClose(strData) print("_wsiSendText websocket instance closed.") sendTextStatus = nil wsSendText = nil end local function wsSendTextError(strData) print("sendText Error was fired") end Lua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。if nil ~= wsSendText then wsSendText:registerScriptHandler(wsSendTextOpen,cc.WEBSOCKET_OPEN) wsSendText:registerScriptHandler(wsSendTextMessage,cc.WEBSOCKET_MESSAGE) wsSendText:registerScriptHandler(wsSendTextClose,cc.WEBSOCKET_CLOSE) wsSendText:registerScriptHandler(wsSendTextError,cc.WEBSOCKET_ERROR) end send消息Lua中发送不区分文本或二进制模式,均使用下面的接口。wsSendText:sendString("Hello WebSocket中文, I"m a text message.") 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发cc.WEBSOCKET_CLOSE消息。wsSendText:close() 在JSB中使用详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/WebSocketTest.js文件。创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。this._wsiSendText = new WebSocket("ws://echo.websocket.org"); 设置消息回调函数JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。可以看出JS语言的特性,让绑定回调函数更加优美。四个回调的含义,参考上面c++的描述。this._wsiSendText.onopen = function(evt) { self._sendTextStatus.setString("Send Text WS was opened."); }; this._wsiSendText.onmessage = function(evt) { self._sendTextTimes++; var textStr = "response text msg: "+evt.data+", "+self._sendTextTimes; cc.log(textStr); self._sendTextStatus.setString(textStr); }; this._wsiSendText.onerror = function(evt) { cc.log("sendText Error was fired"); }; this._wsiSendText.onclose = function(evt) { cc.log("_wsiSendText websocket instance closed."); self._wsiSendText = null; }; send消息发送文本,无需转换,代码如下:this._wsiSendText.send("Hello WebSocket中文, I"m a text message."); 发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。_stringConvertToArray:function (strData) { if (!strData) returnnull; var arrData = new Uint16Array(strData.length); for (var i = 0; i < strData.length; i++) { arrData[i] = strData.charCodeAt(i); } return arrData; }, send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。var buf = "Hello WebSocket中文, I"m a binary message."; var binary = this._stringConvertToArray(buf); this._wsiSendBinary.send(binary.buffer); 主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。close会触发onclose消息。onExit: function() { if (this._wsiSendText) this._wsiSendText.close();

pirates yebs warned是什么意思

单就这三个词而言,是指被警告的海盗Yebs, 但具体意思还是要看原文中具体语境

theworldwillbebetter为什么下架

theworldwillbebetter下架是因为歌词暴力,血腥,theworldwillbebetter唱片公司宣布在2022年10月14日正式下架歌曲,theworldwillbebetter这首歌曲的原唱是Heavenly歌手,Heavenly带领了20世纪90年代的tweepop音乐,成为Sarah唱片公司最具传奇性的国际明星。

篮球中Free Throws,Turnovers,Off.Rebounds,Def. Rebounds,Biggest Lead,Biggest Run都分别指中文的什么?

Free Throws罚球Turnovers失误Off.Rebounds进攻篮板Def. Rebounds防守篮板Biggest Lead最大领先分差Biggest Run最大连续得分Min上场时间Pts得分Ass助攻R篮板球数F犯规数

_________ [A] realm [B] net [C] relation [D] web

【答案】:D名词辨析。realm意为“王国,领域”;net意为“网,网状物”,如:a fishing net(渔网);relation意为“关系”;web意为“网,网络”。地下的真菌构成一种广阔的网络,web符合题意。

wakebabywakebaby什么歌

英文歌。《WakeUpBaby》是Mazozma演唱的歌曲,收录于专辑《WakeUpBaby》,该歌曲是一首英文歌曲《WakeUpBaby》是Mazozma于2016年2月26日发行的音乐专辑,共收录6首歌曲,由歌手Mazozma担任专辑制作人,《WakeUpBaby》也收录其中。

Webasto的加热器工作原理是什么?它会影响车本身的使用寿命吗?

我用了两年了,冬天对我来说没它不行,不觉得有什么不好的问题

java websocket 302错误

访问错误的地址,导致返回的是已经移走的资源————————————————————

web前端需要掌握的哪些知识

前端工程师已经成为目前互联网企业极具竞争力的人才,企业不断提升薪资水平为了招聘到优秀的Web前端开发工程师。因此,越来越多的人想要学习Web前端。那么呢?Web前端的学习路线是什么?想成为一个Web前端开发工程师,需要掌握的知识有很多,大概包括:HTML、CSS、JavaScript、XML、JSON、服务器脚本语言(PHP,ASP,.NET,JSP等等)、jquery框架、页面性能优化、SEO站内优化、开放服务API接入、浏览器兼容性调试、W3C规范等等。1、前端页面重构。主要内容为PC端网站布局、HTML5+CSS3基础、WebApp页面布局。学习目标是完成PC端网站布局,WebApp页面布局,还要可以通过HTML5+CSS3的2D、3D等属性实现一些精美的动画效果。2、JavaScript高级课程、PC端全栈项目开发。主要内容为原生JavaScript、面向对象进阶与ES5/ES6应用、JavaScript工具库自主研发、JQuery经典交互特效开发、HTTP协议、Ajax进阶与后端开发、前端工程化与模块化应用以及AngularJS等。学习目标是可以通过原生JavaScript开发交互功能,实现网站上的交互效果,以及模块化应用等,实现完整的前端工程。3、Web前端框架、混合开发(Hybrid,RN)、大数据可视化。主要内容为Node.js后端开发、Vue.js前端框架、React前端框架、混合开发(Hybrid,RN)、Angular前端框架、大数据可视化等。学习目标是可以独立完成相应的项目,如微信场景,应用Vue.js、Ionic、React.js等框架开发WebApp,微信小程序项目开发,以及各类混合应用项目开发等。以上就是为大家分享的关于杭州Web前端学习路线。不知道对于还在迷茫的你或者是正在考虑学习的你在看完上面所介绍的内容之后有没有想要赶紧去学习的想法呢?

Web前端的学习路线到底是什么,看完秒懂

web前端学习路线

用HTML5开发的WebApp怎么实现消息推送

使用 websocket , 这是html5新特性,当然也要求后台服务器支持,现在很多服务器已经支持了。

spring websocket 怎么维持心跳连接

通过上面的原理分析可以知道,需要发送到后台的数据很简单,就是用户信息,聊天信息,和所在的空间信息,因为是一个简单的例子,所以bean就设计的比较简单了:[java] view plain copy public class UserChatCommand {private String name;private String chatContent;private String coordinationId; public String getName() {return name;}

前端小白想问,websocket如何实现多个浏览器同步数据的?求大佬给个思路

你先看看socket的原理

请教html5的websocket无缘无故客户端主动断开原因

知道websocket的原理就好解决:websocket是html5出的东西(协议),也就是说http协议没有变化,或者说没关系,但http是不支持持久连接的(长连接,循环连接的不算)首先http有1.1和1.0之说,也就是所谓的keep-alive,把多个http请求合并为一个,但是websocket其实是一个新协议,跟http协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是http协议上的一种补充另外html5是指的一系列新的api,或者说新规范,新技术。http协议本身只有1.0和1.1,而且跟html本身没有直接关系。。通俗来说,你可以用http协议传输非html数据,就是这样=。=再简单来说,层级不一样。

请教html5的websocket无缘无故客户端主动断开原因

知道WebSocket的原理就好解决:WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=再简单来说,层级不一样。

手机自动锁屏,websocket 自动断开,为什么

知道WebSocket的原理就好解决:WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=再简单来说,层级不一样。

手机自动锁屏,websocket 自动断开,为什么

知道WebSocket的原理就好解决:WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=再简单来说,层级不一样。

请教html5的websocket无缘无故客户端主动断开原因

知道WebSocket的原理就好解决:WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=再简单来说,层级不一样。

WebSocket 是什么原理?为什么可以实现持久连接

、TCP连接手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在逗无差别地的网络之上。建立起一个TCP连接需要经过逗三次握手地:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过逗四次握手地(过程就不细写了,就是服务器和客户端交互,最终确定断开)2、HTTP连接HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为逗一次连接地。1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种逗短连接地,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次逗保持连接地的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端逗在线地。若服务器长时间无法收到客户端的请求,则认为客户端逗下线地,若客户端长时间无法收到服务器的回复,则认为网络已经断开。3、SOCKET原理3.1套接字(socket)概念套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务

WebSocket 是什么原理?为什么可以实现持久连接

你可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。在以前 HTTP 协议中所谓的 keep-alive connection 是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的 polling 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有新数据。这两种模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。它们建立的“长连接”都是伪.长连接,只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现。WebSocket 解决的第一个问题是,通过第一个 HTTP request 建立了 TCP 连接之后,之后的交换数据都不需要再发 HTTP request了,使得这个长连接变成了一个真.长连接。但是不需要发送 HTTP header就能交换数据显然和原有的 HTTP 协议是有区别的,所以它需要对服务器和客户端都进行升级才能实现。在此基础上 WebSocket 还是一个双通道的连接,在同一个 TCP 连接上既可以发也可以收信息。此外还有 multiplexing 功能,几个不同的 URI 可以复用同一个 WebSocket 连接。这些都是原来的 HTTP 不能做到的。另外说一点技术细节,因为看到有人提问 WebSocket 可能进入某种半死不活的状态。这实际上也是原有网络世界的一些缺陷性设计。上面所说的 WebSocket 真.长连接虽然解决了服务器和客户端两边的问题,但坑爹的是网络应用除了服务器和客户端之外,另一个巨大的存在是中间的网络链路。一个 HTTP/WebSocket 连接往往要经过无数的路由,防火墙。你以为你的数据是在一个“连接”中发送的,实际上它要跨越千山万水,经过无数次转发,过滤,才能最终抵达终点。在这过程中,中间节点的处理方法很可能会让你意想不到。比如说,这些坑爹的中间节点可能会认为一份连接在一段时间内没有数据发送就等于失效,它们会自作主张的切断这些连接。在这种情况下,不论服务器还是客户端都不会收到任何提示,它们只会一厢情愿的以为彼此间的红线还在,徒劳地一边又一边地发送抵达不了彼岸的信息。而计算机网络协议栈的实现中又会有一层套一层的缓存,除非填满这些缓存,你的程序根本不会发现任何错误。这样,本来一个美好的 WebSocket 长连接,就可能在毫不知情的情况下进入了半死不活状态。而解决方案,WebSocket 的设计者们也早已想过。就是让服务器和客户端能够发送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。

websocket原理是什么?

它的工作原理是Pub-Sub(发布和订阅)。它适用于发送者将数据(发布者)发送给抽象数量的收件人(订阅者),而无需指定他们是谁。根据定义,WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。此WebSocket API可在用户的浏览器和服务器之间进行双向通信。用户可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器。它可以让多个用户连接到同一个实时服务器,并通过API进行通信并立即获得响应。WebSockets允许用户和服务器之间的流连接,并允许即时信息交换。在聊天应用程序的示例中,通过套接字汇集消息,可以实时与一个或多个用户交换,具体取决于谁在服务器上“监听”(连接)。WebSockets不仅限于聊天/消息传递应用程序。它们适用于需要实时更新和即时信息交换的任何应用程序。一些示例包括但不限于:现场体育更新,股票行情,多人游戏,聊天应用,社交媒体等等。WebSockets还会考虑代理和防火墙等危险,使得任何连接都可以进行流式传输。它支持单个连接的上游和下游通信。它还减轻了服务器的负担,允许现有机器支持同时连接。

php实现websocket实时消息推送

一、socket协议的简介 WebSocket是什么,有什么优点 WebSocket是一个持久化的协议,这是相对于http非持久化来说的。应用层协议 举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client只需进行一次握手,成功后即可持续进行数据通信,值得关注的是WebSocket实现client与server之间全双工通信,即server端有数据更新时可以主动推送给client端。 二、介绍client与server之间的socket连接原理 1、下面是一个演示client和server之间建立WebSocket连接时握手部分 2、client与server建立socket时握手的会话内容,即request与response a、client建立WebSocket时向服务器端请求的信息 GET /chat HTTP/1.1   Host: server.example.com   Upgrade: websocket //告诉服务器现在发送的是WebSocket协议   Connection: Upgrade   Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理   Sec-WebSocket-Protocol: chat, superchat   Sec-WebSocket-Version: 13   Origin: http://example.com b、服务器获取到client请求的信息后,根据WebSocket协议对数据进行处理并返回,其中要对Sec-WebSocket-Key进行加密等操作 HTTP/1.1 101 Switching Protocols   Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket   Connection: Upgrade   Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证   Sec-WebSocket-Protocol: chat 3、socket建立连接原理图: 三、PHP中建立websocket的过程讲解 SocketService.php: web.html:

WebSocket+SLB(负载均衡)会话保持解决重连问题

写在最前面:由于现在游戏基本上采用全球大区的模式,全球玩家在同一个大区进行游戏,传统的单服模式已经不能够满足当前的服务需求,所以现在游戏服务器都在往微服务架构发展。当前我们游戏也是利用微服务架构来实现全球玩家同服游戏。 玩家每次断线(包括切换网络/超时断线)后应该会重新连接服务器,重连成功的话可以继续当前情景继续游戏,但是之前写的底层重连机制一直不能生效,导致每次玩家断线后重连都失败,要从账号登陆开始重新登陆,该文章写在已经定位了重连问题是由SLB引起后,提出的解决方案。 每次重连后,客户端向SLB发送建立连接,SLB都会重新分配一个网关节点,导致客户端连接到其他网关,重连失败。 会话保持的作用是什么? 开启SLB会话保持功能后,SLB会记录客户端的IP地址,在一定时间内,自动将同一个IP的连接转发到上次连接的网关。 在网络不稳定的情况下,游戏容易心跳或者发包超时,开启会话保持,能解决大部分情况下的重连问题。 但是在切换网络的时候,手机网络从Wifi切换成4G,自身IP会变,这时候连接必定和服务器断开,需要重新建立连接。由于IP已经变化,SLB不能识别到是同一个客户端发出的请求,会将连接转发到其他网关节点。所以使用TCP连接的情况下,SLB开启会话保持并不能解决所有的重连问题。 另外某些时刻,手机频繁开启和断开WI-FI,有时候可能不会断开网络,这并不是因为4G切换WI-FI时网络没断开,从4G切换到Wi-Fi网络,因为IP变了,服务器不能识别到新的IP,连接肯定是断开的。这时候网络没断开,主要是因为现在智能手机会对4G和Wi-Fi网络做个权重判断,当Wi-Fi网络频繁打开关闭时,手机会判断Wi-Fi网络不稳定,所有流量都走4G。所以网络没断开是因为一直使用4G连接,才没有断开。想要验证,只需要切换Wi-Fi时,把4G网络关闭,这样流量就必定走Wi-Fi。 上面说过,四层的TCP协议主要是基于IP来实现会话保持。但是切换网络的时候客户端的IP会变。所以要解决切换网络时的重连问题,只有两个方法:1. 当客户端成功连接网关节点后,记录下网关节点的IP,下次重连后不经过SLB,直接向网关节点发送连接请求。2.使用 SLB的七层(HTTP)转发服务。 当客户端经过SLB将连接转发到网关时,二次握手验证成功后向客户端发送自己节点的IP,这样客户端下次连接的时候就能直接连接网关节点。但是这样会暴露网关的IP地址,为安全留下隐患。 如果不希望暴露网关的IP地址,就需要增加一层代理层,SLB将客户端请求转发到代理层,代理层再根据客户端带有的key,转发到正确的网关节点上。增加一层代理层,不仅会增加请求的响应时间,还会增加整体框架的复杂度。 阿里云的七层SLB会话保持服务,主要是基于cookie的会话保持。客户端在往服务器发送HTTP请求后,服务器会返回客户端一个Response,SLB会在这时候,将经过的Response插入或者重写cookie。客户端获取到这个cookie,下次请求时会带上cookie,SLB判断Request的Headers里面有cookie,就将连接转发到之前的网关节点。 HTTP是短链接,我们游戏是长连接,所以用HTTP肯定不合适。但是可以考虑基于HTTP的WebSocket。 什么是WebSocket? WSS(Web Socket Secure)是WebSocket的加密版本。 SLB对WebSocket的支持 查看阿里云SLB文档对WS的支持,说明SLB是支持WS协议的,并且SLB对于WS无需配置,只需要选用HTTP监听时,就能够转发WS协议。说明WS协议在SLB这边看来就是一个HTTP,这样WS走的也是七层的转发服务。只要SLB能够正常识别WS握手协议里Request的cookie和正常识别服务器返回的Response并且往里面插入cookie,就可以利用会话保持解决重连问题。 Go语言实现WS服务器有两种方法,一种是利用golang.org/x/net下的websocket包,另外一种方法就是自己解读Websocket协议来实现,由于WS协议一样是基于TCP协议之上,完全可以通过监听TCP端口来实现。 客户端发送Request消息 服务器返回Response消息 其中服务器返回的Sec-WebSocket-Accept字段,主要是用于客户端需要验证服务器是否支持WS。RFC6455文档中规定,在WebSocket通信协议中服务端为了证实已经接收了握手,它需要把两部分的数据合并成一个响应。一部分信息来自客户端握手的Sec-WebSocket-Keyt头字段:Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==。对于这个字段,服务端必须得到这个值(头字段中经过base64编码的值减去前后的空格)并与GUID"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"组合成一个字符串,这个字符串对于不懂WebSocket协议的网络终端来说是不能使用的。这个组合经过SHA-1掩码,base64编码后在服务端的握手中返回。如果这个Sec-WebSocket-Accept计算错误浏览器会提示:Sec-WebSocket-Accept dismatch 如果返回成功,Websocket就会回调onopen事件 游戏服务器的使用的TCP协议,是在协议的包头使用4Byte来声明本协议长度,然后将协议一次性发送。但是在WS协议是通过Frame形式发送的,会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处: websocket的协议格式: 参数说明如下: 阿里云的SLB开启HTTP监听后,会检查过往的Request和Response请求,收到服务器返回的Response后,会往Response插入一个Cookie 客户端收到服务器的Response后,可以在Header中查到有个“Set-Cookie”字段,里面是SLB插入的Cookie值 客户端断开连接后,下次发送请求需要往Headers插入Cookie字段 分别在阿里云的两台ECS实例上部署WS服务器,打开8000端口,开启一个SLB服务,SLB服务选择HTTP方式监听,并且打开会话保持功能,Cookie处理方式选择植入Cookie。Demo服务器没有做HTTP健康监听的处理,健康检查这块可以先关掉。 在两台ECS上启动WS服务器,然后本地运行客户端,分别测试两台服务器是否能正常连接,测试完毕后,测试SLB能否正常工作。服务器和SLB都正常的情况下,运行客户端,客户端会得到以下结果 收到的三次Cookie都相同,说明Cookie是有正常植入工作的,并且三次都被SLB正确抓取了。 收到的三次serverId也都是同样的值,说明三次都是同一个ECS上的服务器响应。 至此,验证成功。 Websocket+SLB会话保持能够解决超时重连和切换网络时重连的问题。 参考: 阿里云会话保持 解答Wi-Fi与4G网络切换的困惑 WebSocket的实现原理 阿里云SLB对WebSocket的支持 HTTP Headers和Cookie

websocket 高性能 实战

疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【 博客园总入口 】 架构师成长+面试必备之 高并发基础书籍 【 Netty Zookeeper Redis 高并发实战 】 很多项目,都需要基于 Websocket 协议做在线客服、在线推送、在线聊天,虽然 Tomcat 内置支持 Websocket 协议,但是由于 Tomcat 的吞吐量、连接数都很低,作为测试是可以的。 在生产环境,一定需要使用高吞吐量、高连接数的 Netty 服务器进行替代 。 之所以 Netty 性能高,因为其使用的是 Reactor 反应器模式。关于反应器模式原理,请参见 《Netty Zookeeper Redis 高并发实战》 一书。 聊天过程gif 演示: 聊天示意图: Netty搭建的服务器基本上都是差不多的写法: 绑定主线程组和工作线程组,这部分对应架构图中的事件循环组。其原理,,请参见 《Netty Zookeeper Redis 高并发实战》 一书。 重点就是ChannelInitializer的配置,以异步的方式启动,最后是结束的时候关闭线程组。 下面是用websocket做聊天室的逻辑: 源码网址: Java 高并发研习社群 【 博客园 总入口 】 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 面试必备 + 面试必备

netty系列之:使用netty搭建websocket客户端

在网速快速提升的时代,浏览器已经成为我们访问各种服务的入口,很难想象如果离开了浏览器,我们的网络世界应该如何运作。现在恨不得把操作系统都搬上浏览器。但是并不是所有的应用都需要浏览器来执行,比如服务器和服务器之间的通信,就需要使用到自建客户端来和服务器进行交互。 本文将会介绍使用netty客户端连接websocket的原理和具体实现。 在介绍netty客户端之前,我们先看一个简单的浏览器客户端连接websocket的例子: 这里使用了浏览器最通用的语言javascript,并使用了浏览器提供的websocket API进行操作,非常的简单。 那么用netty客户端实现websocket的连接是否和javascript使用一样呢?我们一起来 探索 。 先看看netty对websocket的支持类都有哪些,接着我们看下怎么具体去使用这些工具类。 和websocket server一样,client中最核心的类也是handshaker,这里叫做WebSocketClientHandshaker。这个类有什么作用呢?一起来看看。 这个类主要实现的就是client和server端之间的握手。 我们看一下它的最长参数的构造类: 参数中有websocket连接的URI,像是:”ws://flydean.com/mypath”。 有请求子协议的类型subprotocol,有自定义的HTTP headers:customHeaders,有最大的frame payload的长度:maxFramePayloadLength,有强制timeout关闭的时间,有使用HTTP协议进行升级的URI地址。 怎么创建handshaker呢?同样的,netty提供了一个WebSocketClientHandshakerFactory方法。 WebSocketClientHandshakerFactory提供了一个newHandshaker方法,可以方便的创建各种不同版本的handshaker: 可以看到,根据传入协议版本的不同,可以分为WebSocketClientHandshaker13、WebSocketClientHandshaker08、WebSocketClientHandshaker07、WebSocketClientHandshaker00这几种。 通常来说,对于webSocket协议,为了提升传输的性能和速度,降低网络带宽占用量,在使用过程中通常会带上额外的压缩扩展。为了处理这样的压缩扩展,netty同时提供了服务器端和客户端的支持。 对于服务器端来说对应的handler叫做WebSocketServerCompressionHandler,对于客户端来说对应的handler叫做WebSocketClientCompressionHandler。 通过将这两个handler加入对应pipline中,可以实现对websocket中压缩协议扩展的支持。 对于协议的扩展有两个级别分别是permessage-deflate和perframe-deflate,分别对应PerMessageDeflateClientExtensionHandshaker和DeflateFrameClientExtensionHandshaker。 至于具体怎么压缩的,这里就不详细进行讲解了, 感兴趣的小伙伴可以自行了解。 前面讲解了netty对websocket客户端的支持之后,本节将会讲解netty到底是如何使用这些工具进行消息处理的。 首先是按照正常的逻辑创建客户端的Bootstrap,并添加handler。这里的handler就是专门为websocket定制的client端handler。 除了上面提到的WebSocketClientCompressionHandler,就是自定义的handler了。 在自定义handler中,我们需要处理两件事情,一件事情就是在channel ready的时候创建handshaker。另外一件事情就是具体websocket消息的处理了。 首先使用WebSocketClientHandshakerFactory创建handler: 然后在channel active的时候使用handshaker进行握手连接: 然后在进行消息接收处理的时候还需要判断handshaker的状态是否完成,如果未完成则调用handshaker.finishHandshake方法进行手动完成: 当handshake完成之后,就可以进行正常的websocket消息读写操作了。 websocket的消息处理比较简单,将接收到的消息转换成为WebSocketFrame进行处理即可。 本文讲解了netty提供的websocket客户端的支持和具体的对接流程,大家可以再次基础上进行扩展,以实现自己的业务逻辑。 本文的例子可以参考:learn-netty4

如何利用websocket实现双屏互动体验

双屏互动原理描述:现在多数双屏互动的实现方式主要是依靠浏览器的WebSocket即时通信技术,包括国外许多案例,在以前传统的网站为了实现这种技术基本都是轮询,在一个特定的时间内,由客户端向服务端发出请求,之后服务器返回到浏览器,这种传统的实现方法需要客户端不停的向服务端请求数据,而且其传输的数据可能是一个很小的值。在 WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后浏览器和服务器之间就形成了一条快速通道,两者之间就可以直接实时的互相传送数据。采用websocket技术的页面不同于普通页面,而是需要特殊的服务器环境支持。 服务器环境的搭建:目前支持WebSocket环境有很多方式,比如PHP、Java、.Net、Tomcat、Nodejs等,还有html5 的websocket方案,但是目前在我国浏览器使用情况上,IE用户还占有50%左右的市场份额,html5 的websocket只能支持IE10+和其他高端浏览器,在兼容性方面socket.io做的很好,所以对于前端工程师,我们优先选Nodejs和socket.io来搭建WebSocket服务器端。前期我们可以在自己电脑搭建与服务器一致的环境来测试,本地搭建的方法:1. 下载官方Node.js,安装可以一直下一步,我个人习惯都会自定义安装软件2. 安装Nodejs 的模块管理器npm(官网最新版Nodejs已集成,无需单独安装)3. 命令窗口模式安装 socket.io(npm install socket.io)(这里如果遇到安装不成功情况,注意考虑设置一下代理,设置方法:npm config set proxy=地址:端口号,运气实在不好的话从其他电脑复制同版本文件夹也一样)4. 最后查看安装的模块及版本:npm list

websocket服务能与socket服务通信么

Socket,WebSocket,Http,Tcp等这些我们已经听的耳朵有茧了,但是用得时候还是复习一下吧。 大学学习网络基础的时候老师讲过,网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍: “我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。” 而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理解: “TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。” 关于TCP/IP协议的相关只是,用博大精深来讲我想也不为过,单单查一下网上关于此类只是的资料和书籍文献的数量就知道,这个我打算会买一些经典的书籍(比如《TCP/IP详解:卷一、卷二、卷三》)进行学习,今天就先总结一些基于基于TCP/IP协议的应用和编程接口的知识,也就是刚才说了很多的HTTP和Socket。 CSDN上有个比较形象的描述: HTTP是轿车,提供了封装或者显示数据的具体形式; Socket是发动机,提供了网络通信的能力。 实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。 下面是一些经常在笔试或者面试中碰到的重要的概念,特在此做摘抄和总结。一什么是TCP连接的三次握手第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)二利用Socket建立网络连接的步骤建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。3、连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。三HTTP链接的特点 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。 HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。四、TCP和UDP的区别(考得最多。。快被考烂了我觉得)1、TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。2、也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。 简单总结:HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的。TCP协议: 对应于传输层。IP协议: 对应于网络层。TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。HTTP连接:HTTP连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;Socket连接:Socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个Socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的。WebSocket WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协定于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。 在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP request的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源。 而比较新的技术去做轮询的效果是Comet,使用了AJAX。但这种技术虽然可达到双向通信,但依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源。 面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。握手协议在实现Websocket连线过程中,需要透过浏览器发出Websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” (handshaking)。PS:后期的版本大多属于功能上的扩充,例如使用第7版的握手协议同样也适用于第8版的握手协议。浏览器请求GET / HTTP/1.1Upgrade: websocketConnection: UpgradeHost: example.comOrigin: nullSec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==Sec-WebSocket-Version: 13服务器回应HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=Sec-WebSocket-Origin: nullSec-WebSocket-Location: ws://example.com/原理在请求中的“Sec-WebSocket-Key”是随机的,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个魔幻字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。使用 SHA-1 加密,之后进行 BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。客户端的Websocket对象一共绑定了四个事件:1、onopen:连接建立时触发;2、onmessage:收到服务端消息时触发;3、onerror:连接出错时触发;4、onclose:连接关闭时触发;有了这4个事件,我们就可以很容易很轻松的驾驭websocket,并且需要说明的是websocket支持二进制数据的传输,因此,它远不止聊天室应用这么简单。WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了使用ws或wss协议的单个的TCP套接字,可用于任意的客户端和服务器程序WebSocket API最伟大之处在于在任意时刻服务器和客户端可以相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket是允许跨域通信。

朋友们,html websocket是同步的吗?如何实现异步

g因为http有同步和异步发送,我在刷新浏览器的时候,是可以捕获到浏览器刷新时间,向服务器发送请求,这时候是发送同步请求,如果服务端不响应,我不关闭浏览器,就是保证这个请求不中断,但是用websokcet发送不出去,因为浏览器刷新,请求中断了,

如何使用WebSocket

WebSocket的出现是基于Web应用的实时性需要而产生的。这种实时的Web应用大家应该不陌生,在生活中都应该用到过,比如新浪微博的评论、私信的通知,腾讯的WebQQ等。让我们来回顾下实时 Web 应用的窘境吧。在WebSocket出现之前,一般通过两种方式来实现Web实时用:轮询机制和流技术;其中轮询有不同的轮询,还有一种叫Comet的长轮询。轮询:这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的方式来保持客户端和服务器端的同步。这种同步方案的缺点是,当客户端以固定频率向服务 器发起请求的时候,服务器端的数据可能并没有更新,这样会带来很多无谓的网络传输,所以这是一种非常低效的实时方案。长轮询:是对定时轮询的改进和提高,目地是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变或者 时间过期,通过这种机制来减少无效的客户端和服务器间的交互。当然,如果服务端的数据变更非常频繁的话,这种机制和定时轮询比较起来没有本质上的性能的提 高。流:常就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新连接状态以保证客户端和服务 器端的连接不过期。通过这种机制可以将服务器端的信息源源不断地推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进 用户体验,同时这种机制在并发比较大的情况下,对服务器端的资源是一个极大的考验。上述方式其实并不是真正的实时技术,只是使用了一种技巧来实现的模拟实时。在每次客户端和服务器端交互的时候都是一次 HTTP 的请求和应答的过程,而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量。但这些方式最痛苦的是开发人员,因为不论客户端还是服务器端的实现都很复杂,为了模拟比较真实的实时效果,开发人员 往往需要构造两个HTTP连接来模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务器端的数据传输,一个连接用来处理服务器端到客户端的数 据传输,这不可避免地增加了编程实现的复杂度,也增加了服务器端的负载,制约了应用系统的扩展性。基于上述弊端,实现Web实时应用的技术出现了,WebSocket通过浏览器提供的API真正实现了具备像C/S架构下的桌面系统的实时通讯能 力。其原理是使用JavaScript调用浏览器的API发出一个WebSocket请求至服务器,经过一次握手,和服务器建立了TCP通讯,因为它本质 上是一个TCP连接,所以数据传输的稳定性强和数据传输量比较小。WebSocket 协议WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。下面我们来详细介绍一下 WebSocket 协议,由于这个协议目前还是处于草案阶段,版本的变化比较快,我们选择目前最新的 draft-ietf-hybi-thewebsocketprotocol-17 版本来描述 WebSocket 协议。因为这个版本目前在一些主流的浏览器上比如 Chrome,、FireFox、Opera 上都得到比较好的支持。通过描述可以看到握手协议客户端发到服务器的内容: 代码如下 复制代码 GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13从服务器到客户端的内容: 代码如下 复制代码 HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat这些请求和通常的 HTTP 请求很相似,但是其中有些内容是和 WebSocket 协议密切相关的。我们需要简单介绍一下这些请求和应答信息,”Upgrade:WebSocket”表示这是一个特殊的 HTTP 请求,请求的目的就是要将客户端和服务器端的通讯协议从 HTTP 协议升级到 WebSocket 协议。其中客户端的Sec-WebSocket-Key和服务器端的Sec-WebSocket-Accept就是重要的握手认证信息了,这些内容将在服 务器端实现的博文中讲解。相信通过上文的讲解你应该对WebSocket有了个初步认识了,如果有任何疑问欢迎交流。 客户端如概念篇中介绍的握手协议,客户端是由浏览器提供了API,所以只要使用JavaScript来简单调用即可,而服务器端是要自己实现的,服务器端将在下个博文来讲。 代码如下 复制代码 WebSocket JavaScript 接口定义:[Constructor(in DOMString url, optional in DOMString protocol)]interface WebSocket {readonly attribute DOMString URL;// ready stateconst unsigned short CONNECTING = 0;const unsigned short OPEN = 1;const unsigned short CLOSED = 2;readonly attribute unsigned short readyState;readonly attribute unsigned long bufferedAmount; // networkingattribute Function onopen;attribute Function onmessage;attribute Function onclose;boolean send(in DOMString data);void close();};WebSocket implements EventTarget; 简单了解下接口方法和属性:readyState表示连接有四种状态:CONNECTING (0):表示还没建立连接;OPEN (1): 已经建立连接,可以进行通讯;CLOSING (2):通过关闭握手,正在关闭连接;CLOSED (3):连接已经关闭或无法打开;url是代表 WebSocket 服务器的网络地址,协议通常是”ws”或“wss(加密通信)”,send 方法就是发送数据到服务器端;close 方法就是关闭连接;onopen连接建立,即握手成功触发的事件;onmessage收到服务器消息时触发的事件;onerror异常触发的事件;onclose关闭连接触发的事件;JavaScript调用浏览器接口实例如下: 代码如下 复制代码 var wsServer = "ws://localhost:8888/Demo"; //服务器地址var websocket = new WebSocket(wsServer); //创建WebSocket对象websocket.send("hello");//向服务器发送消息alert(websocket.readyState);//查看websocket当前状态websocket.onopen = function (evt) {//已经建立连接};websocket.onclose = function (evt) {//已经关闭连接};websocket.onmessage = function (evt) {//收到服务器消息,使用evt.data提取};websocket.onerror = function (evt) {//产生异常};

如何使用WebSocket做接口测试?

如果遇见了一个全新的协议,怎么从零开始,完成接口测试?以 WebSocket 为例。 WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。 WebSocket 的其他特点: 1. 建立在 TCP 协议之上,服务器端的实现比较容易。 2. 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 3. 数据格式比较轻量,性能开销小,通信高效。 4. 可以发送文本,也可以发送二进制数据。 5. 没有同源限制,客户端可以与任意服务器通信。 6. 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。 · ws–>http(未加密) 无证书 · wss–>https(加密) 有证书 第一步: 很多时候第一反应向开发工程师求助,因为开发工程师基于新协议已经完成了接口开发,向开发工程师求助显然是最好的办法。找到一些学习脉络,包含了协议的说明文档、代码开发文档、实现代码等内容,了解协议的原理。向开发求助是个方法。 那么 WebSocket 用 Fiddler 怎么搞定?,其实主要就是修改了 Fiddler 中 Rules 下的 Customize Rules,如果感兴趣可以自己去搜一下。当面对陌生技术问题的时候,应该使用最熟悉的技术去尝试解决问题。虽然 Fiddler 截获 WebSocket 接口的办法,所截获的全部消息都在日志里面,根本无法操作。但是,可以借助 Fiddler 分析 WebSocket 的接口,一开始给 Fiddler 这款工具的定位一样,那就是通过它辅助分析我们的被测接口。处理HTTP、HTTPS,推荐用Fiddler。 但是在处理TCP,UDP 就用WireShark。Websocket是应用层协议,建立在 TCP 协议之上,服务器端的实现比较容易。因为应用层是在传输层的基础上包装数据,所以我们还是从底层开始了解Websocket到底是个啥?是如何工作的? 可以通过---- wireshark(网络封包分析软件)抓包工具抓到WebSocket接口 wireshark下载地址:https://www.wireshark.org/download.html 以下是python实现的websocket 接口连接。

怎样用java web和websocket实现网页即时通讯

java 后台做 websocket 服务端。 页面使用js的websocket客户端 连接上 服务端 就能实时通信了。
 首页 上一页  9 10 11 12 13 14 15 16 17 18 19  下一页  尾页