当前位置: 首页 > news >正文

做外包胡it网站网站制作公透明清晰

做外包胡it网站,网站制作公透明清晰,wordpress美化,网站广东省备案讨论Socket必讨论长连接和短连接 一、长连接和短连接的概念 1、长连接与短连接的概念#xff1a;前者是整个通讯过程#xff0c;客户端和服务端只用一个Socket对象#xff0c;长期保持Socket的连接#xff1b;后者是每次请求#xff0c;都新建一个Socket,处理完一个请求就… 讨论Socket必讨论长连接和短连接 一、长连接和短连接的概念   1、长连接与短连接的概念前者是整个通讯过程客户端和服务端只用一个Socket对象长期保持Socket的连接后者是每次请求都新建一个Socket,处理完一个请求就直接关闭掉Socket。所以其实区分长短连接就是整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的。   可能你会想这还不简单长连接不就是不关Socket嘛短连接不就是每次都关Socket每次都new Socket嘛。然而事实其实并没有那么简单的请继续看下面的整理   2、关闭流而保持Socket正常?     在网上百度了一下发现很多人都是以关闭流还是关闭Socket来区分长连接和短连接的其实个人感觉这种区分方法并没有什么意义因为这里面有一个事实是流关闭之后便不能进行消息的发送对应关闭输出流或者接受对应关闭输入流因为其实关闭了对应的流对应连接也就关闭了这里所说的连接是发送消息的通道所以流关闭而保持Socket开启是没有达到长连接的效果贴上测试代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 //发送核心方法     public String send(String send) throws IOException {         String rtn  null;         BufferedWriter writer  null;         OutputStreamWriter ow  null;         OutputStream os  null;         try{             os socket.getOutputStream();             ow  new OutputStreamWriter(os);             writer  new BufferedWriter(ow);             char [] sendChar send.toCharArray();             ArrayListInteger list  new ArrayListInteger();             for(char ch:sendChar){                 list.add((int)ch);             }             //进行加密操作             list encry(list);             IteratorInteger it list.iterator();             while(it.hasNext()){                 writer.write(it.next());             }             writer.flush();             rtn  发送成功;         }finally{             //注意直接关闭流将会导致socket关闭只能通过shutdownOutput/input的方式关闭流             //另外流关闭之后相当于关闭底层的连接除非新new个socket否则和客户端的连接相当于断开 //          if(writer!null){ //              writer.close(); //          } //          if(ow!null){ //              ow.close(); //          } //          if(os!null){                 //os.close(); //          }             //socket.shutdownOutput();流关闭之后相当于关闭底层的连接除非新brnew个socket否则和客户端的连接相当于断开         }         return rtn;     }   这是我写的一个测试的发送消息的核心方法在关闭了对应的流无论是输出或者输入之后下一次调用getInputStream或者getOutputStream会抛出异常说Socket is closed这里讲明一个事实Socket和流联系着流关闭了Socket其实也就相当于关闭状态   其实这个也很好理解Socket本来就是依靠流进行关闭的流就只有一个你关闭了流Socket赖以通讯的渠道也就关闭了与客户的连接也断开了所以抛出异常是很合理的。   所以流关闭而要求Socket正常通讯是不可能的   所以如何实现长连接 二、长连接的正确实现方式   1、不关闭流实现长连接     前面讨论了流关闭了而不关闭Socket还是无法达到长连接的效果的所以要长连接流必须不能关闭那么是不是直接不关闭流然后每次要发消息就直接往流里面任进去数据然后调用flush()方法强制刷新就行了其实不行的这样客户端是无法正常接收信息的你会发觉就算服务端flush了客户端还是会一直在read方法那里阻塞具体原因各位可以看一下java api文档的截图    文档说明了如果流一直可用而且没有读到流的末尾就是对应着对方流已经关闭或者网络断开read会一直阻塞其实这样做也是可以解释清楚的本来服务端的read方法就不知道Server端的消息什么时候发送完说不定我以为数据发送完 了但其实是因为网络延迟而导致部分数据延后到来况且也不可能所有数据同时到达所以read方法只能一直在阻塞等待对方的应答。所以怎么实现长连接   2、实现长连接的方法   A、客户端自动退出开读取的动作。前面说了就算服务端调用了flush方法进行输出刷新客户端也不一定能退出read的动作所以还是会阻塞。所以退出动作必须有客户端程序自己完成我们可以在服务端没发送完一段消息并且刷新前就进行一个写入结束符号的标志客户端解析到结束符号时变可直接退出read的循环读取操作避免一直阻塞。   B、可以调用有读取一定字节到某个数组的read方法不过好像这个不太行毕竟每次消息的长度好像会变的当然这只是针对消息定长的情况。   下面贴上长连接实现后的代码其实就是比前面的代码加多了读入结束标记符号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 //发送核心方法     public String send(String send) throws IOException {         String rtn  null;         BufferedWriter writer  null;         OutputStreamWriter ow  null;         OutputStream os  null;         try{             os socket.getOutputStream();             ow  new OutputStreamWriter(os);             writer  new BufferedWriter(ow);             char [] sendChar send.toCharArray();             ArrayListInteger list  new ArrayListInteger();             for(char ch:sendChar){                 list.add((int)ch);             }             //进行加密操作             list encry(list);             IteratorInteger it list.iterator();             while(it.hasNext()){                 writer.write(it.next());             }             //写入结束标志符号%             writer.write(%);             writer.flush();             rtn  发送成功;         }finally{             //注意直接关闭流将会导致socket关闭只能通过shutdownOutput/input的方式关闭流             //另外流关闭之后相当于关闭底层的连接除非新new个socket否则和客户端的连接相当于断开 //          if(writer!null){ //              writer.close(); //          } //          if(ow!null){ //              ow.close(); //          } //          if(os!null){                 //os.close(); //          }             //socket.shutdownOutput();流关闭之后相当于关闭底层的连接除非新new个socket否则和客户端的连接相当于断开         }         return rtn;     }  三、短连接     短连接就基本没什么好讲的啦只是每次关闭Socket和流时需要注意一下事情     1、虽然前面说了流关闭了Socket就不可用了但是我们还是要显式的关闭Socket的因为在Socekt中还有中状态叫做半连接状态当我们只是用到输出流的时候我们关闭了输出流,并且不能直接调用close方法只能调用shutDown对应方法具体请查看java API其实输入流还是连接着的只是我们没有用到而已这时候如果没有显式关闭Soceket很容易导致内存泄露所以所有流Socket都要显式关闭     2、短连接和长连接有不同的用途对于某次服务只需要一次回话的客户使用短连接显得简单但是如果该次服务需要很多交互式的操作通信那还是长连接比较高性能毕竟Socket的打开和关闭都是很耗性能的。   四、总结   1、对应流关闭Socket的对应输入出数据的通道也就关闭此时无法达到长连接效果   2、关闭Socket记得显式关闭流与socket,顺序是线管流再关socket.   3、要实先长连接一般需要发送结束标记符号来告诉客户端服务端的某段消息已经发送完毕否则客户端会一直阻塞在read方法。   原文转载https://www.cnblogs.com/lcplcpjava/p/6581179.html   转载于:https://www.cnblogs.com/AndyAo/p/8232700.html
http://www.yutouwan.com/news/326991/

相关文章:

  • 做网站用什么语音深圳网络营销十年乐云seo专家
  • 网站开发人员考核指标手机访问网站页面丢失
  • 培训加盟网站建设wordpress手机访问主题
  • 普通网站和营销型网站的区别是什么企业邮箱注册申请免费163
  • 网站开发价格预算在线oa免费crm
  • 宣传展示型网站设计免费信息发布网站有哪些
  • 站长源码论坛南宁网站建设云尚网络
  • 建设网站买了域名还要什么资料系统网站推广方案怎么做
  • 上海高端网站定设计师做私单网站
  • 让网站快速收录中国城乡住房建设厅网站首页
  • 微信 购物网站开发做网站的备案
  • 学校设计网站方案简述建站流程
  • 北京网站建设招聘榆林市建设局官方网站
  • 创造网站的最简单 软件是哪个河南网站优化要多少钱
  • 建设网站时的故障分类wordpress yum
  • 网站费用标准云存储能用来做网站吗
  • 什么公司做网站最好wordpress滑动显示分类文章
  • 整站优化seo平台淄博做网站的网络公司
  • 域名注册网站大全做pc端网站渠道
  • 网站建设合同书缴纳印花税吗大良营销网站建设新闻
  • php简易购物网站开发做网站6个月心得
  • 网站建设合同 售后维护期网站建设多少钱一个平台
  • 网站不兼容360浏览器扬州网站建设哪家公司好
  • 阿里云虚拟主机搭建wordpressseo的优点和缺点
  • 网站开发人员属于什么软件wordpress自动识别网页
  • 青海宾馆网站建设公司家装设计方案ppt案例
  • 电脑网站加速器简单网页设计模板html
  • 网站移动排名wordpress edd 会员
  • 购物网站如何做推广淘宝网站建设教程视频教程
  • 如何优化网站代码珠海网站设计培训