{"id":510,"date":"2016-05-12T13:12:53","date_gmt":"2016-05-12T05:12:53","guid":{"rendered":"http:\/\/www.xttblog.com\/?p=510"},"modified":"2016-05-12T14:19:33","modified_gmt":"2016-05-12T06:19:33","slug":"%e8%af%a6%e8%a7%a3nio%e6%a1%86%e6%9e%b6mina%e7%9a%84%e7%bc%96%e8%a7%a3%e7%a0%81%e7%9a%84%e5%ba%94%e7%94%a8%e5%ae%9e%e4%be%8b","status":"publish","type":"post","link":"https:\/\/www.xttblog.com\/?p=510","title":{"rendered":"\u8be6\u89e3NIO\u6846\u67b6Mina\u7684\u7f16\u89e3\u7801\u7684\u5e94\u7528\u5b9e\u4f8b"},"content":{"rendered":"<p>\n\t\u8bf4\u5230NIO\u6846\u67b6\uff0c\u76ee\u524d\u6700\u6d41\u884c\u7684\u6709Mina\u3001Jetty\u3001HP-Socket\u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u539f\u7406\u57fa\u672c\u76f8\u540c\uff0c\u53ea\u662f\u5728\u7ec6\u8282\u4e0a\u6709\u4e9b\u533a\u522b\u3002\u8bf4\u5230\u7f51\u7edc\u7f16\u7a0b\uff0c\u5c31\u79bb\u4e0d\u5f00\u7f16\u89e3\u7801\uff0cNIO\u7684\u6838\u5fc3\u4e5f\u5c31\u662f\u8ba9\u6211\u4eec\u5b9e\u73b0\u7f16\u89e3\u7801\uff0c\u66f4\u591a\u7684\u5173\u6ce8\u4e8e\u4e1a\u52a1\uff0c\u800c\u4e0d\u518d\u5173\u6ce8\u67b6\u6784\u7684\u8bbe\u8ba1\u3002\u5982\u679c\u4f60\u4f1a\u4e86\u7f16\u89e3\u7801\uff0c\u90a3\u4e48\u7f51\u7edc\u7f16\u7a0b\u5c31\u4e0d\u518d\u662f\u95ee\u9898\u3002<br \/>\n\t\u4eca\u5929\u5c0f\u7f16\u5c31\u4e3a\u5927\u5bb6\u8be6\u7ec6\u7684\u5b9e\u73b0\u4e00\u4e2a\u666e\u901a\u7684\u7f16\u89e3\u7801\u529f\u80fd\u3002\u5148\u6765\u770b\u4e00\u4e0b\u6211\u4eec\u7684\u534f\u8bae\uff1a<br \/>\n\t<img decoding=\"async\" alt=\"mina\u7f16\u89e3\u7801\u534f\u8bae\" src=\"http:\/\/img.my.csdn.net\/uploads\/201605\/12\/1463024968_9170.png\" \/><br \/>\n\t\u89e3\u7801\u4ee3\u7801\u5982\u4e0b\uff1a\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class XttblogDecoder extends CumulativeProtocolDecoder {\r\n&nbsp;&nbsp; &nbsp;private static final Logger log = Logger.getLogger(XttblogDecoder.class);\r\n&nbsp;&nbsp; &nbsp;private Charset charset =null;\r\n&nbsp;&nbsp; &nbsp;private static final String HUPU_TCP_BUFFER = &quot;xttblog_tcp_msg_buffer&quot;;\r\n&nbsp;&nbsp; &nbsp;\r\n&nbsp;&nbsp; &nbsp;public XttblogDecoder(Charset charset) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.charset=charset;\r\n&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;\r\n&nbsp;&nbsp; &nbsp;@Override\r\n&nbsp;&nbsp; &nbsp;protected boolean doDecode(IoSession session, IoBuffer ioBuffer, ProtocolDecoderOutput out) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return mergePocket(session, ioBuffer, out);\r\n&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;\r\n&nbsp;&nbsp; &nbsp;private boolean mergePocket(IoSession session, IoBuffer ioBuffer, ProtocolDecoderOutput out){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u4e0a\u4e00\u6b21\u672a\u5904\u7406\u5b8c\u7684byte\u6570\u7ec4 \uff0c\u5f53\u524d\u9700\u8981\u8bfb\u7684byte\u6570\u7ec4\uff0c\u4e24\u6b21\u5408\u8d77\u6765\u7684\u603bbyte\u6570\u7ec4\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte[] last_byte = {} , read_byte = null , total_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Object msg = session.getAttribute(HUPU_TCP_BUFFER);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;last_byte = (null == msg) ? last_byte : (byte[])msg;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u6ca1\u6709\u5269\u4e0b\u7684\u5219\u89e3\u6790\u5b8c\u6210\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(ioBuffer.hasRemaining()){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ioBuffer.order(ByteOrder.LITTLE_ENDIAN);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u83b7\u53d6\u6d88\u606f\u5269\u4e0b\u7684\u957f\u5ea6\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int bufLen = ioBuffer.remaining();\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;read_byte = new byte[bufLen];\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ioBuffer.get(read_byte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;total_byte = new byte[last_byte.length + read_byte.length];\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.arraycopy(last_byte, 0, total_byte, 0, last_byte.length);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.arraycopy(read_byte, 0, total_byte, last_byte.length, read_byte.length);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return decodePocket(session,out,total_byte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (last_byte.length &lt;= 0) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u5f53\u524d\u4e3a\u7a7a\u6570\u636e\u5305,\u7ee7\u7eed\u4e0b\u4e00\u6b21\u8bfb\u53d6\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return Boolean.TRUE;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return decodePocket(session,out,last_byte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;disposeTcpConnect(session);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;log.error(&quot;TCP\u534f\u8bae\u89e3\u7801\u5f02\u5e38&quot;+e.getMessage(),e);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} finally{\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/\u7b49\u5f85\u56de\u6536\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;last_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;read_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;total_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;msg = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return Boolean.FALSE;\r\n&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;\r\n&nbsp;&nbsp; &nbsp;private boolean decodePocket(IoSession session,ProtocolDecoderOutput out,byte [] bufByte){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int bufByteLen = bufByte.length;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u5982\u679c\u5b58\u5728\u5934\u90e8\u90e8\u5206\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(bufByteLen&gt;8){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;MessageInfo msgInfo = new MessageInfo();\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;msgInfo.setMsgIdentify((short) (((bufByte[1] &amp; 0xff) &lt;&lt; 8) | (bufByte[0] &amp; 0xff)));\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;msgInfo.setMsgBodySize(((bufByte[7] &amp; 0xff) &lt;&lt; 24) | ((bufByte[6] &amp; 0xff) &lt;&lt; 16) | ((bufByte[5] &amp; 0xff) &lt;&lt; 8) | (bufByte[4] &amp; 0xff));\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int msgLen = msgInfo.getMsgBodySize() + 8;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(bufByteLen &gt;= msgLen){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte [] body_byte = new byte[msgInfo.getMsgBodySize()];\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.arraycopy(bufByte, 8, body_byte, 0, body_byte.length);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;msgInfo.setMsgBody(new String(body_byte,charset));\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;out.write(msgInfo);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(bufByteLen == msgLen){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session.removeAttribute(HUPU_TCP_BUFFER);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return Boolean.TRUE;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte [] last_byte = new byte[bufByteLen - msgLen];\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.arraycopy(bufByte, msgLen , last_byte, 0, last_byte.length);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/\u5f53\u524d\u6570\u636e\u5305\u672a\u8bfb\u53d6\u5b8c\u6574,\u5b58\u50a8\u5230\u4f1a\u8bdd\u4e2d,\u7b49\u5f85\u4e0b\u6b21\u8bfb\u53d6\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session.setAttribute(HUPU_TCP_BUFFER, last_byte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(last_byte.length &gt; 8){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return decodePocket(session, out, last_byte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;body_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;last_byte = null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}else{\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session.setAttribute(HUPU_TCP_BUFFER, bufByte);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return Boolean.FALSE;\r\n&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;\r\n&nbsp;&nbsp; &nbsp;private void disposeTcpConnect(IoSession session){\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/ \u5173\u95ed\u4f1a\u8bdd\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (null != session) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session.close(true);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/\u5f88\u591a\u4eba\u56e0\u4e3a\u6ca1\u6709\u9500\u6bc1IoService\u51fa\u73b0\u6253\u5f00\u6587\u4ef6\u8fc7\u591a\u95ee\u9898\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;\/\/\u5177\u4f53\u6587\u7ae0\uff0c\u67e5\u770b\uff1ahttp:\/\/www.xttblog.com\/?p=446\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;session=null;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;log.error(&quot;\u5173\u95edTCP\u8fde\u63a5\u5f02\u5e38&quot; + e.getMessage(), e);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;}\r\n}<\/pre>\n<p>\n\t\u7f16\u7801\u4ee3\u7801\u5982\u4e0b\uff1a\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class XttblogEncoder extends ProtocolEncoderAdapter {\r\n&nbsp;&nbsp; &nbsp;private static final Logger log = Logger.getLogger(XttblogEncoder.class);\r\n&nbsp;&nbsp; &nbsp;private Charset charset = null;\r\n\r\n&nbsp;&nbsp; &nbsp;public XttblogEncoder(Charset charset) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.charset = charset;\r\n&nbsp;&nbsp; &nbsp;}\r\n\r\n&nbsp;&nbsp; &nbsp;public void encode(IoSession session, Object message,ProtocolEncoderOutput out) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;MessageInfo hmi = (MessageInfo) message;\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (null != hmi) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.order(ByteOrder.LITTLE_ENDIAN);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;byte[] bytearr = hmi.getMsgBody().getBytes(charset);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;hmi.setMsgBodySize(bytearr.length);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.putShort(hmi.getMsgIdentify());\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.putShort((short)0);\/\/\u4fdd\u7559\u5b57\u6bb5\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.putInt(hmi.getMsgBodySize());\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.put(bytearr);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;buf.flip();\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;out.write(buf);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;out.flush();\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e) {\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;log.error(&quot;TCP\u534f\u8bae\u7f16\u7801\u5f02\u5e38\uff01&quot;+e.getMessage(),e);\r\n&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}\r\n&nbsp;&nbsp; &nbsp;}\r\n}<\/pre>\n<p>\n\t<strong>\u7248\u6743\u58f0\u660e\uff1a\u672c\u6587\u4e3a\u535a\u4e3b\u539f\u521b\u6587\u7ae0\uff0c\u672a\u7ecf\u535a\u4e3b\u5141\u8bb8\u4e0d\u5f97\u8f6c\u8f7d\u3002<\/strong><\/p>\n<!-- <audio autoplay=\"autoplay\" height=\"100\" width=\"100\" hidden=\"true\"><source src=\"https:\/\/c.coka.la\/orAvPR.mp3\" type=\"audio\/mp3\"\/><\/audio><img decoding=\"async\" src=\"https:\/\/images.weserv.nl\/?url=https:\/\/ws3.sinaimg.cn\/large\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/> --><p><!-- <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/xmt1139057136\/xttblog\/master\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/>--><img decoding=\"async\" src=\"https:\/\/saas.51autoparts.cn\/api\/admin\/sys-file\/oss\/file?fileName=84db51f8561e448f9a4fda2eff0811f9.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/><\/p><p>\u6700\u540e\uff0c\u6b22\u8fce\u5173\u6ce8\u6211\u7684\u4e2a\u4eba\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e1a\u4f59\u8349\uff08yyucao\uff09\uff01<b>\u53ef\u52a0\u4f5c\u8005\u5fae\u4fe1\u53f7\uff1a<font color=\"red\">xttblog2<\/font>\u3002\u5907\u6ce8\uff1a\u201c1\u201d\uff0c\u6dfb\u52a0\u535a\u4e3b\u5fae\u4fe1\u62c9\u4f60\u8fdb\u5fae\u4fe1\u7fa4\u3002\u5907\u6ce8\u9519\u8bef\u4e0d\u4f1a\u540c\u610f\u597d\u53cb\u7533\u8bf7\u3002<\/b>\u518d\u6b21\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01\u540e\u7eed\u6709\u7cbe\u5f69\u5185\u5bb9\u4f1a\u7b2c\u4e00\u65f6\u95f4\u53d1\u7ed9\u60a8\uff01\u539f\u521b\u6587\u7ae0\u6295\u7a3f\u8bf7\u53d1\u9001\u81f3532009913@qq.com\u90ae\u7bb1\u3002\u5546\u52a1\u5408\u4f5c\u4e5f\u53ef\u6dfb\u52a0\u4f5c\u8005\u5fae\u4fe1\u8fdb\u884c\u8054\u7cfb\uff01<\/p><p>\u672c\u6587\u539f\u6587\u51fa\u5904\uff1a<a href=\"https:\/\/www.xttblog.com\">\u4e1a\u4f59\u8349<\/a>\uff1a &raquo; <a href=\"https:\/\/www.xttblog.com\/?p=510\">\u8be6\u89e3NIO\u6846\u67b6Mina\u7684\u7f16\u89e3\u7801\u7684\u5e94\u7528\u5b9e\u4f8b<\/a><\/p><!-- <div class=\"bd-reward-stl\"><button id=\"bdRewardBtn\"><span><\/span><\/button><\/div> -->","protected":false},"excerpt":{"rendered":"<p>\u8bf4\u5230NIO\u6846\u67b6\uff0c\u76ee\u524d\u6700\u6d41\u884c\u7684\u6709Mina\u3001Jetty\u3001HP-Socket\u7b49\u3002\u5b83\u4eec\u7684\u5b9e\u73b0\u539f\u7406\u57fa\u672c\u76f8\u540c\uff0c\u53ea\u662f\u5728\u7ec6\u8282\u4e0a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[176,255,252,253,254],"class_list":["post-510","post","type-post","status-publish","format-standard","hentry","category-java","tag-mina","tag-nio","tag-253","tag-254"],"_links":{"self":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=510"}],"version-history":[{"count":3,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/510\/revisions"}],"predecessor-version":[{"id":513,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/510\/revisions\/513"}],"wp:attachment":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}