{"id":16852,"date":"2025-04-18T23:17:06","date_gmt":"2025-04-18T15:17:06","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/16852.html"},"modified":"2025-04-18T23:17:06","modified_gmt":"2025-04-18T15:17:06","slug":"%e5%b9%b6%e5%8f%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%a1%86%e6%9e%b6-zinx","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/16852.html","title":{"rendered":"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx"},"content":{"rendered":"<h3>zinx\u6846\u67b6<\/h3>\n<p>Zinx \u662f\u4e00\u4e2a\u7528 Go \u8bed\u8a00\u7f16\u5199\u7684\u9ad8\u6027\u80fd\u3001\u8f7b\u91cf\u7ea7\u7684 TCP \u670d\u52a1\u5668\u6846\u67b6&#xff0c;\u5b83\u88ab\u8bbe\u8ba1\u4e3a\u7b80\u5355\u3001\u5feb\u901f\u4e14\u6613\u4e8e\u4f7f\u7528\u3002Zinx \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u529f\u80fd&#xff0c;\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u7f16\u89e3\u7801\u3001\u4e1a\u52a1\u5904\u7406\u3001\u8d1f\u8f7d\u5747\u8861\u7b49&#xff0c;\u9002\u7528\u4e8e\u6784\u5efa\u5404\u79cd TCP \u7f51\u7edc\u670d\u52a1&#xff0c;\u5982\u6e38\u620f\u670d\u52a1\u5668\u3001\u5373\u65f6\u901a\u8baf\u670d\u52a1\u5668\u7b49\u3002<\/p>\n<p>\u4e0b\u9762\u5b9e\u73b0zinx\u7684\u591a\u4e2a\u529f\u80fd\u5305\u62ec&#xff1a;\u8def\u7531\u3001\u5168\u5c40\u914d\u7f6e\u3001\u6d88\u606f\u5c01\u88c5\u3001\u8bfb\u5199\u5206\u79bb\u3001\u6d88\u606f\u961f\u5217\u3001\u94fe\u63a5\u7ba1\u7406\u7b49\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250418151705-68026cf119ec6.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> utils\u5305\u4e0bGlobalObj.go<\/p>\n<p><span class=\"token keyword\">package<\/span> utils<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;encoding\/json&#034;<\/span><br \/>\n<span class=\"token string\">&#034;io\/ioutil&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u5b58\u50a8\u4e00\u5207\u6709\u5173Zinx\u6846\u67b6\u7684\u5168\u5c40\u53c2\u6570&#xff0c;\u4f9b\u5176\u4ed6\u6a21\u5757\u4f7f\u7528<br \/>\n\u4e00\u4e9b\u53c2\u6570\u4e5f\u53ef\u4ee5\u901a\u8fc7 \u7528\u6237\u6839\u636e zinx.json\u6765\u914d\u7f6e<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">type<\/span> GlobalObj <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nTcpServer        ziface<span class=\"token punctuation\">.<\/span>IServer <span class=\"token comment\">\/\/\u5f53\u524dZinx\u7684\u5168\u5c40Server\u5bf9\u8c61<\/span><br \/>\nHost             <span class=\"token builtin\">string<\/span>         <span class=\"token comment\">\/\/\u5f53\u524d\u670d\u52a1\u5668\u4e3b\u673aIP<\/span><br \/>\nTcpPort          <span class=\"token builtin\">int<\/span>            <span class=\"token comment\">\/\/\u5f53\u524d\u670d\u52a1\u5668\u4e3b\u673a\u76d1\u542c\u7aef\u53e3\u53f7<\/span><br \/>\nName             <span class=\"token builtin\">string<\/span>         <span class=\"token comment\">\/\/\u5f53\u524d\u670d\u52a1\u5668\u540d\u79f0<\/span><br \/>\nVersion          <span class=\"token builtin\">string<\/span>         <span class=\"token comment\">\/\/\u5f53\u524dZinx\u7248\u672c\u53f7<\/span><br \/>\nMaxPacketSize    <span class=\"token builtin\">uint32<\/span>         <span class=\"token comment\">\/\/\u90fd\u9700\u6570\u636e\u5305\u7684\u6700\u5927\u503c<\/span><br \/>\nMaxConn          <span class=\"token builtin\">int<\/span>            <span class=\"token comment\">\/\/\u5f53\u524d\u670d\u52a1\u5668\u4e3b\u673a\u5141\u8bb8\u7684\u6700\u5927\u94fe\u63a5\u4e2a\u6570<\/span><br \/>\nWorkerPoolSize   <span class=\"token builtin\">uint32<\/span>         <span class=\"token comment\">\/\/\u4e1a\u52a1\u5de5\u4f5cWorker\u6c60\u7684\u6570\u91cf<\/span><br \/>\nMaxWorkerTaskLen <span class=\"token builtin\">uint32<\/span>         <span class=\"token comment\">\/\/\u4e1a\u52a1\u5de5\u4f5cWorker\u5bf9\u5e94\u8d1f\u8d23\u7684\u4efb\u52a1\u961f\u5217\u6700\u5927\u4efb\u52a1\u5b58\u50a8\u6570\u91cf<\/span><br \/>\nConfFilePath     <span class=\"token builtin\">string<\/span><br \/>\nMaxMsgChanLen    <span class=\"token builtin\">int<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u5b9a\u4e49\u4e00\u4e2a\u5168\u5c40\u7684\u5bf9\u8c61<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">var<\/span> GlobalObject <span class=\"token operator\">*<\/span>GlobalObj<\/p>\n<p><span class=\"token comment\">\/\/ \u8bfb\u53d6\u7528\u6237\u7684\u914d\u7f6e\u6587\u4ef6<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>g <span class=\"token operator\">*<\/span>GlobalObj<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Reload<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ndata<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> ioutil<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadFile<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;zinx.json&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">panic<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06json\u6570\u636e\u89e3\u6790\u5230struct\u4e2d<\/span><br \/>\n<span class=\"token comment\">\/\/fmt.Printf(&#034;json :%s\\\\n&#034;, data)<\/span><br \/>\nerr <span class=\"token operator\">&#061;<\/span> json<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unmarshal<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>GlobalObject<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">panic<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u521d\u59cb\u5316GlobalObject\u53d8\u91cf&#xff0c;\u8bbe\u7f6e\u4e00\u4e9b\u9ed8\u8ba4\u503c<\/span><br \/>\nGlobalObject <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>GlobalObj<span class=\"token punctuation\">{<\/span><br \/>\nName<span class=\"token punctuation\">:<\/span>             <span class=\"token string\">&#034;ZinxServerApp&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nVersion<span class=\"token punctuation\">:<\/span>          <span class=\"token string\">&#034;V0.4&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nTcpPort<span class=\"token punctuation\">:<\/span>          <span class=\"token number\">7777<\/span><span class=\"token punctuation\">,<\/span><br \/>\nHost<span class=\"token punctuation\">:<\/span>             <span class=\"token string\">&#034;0.0.0.0&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nMaxConn<span class=\"token punctuation\">:<\/span>          <span class=\"token number\">12000<\/span><span class=\"token punctuation\">,<\/span><br \/>\nMaxPacketSize<span class=\"token punctuation\">:<\/span>    <span class=\"token number\">4096<\/span><span class=\"token punctuation\">,<\/span><br \/>\nConfFilePath<span class=\"token punctuation\">:<\/span>     <span class=\"token string\">&#034;conf\/zinx.json&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nWorkerPoolSize<span class=\"token punctuation\">:<\/span>   <span class=\"token number\">10<\/span><span class=\"token punctuation\">,<\/span><br \/>\nMaxWorkerTaskLen<span class=\"token punctuation\">:<\/span> <span class=\"token number\">1024<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u4ece\u914d\u7f6e\u6587\u4ef6\u4e2d\u52a0\u8f7d\u4e00\u4e9b\u7528\u6237\u914d\u7f6e\u7684\u53c2\u6570<\/span><br \/>\nGlobalObject<span class=\"token punctuation\">.<\/span><span class=\"token function\">Reload<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>ziface\u5305<\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IConnManager <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>conn IConnection<span class=\"token punctuation\">)<\/span>                   <span class=\"token comment\">\/\/\u6dfb\u52a0\u94fe\u63a5<\/span><br \/>\n<span class=\"token function\">Remove<\/span><span class=\"token punctuation\">(<\/span>conn IConnection<span class=\"token punctuation\">)<\/span>                <span class=\"token comment\">\/\/\u5220\u9664\u8fde\u63a5<\/span><br \/>\n<span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>connID <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>IConnection<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/\u5229\u7528ConnID\u83b7\u53d6\u94fe\u63a5<\/span><br \/>\n<span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">int<\/span>                               <span class=\"token comment\">\/\/\u83b7\u53d6\u5f53\u524d\u8fde\u63a5<\/span><br \/>\n<span class=\"token function\">ClearConn<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>                             <span class=\"token comment\">\/\/\u5220\u9664\u5e76\u505c\u6b62\u6240\u6709\u94fe\u63a5<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token string\">&#034;net&#034;<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> IConnection <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span><br \/>\n<span class=\"token function\">GetTCPConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">.<\/span>TCPConn<br \/>\n<span class=\"token function\">RemoteAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> net<span class=\"token punctuation\">.<\/span>Addr<br \/>\n<span class=\"token function\">SendMsg<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><br \/>\n<span class=\"token comment\">\/\/\u76f4\u63a5\u5c06Message\u6570\u636e\u53d1\u9001\u7ed9\u8fdc\u7a0b\u7684TCP\u5ba2\u6237\u7aef(\u6709\u7f13\u51b2)<\/span><br \/>\n<span class=\"token function\">SendBuffMsg<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token comment\">\/\/\u6dfb\u52a0\u5e26\u7f13\u51b2\u53d1\u9001\u6d88\u606f\u63a5\u53e3<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bbe\u7f6e\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token function\">SetProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> value <span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u83b7\u53d6\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token function\">GetProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u79fb\u9664\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token function\">RemoveProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">type<\/span> HandFunc <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">.<\/span>TCPConn<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IDataPack <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">GetHeadLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">int32<\/span><br \/>\n<span class=\"token function\">Pack<\/span><span class=\"token punctuation\">(<\/span>msg IMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">Unpack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>IMessage<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IMessage <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span><br \/>\n<span class=\"token function\">GetMsgId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span><br \/>\n<span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token function\">SetMsgId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">SetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">SetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IMsgHandle <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">DoMsgHandler<\/span><span class=\"token punctuation\">(<\/span>request IRequest<span class=\"token punctuation\">)<\/span>          <span class=\"token comment\">\/\/\u9a6c\u4e0a\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u5904\u7406\u6d88\u606f<\/span><br \/>\n<span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> router IRouter<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/\u4e3a\u6d88\u606f\u6dfb\u52a0\u5177\u4f53\u7684\u5904\u7406\u903b\u8f91<\/span><br \/>\n<span class=\"token function\">StartWorkerPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>                       <span class=\"token comment\">\/\/\u542f\u52a8worker\u5de5\u4f5c\u6c60<\/span><br \/>\n<span class=\"token function\">SendMsgToTaskQueue<\/span><span class=\"token punctuation\">(<\/span>request IRequest<span class=\"token punctuation\">)<\/span>    <span class=\"token comment\">\/\/\u5c06\u6d88\u606f\u4ea4\u7ed9TaskQueue,\u7531worker\u8fdb\u884c\u5904\u7406<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IRequest <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> IConnection<br \/>\n<span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IRouter <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">PreHandle<\/span><span class=\"token punctuation\">(<\/span>req IRequest<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">Handle<\/span><span class=\"token punctuation\">(<\/span>req IRequest<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">PostHandle<\/span><span class=\"token punctuation\">(<\/span>req IRequest<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">package<\/span> ziface<\/p>\n<p><span class=\"token keyword\">type<\/span> IServer <span class=\"token keyword\">interface<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">Serve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> router IRouter<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f97\u5230\u94fe\u63a5\u7ba1\u7406<\/span><br \/>\n<span class=\"token function\">GetConnMgr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> IConnManager<br \/>\n<span class=\"token comment\">\/\/\u8bbe\u7f6e\u8be5Server\u7684\u8fde\u63a5\u521b\u5efa\u65f6Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token function\">SetOnConnStart<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>IConnection<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bbe\u7f6e\u8be5Server\u7684\u8fde\u63a5\u65ad\u5f00\u65f6\u7684Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token function\">SetOnConnStop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>IConnection<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u8c03\u7528\u8fde\u63a5OnConnStart Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token function\">CallOnConnStart<\/span><span class=\"token punctuation\">(<\/span>conn IConnection<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u8c03\u7528\u8fde\u63a5OnConnStop Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token function\">CallOnConnStop<\/span><span class=\"token punctuation\">(<\/span>conn IConnection<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>znet\u5305 connection<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/utils&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;errors&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token string\">&#034;io&#034;<\/span><br \/>\n<span class=\"token string\">&#034;net&#034;<\/span><br \/>\n<span class=\"token string\">&#034;sync&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> Connection <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f53\u524dConn\u5c5e\u4e8e\u54ea\u4e2aServer<\/span><br \/>\nTcpServer ziface<span class=\"token punctuation\">.<\/span>IServer <span class=\"token comment\">\/\/\u5f53\u524dconn\u5c5e\u4e8e\u54ea\u4e2aserver&#xff0c;\u5728conn\u521d\u59cb\u5316\u7684\u65f6\u5019\u6dfb\u52a0\u5373\u53ef<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f53\u524d\u8fde\u63a5\u7684socket TCP\u5957\u63a5\u5b57<\/span><br \/>\nConn <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">.<\/span>TCPConn<br \/>\n<span class=\"token comment\">\/\/\u5f53\u524d\u8fde\u63a5\u7684ID \u4e5f\u53ef\u4ee5\u79f0\u4f5c\u4e3aSessionID&#xff0c;ID\u5168\u5c40\u552f\u4e00<\/span><br \/>\nConnID <span class=\"token builtin\">uint32<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f53\u524d\u8fde\u63a5\u7684\u5173\u95ed\u72b6\u6001<\/span><br \/>\nisClosed <span class=\"token builtin\">bool<\/span><br \/>\n<span class=\"token comment\">\/\/\u6d88\u606f\u7ba1\u7406MsgId\u548c\u5bf9\u5e94\u5904\u7406\u65b9\u6cd5\u7684\u6d88\u606f\u7ba1\u7406\u6a21\u5757<\/span><br \/>\nMsgHandler ziface<span class=\"token punctuation\">.<\/span>IMsgHandle<br \/>\n<span class=\"token comment\">\/\/\u544a\u77e5\u8be5\u94fe\u63a5\u5df2\u7ecf\u9000\u51fa\/\u505c\u6b62\u7684channel<\/span><br \/>\nExitBuffChan <span class=\"token keyword\">chan<\/span> <span class=\"token builtin\">bool<\/span><br \/>\n<span class=\"token comment\">\/\/\u65e0\u7f13\u51b2\u7ba1\u9053&#xff0c;\u7528\u4e8e\u8bfb\u3001\u5199\u4e24\u4e2agoroutine\u4e4b\u95f4\u7684\u6d88\u606f\u901a\u4fe1<\/span><br \/>\nmsgChan <span class=\"token keyword\">chan<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token comment\">\/\/\u6709\u5173\u51b2\u7ba1\u9053&#xff0c;\u7528\u4e8e\u8bfb\u3001\u5199\u4e24\u4e2agoroutine\u4e4b\u95f4\u7684\u6d88\u606f\u901a\u4fe1<\/span><br \/>\nmsgBuffChan <span class=\"token keyword\">chan<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token comment\">\/\/\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\nproperty <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u4fdd\u62a4\u94fe\u63a5\u5c5e\u6027\u4fee\u6539\u7684\u9501<\/span><br \/>\npropertyLock sync<span class=\"token punctuation\">.<\/span>RWMutex<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u8fde\u63a5\u7684\u65b9\u6cd5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">NewConntion<\/span><span class=\"token punctuation\">(<\/span>server ziface<span class=\"token punctuation\">.<\/span>IServer<span class=\"token punctuation\">,<\/span> conn <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">.<\/span>TCPConn<span class=\"token punctuation\">,<\/span> connID <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> msgHandler ziface<span class=\"token punctuation\">.<\/span>IMsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>Connection <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u521d\u59cb\u5316Conn\u5c5e\u6027<\/span><br \/>\nc <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Connection<span class=\"token punctuation\">{<\/span><br \/>\nTcpServer<span class=\"token punctuation\">:<\/span>    server<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/\u5c06\u96b6\u5c5e\u7684server\u4f20\u9012\u8fdb\u6765<\/span><br \/>\nConn<span class=\"token punctuation\">:<\/span>         conn<span class=\"token punctuation\">,<\/span><br \/>\nConnID<span class=\"token punctuation\">:<\/span>       connID<span class=\"token punctuation\">,<\/span><br \/>\nisClosed<span class=\"token punctuation\">:<\/span>     <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span><br \/>\nMsgHandler<span class=\"token punctuation\">:<\/span>   msgHandler<span class=\"token punctuation\">,<\/span><br \/>\nExitBuffChan<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token builtin\">bool<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\nmsgChan<span class=\"token punctuation\">:<\/span>      <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\nmsgBuffChan<span class=\"token punctuation\">:<\/span>  <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxMsgChanLen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/\u4e0d\u8981\u5fd8\u8bb0\u521d\u59cb\u5316<\/span><br \/>\nproperty<span class=\"token punctuation\">:<\/span>     <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>                        <span class=\"token comment\">\/\/\u5bf9\u94fe\u63a5\u5c5e\u6027map\u521d\u59cb\u5316<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06\u65b0\u521b\u5efa\u7684Conn\u6dfb\u52a0\u5230\u94fe\u63a5\u7ba1\u7406\u4e2d<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>TcpServer<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnMgr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/\u5c06\u5f53\u524d\u65b0\u521b\u5efa\u7684\u8fde\u63a5\u6dfb\u52a0\u5230ConnManager\u4e2d<\/span><br \/>\n<span class=\"token keyword\">return<\/span> c<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> value <span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> c<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>property<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> value<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">interface<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">RLock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> c<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">RUnlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> value<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> c<span class=\"token punctuation\">.<\/span>property<span class=\"token punctuation\">[<\/span>key<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> value<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;no property found&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u79fb\u9664\u94fe\u63a5\u5c5e\u6027<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">RemoveProperty<\/span><span class=\"token punctuation\">(<\/span>key <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> c<span class=\"token punctuation\">.<\/span>propertyLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">delete<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>property<span class=\"token punctuation\">,<\/span> key<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">startReader<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[Reader Goroutine is running]&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span><span class=\"token function\">RemoteAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">String<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;[conn Reader exit!]&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> c<span class=\"token punctuation\">.<\/span><span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ \u521b\u5efa\u62c6\u5305\u89e3\u5305\u7684\u5bf9\u8c61<\/span><br \/>\ndp <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">NewDataPack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bfb\u53d6\u5ba2\u6237\u7aef\u7684Msg head<\/span><br \/>\nheadData <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetHeadLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> io<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadFull<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetTCPConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> headData<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read msg head error &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">break<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u62c6\u5305&#xff0c;\u5f97\u5230msgid \u548c datalen \u653e\u5728msg\u4e2d<\/span><br \/>\nmsg<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unpack<\/span><span class=\"token punctuation\">(<\/span>headData<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;unpack error &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">break<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u6839\u636e dataLen \u8bfb\u53d6 data&#xff0c;\u653e\u5728msg.Data\u4e2d<\/span><br \/>\n<span class=\"token keyword\">var<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token keyword\">if<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ndata <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> io<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadFull<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetTCPConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read msg data error &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetData<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f97\u5230\u5f53\u524d\u5ba2\u6237\u7aef\u8bf7\u6c42\u7684Request\u6570\u636e<\/span><br \/>\nreq <span class=\"token operator\">:&#061;<\/span> Request<span class=\"token punctuation\">{<\/span><br \/>\nconn<span class=\"token punctuation\">:<\/span> c<span class=\"token punctuation\">,<\/span><br \/>\nmsg<span class=\"token punctuation\">:<\/span>  msg<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u4ece\u7ed1\u5b9a\u597d\u7684\u6d88\u606f\u548c\u5bf9\u5e94\u7684\u5904\u7406\u65b9\u6cd5\u4e2d\u6267\u884c\u5bf9\u5e94\u7684Handle\u65b9\u6cd5<\/span><br \/>\n<span class=\"token keyword\">if<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>WorkerPoolSize <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u5df2\u7ecf\u542f\u52a8\u5de5\u4f5c\u6c60\u673a\u5236&#xff0c;\u5c06\u6d88\u606f\u4ea4\u7ed9Worker\u5904\u7406<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>MsgHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">SendMsgToTaskQueue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>req<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4ece\u7ed1\u5b9a\u597d\u7684\u6d88\u606f\u548c\u5bf9\u5e94\u7684\u5904\u7406\u65b9\u6cd5\u4e2d\u6267\u884c\u5bf9\u5e94\u7684Handle\u65b9\u6cd5<\/span><br \/>\n<span class=\"token keyword\">go<\/span> c<span class=\"token punctuation\">.<\/span>MsgHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">DoMsgHandler<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>req<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u542f\u52a8\u8fde\u63a5&#xff0c;\u8ba9\u5f53\u524d\u8fde\u63a5\u5f00\u59cb\u5de5\u4f5c<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/1 \u5f00\u542f\u7528\u6237\u4ece\u5ba2\u6237\u7aef\u8bfb\u53d6\u6570\u636e\u6d41\u7a0b\u7684Goroutine<\/span><br \/>\n<span class=\"token keyword\">go<\/span> c<span class=\"token punctuation\">.<\/span><span class=\"token function\">startReader<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/2 \u5f00\u542f\u7528\u4e8e\u5199\u56de\u5ba2\u6237\u7aef\u6570\u636e\u6d41\u7a0b\u7684Goroutine<\/span><br \/>\n<span class=\"token keyword\">go<\/span> c<span class=\"token punctuation\">.<\/span><span class=\"token function\">StartWriter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u6309\u7167\u7528\u6237\u4f20\u9012\u8fdb\u6765\u7684\u521b\u5efa\u8fde\u63a5\u65f6\u9700\u8981\u5904\u7406\u7684\u4e1a\u52a1&#xff0c;\u6267\u884c\u94a9\u5b50\u65b9\u6cd5<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>TcpServer<span class=\"token punctuation\">.<\/span><span class=\"token function\">CallOnConnStart<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/func (c *Connection) Start() {<\/span><br \/>\n<span class=\"token comment\">\/\/go c.startReader()<\/span><br \/>\n<span class=\"token comment\">\/\/for {<\/span><br \/>\n<span class=\"token comment\">\/\/select {<\/span><br \/>\n<span class=\"token comment\">\/\/case &lt;-c.ExitBuffChan:<\/span><br \/>\n<span class=\"token comment\">\/\/return<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u505c\u6b62\u8fde\u63a5&#xff0c;\u7ed3\u675f\u5f53\u524d\u8fde\u63a5\u72b6\u6001M<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Conn Stop()&#8230;ConnID &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> c<span class=\"token punctuation\">.<\/span>ConnID<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5982\u679c\u5f53\u524d\u94fe\u63a5\u5df2\u7ecf\u5173\u95ed<\/span><br \/>\n<span class=\"token keyword\">if<\/span> c<span class=\"token punctuation\">.<\/span>isClosed <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>isClosed <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/\u5982\u679c\u7528\u6237\u6ce8\u518c\u4e86\u8be5\u94fe\u63a5\u7684\u5173\u95ed\u56de\u8c03\u4e1a\u52a1&#xff0c;\u90a3\u4e48\u5728\u6b64\u523b\u5e94\u8be5\u663e\u793a\u8c03\u7528<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>TcpServer<span class=\"token punctuation\">.<\/span><span class=\"token function\">CallOnConnStop<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5173\u95edsocket\u94fe\u63a5<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5173\u95edWriter<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>ExitBuffChan <span class=\"token operator\">&lt;-<\/span> <span class=\"token boolean\">true<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06\u94fe\u63a5\u4ece\u8fde\u63a5\u7ba1\u7406\u5668\u4e2d\u5220\u9664<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>TcpServer<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnMgr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">Remove<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5173\u95ed\u8be5\u94fe\u63a5\u5168\u90e8\u7ba1\u9053<\/span><br \/>\n<span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>ExitBuffChan<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span>msgBuffChan<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u5199\u6d88\u606fGoroutine&#xff0c; \u7528\u6237\u5c06\u6570\u636e\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">StartWriter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[Writer Goroutine is running]&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span>c<span class=\"token punctuation\">.<\/span><span class=\"token function\">RemoteAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">String<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;[conn Writer exit!]&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">case<\/span> data <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&lt;-<\/span>c<span class=\"token punctuation\">.<\/span>msgChan<span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token comment\">\/\/\u6709\u6570\u636e\u8981\u5199\u7ed9\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> c<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Send Data error:, &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; Conn Writer exit&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u9488\u5bf9\u6709\u7f13\u51b2channel\u9700\u8981\u4e9b\u7684\u6570\u636e\u5904\u7406<\/span><br \/>\n<span class=\"token keyword\">case<\/span> data<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&lt;-<\/span>c<span class=\"token punctuation\">.<\/span>msgBuffChan<span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token keyword\">if<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6709\u6570\u636e\u8981\u5199\u7ed9\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> c<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Send Buff Data error:, &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; Conn Writer exit&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">break<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;msgBuffChan is Closed&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">case<\/span> <span class=\"token operator\">&lt;-<\/span>c<span class=\"token punctuation\">.<\/span>ExitBuffChan<span class=\"token punctuation\">:<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u76f4\u63a5\u5c06Message\u6570\u636e\u53d1\u9001\u6570\u636e\u7ed9\u8fdc\u7a0b\u7684TCP\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SendMsg<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> c<span class=\"token punctuation\">.<\/span>isClosed <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Connection closed when send msg&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06data\u5c01\u5305&#xff0c;\u5e76\u4e14\u53d1\u9001<\/span><br \/>\ndp <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">NewDataPack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\nmsg<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NewMsgPackage<\/span><span class=\"token punctuation\">(<\/span>msgId<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Pack error msg id &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> msgId<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Pack error msg &#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5199\u56de\u5ba2\u6237\u7aef<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>msgChan <span class=\"token operator\">&lt;-<\/span> msg <span class=\"token comment\">\/\/\u5c06\u4e4b\u524d\u76f4\u63a5\u56de\u5199\u7ed9conn.Write\u7684\u65b9\u6cd5 \u6539\u4e3a \u53d1\u9001\u7ed9Channel \u4f9bWriter\u8bfb\u53d6<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4ece\u5f53\u524d\u8fde\u63a5\u83b7\u53d6\u539f\u59cb\u7684socket TCPConn<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetTCPConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">.<\/span>TCPConn <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> c<span class=\"token punctuation\">.<\/span>Conn<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u8fde\u63a5ID<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> c<span class=\"token punctuation\">.<\/span>ConnID<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u8fdc\u7a0b\u5ba2\u6237\u7aef\u5730\u5740\u4fe1\u606f<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">RemoteAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> net<span class=\"token punctuation\">.<\/span>Addr <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> c<span class=\"token punctuation\">.<\/span>Conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">RemoteAddr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \/\/ \u76f4\u63a5\u5c06Message\u6570\u636e\u53d1\u9001\u6570\u636e\u7ed9\u8fdc\u7a0b\u7684TCP\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token comment\">\/\/<\/span><br \/>\n<span class=\"token comment\">\/\/func (c *Connection) SendMsg(msgId uint32, data []byte) error {<\/span><br \/>\n<span class=\"token comment\">\/\/if c.isClosed &#061;&#061; true {<\/span><br \/>\n<span class=\"token comment\">\/\/return errors.New(&#034;Connection closed when send msg&#034;)<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\u5c06data\u5c01\u5305&#xff0c;\u5e76\u4e14\u53d1\u9001<\/span><br \/>\n<span class=\"token comment\">\/\/dp :&#061; NewDataPack()<\/span><br \/>\n<span class=\"token comment\">\/\/msg, err :&#061; dp.Pack(NewMsgPackage(msgId, data))<\/span><br \/>\n<span class=\"token comment\">\/\/if err !&#061; nil {<\/span><br \/>\n<span class=\"token comment\">\/\/fmt.Println(&#034;Pack error msg id &#061; &#034;, msgId)<\/span><br \/>\n<span class=\"token comment\">\/\/return errors.New(&#034;Pack error msg &#034;)<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\u5199\u56de\u5ba2\u6237\u7aef<\/span><br \/>\n<span class=\"token comment\">\/\/if _, err :&#061; c.Conn.Write(msg); err !&#061; nil {<\/span><br \/>\n<span class=\"token comment\">\/\/fmt.Println(&#034;Write msg id &#034;, msgId, &#034; error &#034;)<\/span><br \/>\n<span class=\"token comment\">\/\/c.ExitBuffChan &lt;- true<\/span><br \/>\n<span class=\"token comment\">\/\/return errors.New(&#034;conn Write error&#034;)<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/return nil<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>c <span class=\"token operator\">*<\/span>Connection<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SendBuffMsg<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">error<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> c<span class=\"token punctuation\">.<\/span>isClosed <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">true<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Connection closed when send buff msg&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06data\u5c01\u5305&#xff0c;\u5e76\u4e14\u53d1\u9001<\/span><br \/>\ndp <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">NewDataPack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\nmsg<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NewMsgPackage<\/span><span class=\"token punctuation\">(<\/span>msgId<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Pack error msg id &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> msgId<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Pack error msg &#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5199\u56de\u5ba2\u6237\u7aef<\/span><br \/>\nc<span class=\"token punctuation\">.<\/span>msgBuffChan <span class=\"token operator\">&lt;-<\/span> msg<br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>ConnManager<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;errors&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token string\">&#034;sync&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> ConnManager <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nconnections <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">]<\/span>ziface<span class=\"token punctuation\">.<\/span>IConnection<br \/>\nconnLock    sync<span class=\"token punctuation\">.<\/span>RWMutex<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u521b\u5efa\u4e00\u4e2a\u94fe\u63a5\u7ba1\u7406<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">NewConnManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>ConnManager <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>ConnManager<span class=\"token punctuation\">{<\/span><br \/>\nconnections<span class=\"token punctuation\">:<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">]<\/span>ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6dfb\u52a0\u94fe\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>connMgr <span class=\"token operator\">*<\/span>ConnManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90Map \u52a0\u5199\u9501<\/span><br \/>\nconnMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> connMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06conn\u8fde\u63a5\u6dfb\u52a0\u5230ConnMananger\u4e2d<\/span><br \/>\nconnMgr<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">[<\/span>conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> conn<br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;connection add to ConnManager successfully: conn num &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> connMgr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5220\u9664\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>connMgr <span class=\"token operator\">*<\/span>ConnManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Remove<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90Map \u52a0\u5199\u9501<\/span><br \/>\nconnMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> connMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5220\u9664\u8fde\u63a5\u4fe1\u606f<\/span><br \/>\n<span class=\"token function\">delete<\/span><span class=\"token punctuation\">(<\/span>connMgr<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;connection Remove ConnID&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; successfully: conn num &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> connMgr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5229\u7528ConnID\u83b7\u53d6\u94fe\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>connMgr <span class=\"token operator\">*<\/span>ConnManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Get<\/span><span class=\"token punctuation\">(<\/span>connID <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90Map \u52a0\u8bfb\u9501<\/span><br \/>\nconnMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">RLock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> connMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">RUnlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> conn<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> connMgr<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">[<\/span>connID<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> conn<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;connection not found&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u5f53\u524d\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>connMgr <span class=\"token operator\">*<\/span>ConnManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">int<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>connMgr<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6e05\u9664\u5e76\u505c\u6b62\u6240\u6709\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>connMgr <span class=\"token operator\">*<\/span>ConnManager<span class=\"token punctuation\">)<\/span> <span class=\"token function\">ClearConn<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4fdd\u62a4\u5171\u4eab\u8d44\u6e90Map \u52a0\u5199\u9501<\/span><br \/>\nconnMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">defer<\/span> connMgr<span class=\"token punctuation\">.<\/span>connLock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u505c\u6b62\u5e76\u5220\u9664\u5168\u90e8\u7684\u8fde\u63a5\u4fe1\u606f<\/span><br \/>\n<span class=\"token keyword\">for<\/span> connID<span class=\"token punctuation\">,<\/span> conn <span class=\"token operator\">:&#061;<\/span> <span class=\"token keyword\">range<\/span> connMgr<span class=\"token punctuation\">.<\/span>connections <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u505c\u6b62<\/span><br \/>\nconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5220\u9664<\/span><br \/>\n<span class=\"token function\">delete<\/span><span class=\"token punctuation\">(<\/span>connMgr<span class=\"token punctuation\">.<\/span>connections<span class=\"token punctuation\">,<\/span> connID<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Clear All Connections successfully: conn num &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> connMgr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>datapack<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;bytes&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/utils&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;encoding\/binary&#034;<\/span><br \/>\n<span class=\"token string\">&#034;errors&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> DataPack <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token function\">NewDataPack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>DataPack <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>DataPack<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>dp <span class=\"token operator\">*<\/span>DataPack<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetHeadLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/Id uint32(4\u5b57\u8282) &#043;  DataLen uint32(4\u5b57\u8282)<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token number\">8<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5c01\u5305\u65b9\u6cd5(\u538b\u7f29\u6570\u636e)<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>dp <span class=\"token operator\">*<\/span>DataPack<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Pack<\/span><span class=\"token punctuation\">(<\/span>msg ziface<span class=\"token punctuation\">.<\/span>IMessage<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u521b\u5efa\u4e00\u4e2a\u5b58\u653ebytes\u5b57\u8282\u7684\u7f13\u51b2<\/span><br \/>\ndataBuff <span class=\"token operator\">:&#061;<\/span> bytes<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5199dataLen<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> binary<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>dataBuff<span class=\"token punctuation\">,<\/span> binary<span class=\"token punctuation\">.<\/span>LittleEndian<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5199msgID<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> binary<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>dataBuff<span class=\"token punctuation\">,<\/span> binary<span class=\"token punctuation\">.<\/span>LittleEndian<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5199data\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> binary<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>dataBuff<span class=\"token punctuation\">,<\/span> binary<span class=\"token punctuation\">.<\/span>LittleEndian<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">return<\/span> dataBuff<span class=\"token punctuation\">.<\/span><span class=\"token function\">Bytes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>dp <span class=\"token operator\">*<\/span>DataPack<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Unpack<\/span><span class=\"token punctuation\">(<\/span>binaryData <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span>ziface<span class=\"token punctuation\">.<\/span>IMessage<span class=\"token punctuation\">,<\/span> <span class=\"token builtin\">error<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u521b\u5efa\u4e00\u4e2a\u4ece\u8f93\u5165\u4e8c\u8fdb\u5236\u6570\u636e\u7684ioReader<\/span><br \/>\ndataBuff <span class=\"token operator\">:&#061;<\/span> bytes<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewReader<\/span><span class=\"token punctuation\">(<\/span>binaryData<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u53ea\u89e3\u538bhead\u7684\u4fe1\u606f&#xff0c;\u5f97\u5230dataLen\u548cmsgID<\/span><br \/>\nmsg <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Message<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bfbdataLen<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> binary<span class=\"token punctuation\">.<\/span><span class=\"token function\">Read<\/span><span class=\"token punctuation\">(<\/span>dataBuff<span class=\"token punctuation\">,<\/span> binary<span class=\"token punctuation\">.<\/span>LittleEndian<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">.<\/span>DataLen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u8bfbmsgID<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">:&#061;<\/span> binary<span class=\"token punctuation\">.<\/span><span class=\"token function\">Read<\/span><span class=\"token punctuation\">(<\/span>dataBuff<span class=\"token punctuation\">,<\/span> binary<span class=\"token punctuation\">.<\/span>LittleEndian<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">.<\/span>Id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> err<br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5224\u65addataLen\u7684\u957f\u5ea6\u662f\u5426\u8d85\u51fa\u6211\u4eec\u5141\u8bb8\u7684\u6700\u5927\u5305\u957f\u5ea6<\/span><br \/>\n<span class=\"token keyword\">if<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxPacketSize <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> msg<span class=\"token punctuation\">.<\/span>DataLen <span class=\"token operator\">&gt;<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxPacketSize <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token boolean\">nil<\/span><span class=\"token punctuation\">,<\/span> errors<span class=\"token punctuation\">.<\/span><span class=\"token function\">New<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Too large msg data recieved&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u8fd9\u91cc\u53ea\u9700\u8981\u628ahead\u7684\u6570\u636e\u62c6\u5305\u51fa\u6765\u5c31\u53ef\u4ee5\u4e86&#xff0c;\u7136\u540e\u518d\u901a\u8fc7head\u7684\u957f\u5ea6&#xff0c;\u518d\u4ececonn\u8bfb\u53d6\u4e00\u6b21\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">return<\/span> msg<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">nil<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>message<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">type<\/span> Message <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nId      <span class=\"token builtin\">uint32<\/span><br \/>\nDataLen <span class=\"token builtin\">uint32<\/span><br \/>\nData    <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token function\">NewMsgPackage<\/span><span class=\"token punctuation\">(<\/span>id <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>Message <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>Message<span class=\"token punctuation\">{<\/span><br \/>\nId<span class=\"token punctuation\">:<\/span>      id<span class=\"token punctuation\">,<\/span><br \/>\nDataLen<span class=\"token punctuation\">:<\/span> <span class=\"token function\">uint32<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\nData<span class=\"token punctuation\">:<\/span>    data<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6d88\u606f\u6570\u636e\u6bb5\u957f\u5ea6<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> msg<span class=\"token punctuation\">.<\/span>DataLen<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6d88\u606fID<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetMsgId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> msg<span class=\"token punctuation\">.<\/span>Id<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u6d88\u606f\u5185\u5bb9<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> msg<span class=\"token punctuation\">.<\/span>Data<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u6d88\u606f\u6570\u636e\u6bb5\u957f\u5ea6<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token builtin\">len<\/span> <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>DataLen <span class=\"token operator\">&#061;<\/span> <span class=\"token builtin\">len<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u8ba1\u6d88\u606fID<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetMsgId<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>Id <span class=\"token operator\">&#061;<\/span> msgId<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u8ba1\u6d88\u606f\u5185\u5bb9<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>msg <span class=\"token operator\">*<\/span>Message<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetData<\/span><span class=\"token punctuation\">(<\/span>data <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>Data <span class=\"token operator\">&#061;<\/span> data<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>msgHandler<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/utils&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token string\">&#034;strconv&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> MsgHandle <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nApis           <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">]<\/span>ziface<span class=\"token punctuation\">.<\/span>IRouter<br \/>\nWorkerPoolSize <span class=\"token builtin\">uint32<\/span><br \/>\nTaskQueue      <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">chan<\/span> ziface<span class=\"token punctuation\">.<\/span>IRequest<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token function\">NewMsgHandle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>MsgHandle <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> <span class=\"token operator\">&amp;<\/span>MsgHandle<span class=\"token punctuation\">{<\/span><br \/>\nApis<span class=\"token punctuation\">:<\/span>           <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">]<\/span>ziface<span class=\"token punctuation\">.<\/span>IRouter<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\nWorkerPoolSize<span class=\"token punctuation\">:<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>WorkerPoolSize<span class=\"token punctuation\">,<\/span><br \/>\nTaskQueue<span class=\"token punctuation\">:<\/span>      <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token keyword\">chan<\/span> ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">,<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>WorkerPoolSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u9a6c\u4e0a\u4ee5\u975e\u963b\u585e\u65b9\u5f0f\u5904\u7406\u6d88\u606f<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mh <span class=\"token operator\">*<\/span>MsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token function\">DoMsgHandler<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nhandler<span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> mh<span class=\"token punctuation\">.<\/span>Apis<span class=\"token punctuation\">[<\/span>request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token operator\">!<\/span>ok <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;api msgId &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; is not FOUND!&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u6267\u884c\u5bf9\u5e94\u5904\u7406\u65b9\u6cd5<\/span><br \/>\nhandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">PreHandle<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\nhandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">Handle<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\nhandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">PostHandle<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u4e3a\u6d88\u606f\u6dfb\u52a0\u5177\u4f53\u7684\u5904\u7406\u903b\u8f91<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mh <span class=\"token operator\">*<\/span>MsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> router ziface<span class=\"token punctuation\">.<\/span>IRouter<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/1 \u5224\u65ad\u5f53\u524dmsg\u7ed1\u5b9a\u7684API\u5904\u7406\u65b9\u6cd5\u662f\u5426\u5df2\u7ecf\u5b58\u5728<\/span><br \/>\n<span class=\"token keyword\">if<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> ok <span class=\"token operator\">:&#061;<\/span> mh<span class=\"token punctuation\">.<\/span>Apis<span class=\"token punctuation\">[<\/span>msgId<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> ok <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token function\">panic<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;repeated api , msgId &#061; &#034;<\/span> <span class=\"token operator\">&#043;<\/span> strconv<span class=\"token punctuation\">.<\/span><span class=\"token function\">Itoa<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>msgId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/2 \u6dfb\u52a0msg\u4e0eapi\u7684\u7ed1\u5b9a\u5173\u7cfb<\/span><br \/>\nmh<span class=\"token punctuation\">.<\/span>Apis<span class=\"token punctuation\">[<\/span>msgId<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> router<br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Add api msgId &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> msgId<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u542f\u52a8\u4e00\u4e2aWorker\u5de5\u4f5c\u6d41\u7a0b<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mh <span class=\"token operator\">*<\/span>MsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token function\">StartOneWorker<\/span><span class=\"token punctuation\">(<\/span>workerID <span class=\"token builtin\">int<\/span><span class=\"token punctuation\">,<\/span> taskQueue <span class=\"token keyword\">chan<\/span> ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Worker ID &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> workerID<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; is started.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u4e0d\u65ad\u7684\u7b49\u5f85\u961f\u5217\u4e2d\u7684\u6d88\u606f<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">select<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6709\u6d88\u606f\u5219\u53d6\u51fa\u961f\u5217\u7684Request&#xff0c;\u5e76\u6267\u884c\u7ed1\u5b9a\u7684\u4e1a\u52a1\u65b9\u6cd5<\/span><br \/>\n<span class=\"token keyword\">case<\/span> request <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&lt;-<\/span>taskQueue<span class=\"token punctuation\">:<\/span><br \/>\nmh<span class=\"token punctuation\">.<\/span><span class=\"token function\">DoMsgHandler<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u542f\u52a8worker\u5de5\u4f5c\u6c60<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mh <span class=\"token operator\">*<\/span>MsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token function\">StartWorkerPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u904d\u5386\u9700\u8981\u542f\u52a8worker\u7684\u6570\u91cf&#xff0c;\u4f9d\u6b64\u542f\u52a8<\/span><br \/>\n<span class=\"token keyword\">for<\/span> i <span class=\"token operator\">:&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token function\">int<\/span><span class=\"token punctuation\">(<\/span>mh<span class=\"token punctuation\">.<\/span>WorkerPoolSize<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u4e00\u4e2aworker\u88ab\u542f\u52a8<\/span><br \/>\n<span class=\"token comment\">\/\/\u7ed9\u5f53\u524dworker\u5bf9\u5e94\u7684\u4efb\u52a1\u961f\u5217\u5f00\u8f9f\u7a7a\u95f4<\/span><br \/>\nmh<span class=\"token punctuation\">.<\/span>TaskQueue<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">chan<\/span> ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">,<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxWorkerTaskLen<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u542f\u52a8\u5f53\u524dWorker&#xff0c;\u963b\u585e\u7684\u7b49\u5f85\u5bf9\u5e94\u7684\u4efb\u52a1\u961f\u5217\u662f\u5426\u6709\u6d88\u606f\u4f20\u9012\u8fdb\u6765<\/span><br \/>\n<span class=\"token keyword\">go<\/span> mh<span class=\"token punctuation\">.<\/span><span class=\"token function\">StartOneWorker<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">,<\/span> mh<span class=\"token punctuation\">.<\/span>TaskQueue<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5c06\u6d88\u606f\u4ea4\u7ed9TaskQueue,\u7531worker\u8fdb\u884c\u5904\u7406<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>mh <span class=\"token operator\">*<\/span>MsgHandle<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SendMsgToTaskQueue<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u6839\u636eConnID\u6765\u5206\u914d\u5f53\u524d\u7684\u8fde\u63a5\u5e94\u8be5\u7531\u54ea\u4e2aworker\u8d1f\u8d23\u5904\u7406<\/span><br \/>\n<span class=\"token comment\">\/\/\u8f6e\u8be2\u7684\u5e73\u5747\u5206\u914d\u6cd5\u5219<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f97\u5230\u9700\u8981\u5904\u7406\u6b64\u6761\u8fde\u63a5\u7684workerID<\/span><br \/>\nworkerID <span class=\"token operator\">:&#061;<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">%<\/span> mh<span class=\"token punctuation\">.<\/span>WorkerPoolSize<br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Add ConnID&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; request msgID&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;to workerID&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> workerID<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06\u8bf7\u6c42\u6d88\u606f\u53d1\u9001\u7ed9\u4efb\u52a1\u961f\u5217<\/span><br \/>\nmh<span class=\"token punctuation\">.<\/span>TaskQueue<span class=\"token punctuation\">[<\/span>workerID<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;-<\/span> request<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>request<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> Request <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nconn ziface<span class=\"token punctuation\">.<\/span>IConnection<br \/>\nmsg  ziface<span class=\"token punctuation\">.<\/span>IMessage<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>r <span class=\"token operator\">*<\/span>Request<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> ziface<span class=\"token punctuation\">.<\/span>IConnection <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> r<span class=\"token punctuation\">.<\/span>conn<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u8bf7\u6c42\u6d88\u606f\u7684\u6570\u636e<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>r <span class=\"token operator\">*<\/span>Request<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> r<span class=\"token punctuation\">.<\/span>msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u83b7\u53d6\u8bf7\u6c42\u7684\u6d88\u606f\u7684ID<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>r <span class=\"token operator\">*<\/span>Request<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token builtin\">uint32<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> r<span class=\"token punctuation\">.<\/span>msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>router<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> BaseRouter <span class=\"token keyword\">struct<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>br <span class=\"token operator\">*<\/span>BaseRouter<span class=\"token punctuation\">)<\/span> <span class=\"token function\">PreHandle<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span>  <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>br <span class=\"token operator\">*<\/span>BaseRouter<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Handle<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span>     <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>br <span class=\"token operator\">*<\/span>BaseRouter<span class=\"token punctuation\">)<\/span> <span class=\"token function\">PostHandle<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><\/p>\n<p>server<\/p>\n<p><span class=\"token keyword\">package<\/span> znet<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/utils&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token string\">&#034;net&#034;<\/span><br \/>\n<span class=\"token string\">&#034;time&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ iServer \u63a5\u53e3\u5b9e\u73b0&#xff0c;\u5b9a\u4e49\u4e00\u4e2aServer\u670d\u52a1\u7c7b<\/span><br \/>\n<span class=\"token keyword\">type<\/span> Server <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u670d\u52a1\u5668\u7684\u540d\u79f0<\/span><br \/>\nName <span class=\"token builtin\">string<\/span><br \/>\n<span class=\"token comment\">\/\/tcp4 or other<\/span><br \/>\nIPVersion <span class=\"token builtin\">string<\/span><br \/>\n<span class=\"token comment\">\/\/\u670d\u52a1\u7ed1\u5b9a\u7684IP\u5730\u5740<\/span><br \/>\nIP <span class=\"token builtin\">string<\/span><br \/>\n<span class=\"token comment\">\/\/\u670d\u52a1\u7ed1\u5b9a\u7684\u7aef\u53e3<\/span><br \/>\nPort <span class=\"token builtin\">int<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f53\u524dServer\u7684\u6d88\u606f\u7ba1\u7406\u6a21\u5757&#xff0c;\u7528\u6765\u7ed1\u5b9aMsgId\u548c\u5bf9\u5e94\u7684\u5904\u7406\u65b9\u6cd5<\/span><br \/>\nmsgHandler ziface<span class=\"token punctuation\">.<\/span>IMsgHandle<br \/>\n<span class=\"token comment\">\/\/\u5f53\u524dServer\u7684\u94fe\u63a5\u7ba1\u7406\u5668<\/span><br \/>\nConnMgr ziface<span class=\"token punctuation\">.<\/span>IConnManager<br \/>\n<span class=\"token comment\">\/\/\u65b0\u589e\u4e24\u4e2ahook\u51fd\u6570\u539f\u578b<\/span><br \/>\n<span class=\"token comment\">\/\/\u8be5Server\u7684\u8fde\u63a5\u521b\u5efa\u65f6Hook\u51fd\u6570<\/span><br \/>\nOnConnStart <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u8be5Server\u7684\u8fde\u63a5\u65ad\u5f00\u65f6\u7684Hook\u51fd\u6570<\/span><br \/>\nOnConnStop <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5f97\u5230\u94fe\u63a5\u7ba1\u7406<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">GetConnMgr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> ziface<span class=\"token punctuation\">.<\/span>IConnManager <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">return<\/span> s<span class=\"token punctuation\">.<\/span>ConnMgr<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061; \u5b9e\u73b0 ziface.IServer \u91cc\u7684\u5168\u90e8\u63a5\u53e3\u65b9\u6cd5 &#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5f00\u542f\u7f51\u7edc\u670d\u52a1<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[START] Server listenner at IP: %s, Port %d, is starting\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>IP<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Port<span class=\"token punctuation\">)<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[START] Server name: %s,listenner at IP: %s, Port %d is starting\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Name<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>IP<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Port<span class=\"token punctuation\">)<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[Zinx] Version: %s, MaxConn: %d,  MaxPacketSize: %d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nutils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>Version<span class=\"token punctuation\">,<\/span><br \/>\nutils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxConn<span class=\"token punctuation\">,<\/span><br \/>\nutils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxPacketSize<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f00\u542f\u4e00\u4e2ago\u53bb\u505a\u670d\u52a1\u7aefLinster\u4e1a\u52a1<\/span><br \/>\n<span class=\"token keyword\">go<\/span> <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/1 \u83b7\u53d6\u4e00\u4e2aTCP\u7684Addr<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span>msgHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">StartWorkerPool<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\naddr<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> net<span class=\"token punctuation\">.<\/span><span class=\"token function\">ResolveTCPAddr<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>IPVersion<span class=\"token punctuation\">,<\/span> fmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sprintf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s:%d&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>IP<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Port<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;resolve tcp addr err: &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/2 \u76d1\u542c\u670d\u52a1\u5668\u5730\u5740<\/span><br \/>\nlistenner<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> net<span class=\"token punctuation\">.<\/span><span class=\"token function\">ListenTCP<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">.<\/span>IPVersion<span class=\"token punctuation\">,<\/span> addr<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;listen&#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>IPVersion<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;err&#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5df2\u7ecf\u76d1\u542c\u6210\u529f<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;start Zinx server  &#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Name<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034; succ, now listenning&#8230;&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">var<\/span> cid <span class=\"token builtin\">uint32<\/span><br \/>\ncid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><br \/>\n<span class=\"token comment\">\/\/3 \u542f\u52a8server\u7f51\u7edc\u8fde\u63a5\u4e1a\u52a1<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/3.1 \u963b\u585e\u7b49\u5f85\u5ba2\u6237\u7aef\u5efa\u7acb\u8fde\u63a5\u8bf7\u6c42<\/span><br \/>\nconn<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> listenner<span class=\"token punctuation\">.<\/span><span class=\"token function\">AcceptTCP<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Accept err &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/3.2 \u8bbe\u7f6e\u670d\u52a1\u5668\u6700\u5927\u8fde\u63a5\u63a7\u5236,\u5982\u679c\u8d85\u8fc7\u6700\u5927\u8fde\u63a5&#xff0c;\u90a3\u4e48\u5219\u5173\u95ed\u6b64\u65b0\u7684\u8fde\u63a5<\/span><br \/>\n<span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>ConnMgr<span class=\"token punctuation\">.<\/span><span class=\"token function\">Len<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>MaxConn <span class=\"token punctuation\">{<\/span><br \/>\nconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Close<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">continue<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token comment\">\/\/3.3 \u5904\u7406\u8be5\u65b0\u8fde\u63a5\u8bf7\u6c42\u7684 \u4e1a\u52a1 \u65b9\u6cd5&#xff0c; \u6b64\u65f6\u5e94\u8be5\u6709 handler \u548c conn\u662f\u7ed1\u5b9a\u7684<\/span><br \/>\ndealConn <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">NewConntion<\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">,<\/span> conn<span class=\"token punctuation\">,<\/span> cid<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>msgHandler<span class=\"token punctuation\">)<\/span><br \/>\ncid<span class=\"token operator\">&#043;&#043;<\/span><br \/>\n<span class=\"token comment\">\/\/3.4 \u542f\u52a8\u5f53\u524d\u94fe\u63a5\u7684\u5904\u7406\u4e1a\u52a1<\/span><br \/>\n<span class=\"token keyword\">go<\/span> dealConn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/go func() {<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\u4e0d\u65ad\u7684\u5faa\u73af\u4ece\u5ba2\u6237\u7aef\u83b7\u53d6\u6570\u636e<\/span><br \/>\n<span class=\"token comment\">\/\/for {<\/span><br \/>\n<span class=\"token comment\">\/\/buf :&#061; make([]byte, 512)<\/span><br \/>\n<span class=\"token comment\">\/\/cnt, err :&#061; conn.Read(buf)<\/span><br \/>\n<span class=\"token comment\">\/\/if err !&#061; nil {<\/span><br \/>\n<span class=\"token comment\">\/\/fmt.Println(&#034;recv buf err &#034;, err)<\/span><br \/>\n<span class=\"token comment\">\/\/continue<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/\/\/\u56de\u663e<\/span><br \/>\n<span class=\"token comment\">\/\/if _, err :&#061; conn.Write(buf[:cnt]); err !&#061; nil {<\/span><br \/>\n<span class=\"token comment\">\/\/fmt.Println(&#034;write back buf err &#034;, err)<\/span><br \/>\n<span class=\"token comment\">\/\/continue<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/}<\/span><br \/>\n<span class=\"token comment\">\/\/}()<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Stop<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;[STOP] Zinx server , name &#034;<\/span><span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">.<\/span>Name<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06\u5176\u4ed6\u9700\u8981\u6e05\u7406\u7684\u8fde\u63a5\u4fe1\u606f\u6216\u8005\u5176\u4ed6\u4fe1\u606f \u4e5f\u8981\u4e00\u5e76\u505c\u6b62\u6216\u8005\u6e05\u7406<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span>ConnMgr<span class=\"token punctuation\">.<\/span><span class=\"token function\">ClearConn<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Serve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">Start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/TODO Server.Serve() \u662f\u5426\u5728\u542f\u52a8\u670d\u52a1\u7684\u65f6\u5019 \u8fd8\u8981\u5904\u7406\u5176\u4ed6\u7684\u4e8b\u60c5\u5462 \u53ef\u4ee5\u5728\u8fd9\u91cc\u6dfb\u52a0<\/span><br \/>\n<span class=\"token comment\">\/\/\u963b\u585e,\u5426\u5219\u4e3bGo\u9000\u51fa&#xff0c; listenner\u7684go\u5c06\u4f1a\u9000\u51fa<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ntime<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">10<\/span> <span class=\"token operator\">*<\/span> time<span class=\"token punctuation\">.<\/span>Second<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span>msgId <span class=\"token builtin\">uint32<\/span><span class=\"token punctuation\">,<\/span> router ziface<span class=\"token punctuation\">.<\/span>IRouter<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span>msgHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span>msgId<span class=\"token punctuation\">,<\/span> router<span class=\"token punctuation\">)<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Add Router SUCC!! msgID &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> msgId<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u521b\u5efa\u4e00\u4e2a\u670d\u52a1\u5668\u53e5\u67c4<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">NewServer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span>Server <span class=\"token punctuation\">{<\/span><br \/>\nutils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span><span class=\"token function\">Reload<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\ns <span class=\"token operator\">:&#061;<\/span> <span class=\"token operator\">&amp;<\/span>Server<span class=\"token punctuation\">{<\/span><br \/>\nName<span class=\"token punctuation\">:<\/span>       utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>Name<span class=\"token punctuation\">,<\/span><br \/>\nIPVersion<span class=\"token punctuation\">:<\/span>  <span class=\"token string\">&#034;tcp4&#034;<\/span><span class=\"token punctuation\">,<\/span><br \/>\nIP<span class=\"token punctuation\">:<\/span>         utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>Host<span class=\"token punctuation\">,<\/span><br \/>\nPort<span class=\"token punctuation\">:<\/span>       utils<span class=\"token punctuation\">.<\/span>GlobalObject<span class=\"token punctuation\">.<\/span>TcpPort<span class=\"token punctuation\">,<\/span><br \/>\nmsgHandler<span class=\"token punctuation\">:<\/span> <span class=\"token function\">NewMsgHandle<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>   <span class=\"token comment\">\/\/msgHandler \u521d\u59cb\u5316<\/span><br \/>\nConnMgr<span class=\"token punctuation\">:<\/span>    <span class=\"token function\">NewConnManager<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/\/\u521b\u5efaConnManage<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">return<\/span> s<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8be5Server\u7684\u8fde\u63a5\u521b\u5efa\u65f6Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetOnConnStart<\/span><span class=\"token punctuation\">(<\/span>hookFunc <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span>OnConnStart <span class=\"token operator\">&#061;<\/span> hookFunc<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8bbe\u7f6e\u8be5Server\u7684\u8fde\u63a5\u65ad\u5f00\u65f6\u7684Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">SetOnConnStop<\/span><span class=\"token punctuation\">(<\/span>hookFunc <span class=\"token keyword\">func<\/span><span class=\"token punctuation\">(<\/span>ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span>OnConnStop <span class=\"token operator\">&#061;<\/span> hookFunc<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8c03\u7528\u8fde\u63a5OnConnStart Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">CallOnConnStart<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>OnConnStart <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8212;&gt; CallOnConnStart&#8230;.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">OnConnStart<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8c03\u7528\u8fde\u63a5OnConnStop Hook\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>s <span class=\"token operator\">*<\/span>Server<span class=\"token punctuation\">)<\/span> <span class=\"token function\">CallOnConnStop<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">if<\/span> s<span class=\"token punctuation\">.<\/span>OnConnStop <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#8212;&gt; CallOnConnStop&#8230;.&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">OnConnStop<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5ba2\u6237\u7aef<\/p>\n<p><span class=\"token keyword\">package<\/span> main<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/znet&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token string\">&#034;io&#034;<\/span><br \/>\n<span class=\"token string\">&#034;net&#034;<\/span><br \/>\n<span class=\"token string\">&#034;time&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\n\u6a21\u62df\u5ba2\u6237\u7aef<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Client Test &#8230; start&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/3\u79d2\u4e4b\u540e\u53d1\u8d77\u6d4b\u8bd5\u8bf7\u6c42&#xff0c;\u7ed9\u670d\u52a1\u7aef\u5f00\u542f\u670d\u52a1\u7684\u673a\u4f1a<\/span><br \/>\ntime<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span> <span class=\"token operator\">*<\/span> time<span class=\"token punctuation\">.<\/span>Second<span class=\"token punctuation\">)<\/span><br \/>\nconn<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> net<span class=\"token punctuation\">.<\/span><span class=\"token function\">Dial<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;tcp&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;127.0.0.1:7777&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;client start err, exit!&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u53d1\u5c01\u5305message\u6d88\u606f<\/span><br \/>\ndp <span class=\"token operator\">:&#061;<\/span> znet<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewDataPack<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\nmsg<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">_<\/span> <span class=\"token operator\">:&#061;<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Pack<\/span><span class=\"token punctuation\">(<\/span>znet<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewMsgPackage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token function\">byte<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Zinx V0.8 Client0 Test Message&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">Write<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;write error err &#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5148\u8bfb\u51fa\u6d41\u4e2d\u7684head\u90e8\u5206<\/span><br \/>\nheadData <span class=\"token operator\">:&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetHeadLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">&#061;<\/span> io<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadFull<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">,<\/span> headData<span class=\"token punctuation\">)<\/span> <span class=\"token comment\">\/\/ReadFull \u4f1a\u628amsg\u586b\u5145\u6ee1\u4e3a\u6b62<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;read head error&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">break<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/\u5c06headData\u5b57\u8282\u6d41 \u62c6\u5305\u5230msg\u4e2d<\/span><br \/>\nmsgHead<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> dp<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unpack<\/span><span class=\"token punctuation\">(<\/span>headData<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;server unpack err:&#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> msgHead<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/msg \u662f\u6709data\u6570\u636e\u7684&#xff0c;\u9700\u8981\u518d\u6b21\u8bfb\u53d6data\u6570\u636e<\/span><br \/>\nmsg <span class=\"token operator\">:&#061;<\/span> msgHead<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>znet<span class=\"token punctuation\">.<\/span>Message<span class=\"token punctuation\">)<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>Data <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">make<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">byte<\/span><span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetDataLen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u6839\u636edataLen\u4eceio\u4e2d\u8bfb\u53d6\u5b57\u8282\u6d41<\/span><br \/>\n<span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> io<span class=\"token punctuation\">.<\/span><span class=\"token function\">ReadFull<\/span><span class=\"token punctuation\">(<\/span>conn<span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span>Data<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;server unpack data err:&#034;<\/span><span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">return<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;&#061;&#061;&gt; Recv Msg: ID&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span>Id<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;, len&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> msg<span class=\"token punctuation\">.<\/span>DataLen<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;, data&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">.<\/span>Data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\ntime<span class=\"token punctuation\">.<\/span><span class=\"token function\">Sleep<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">*<\/span> time<span class=\"token punctuation\">.<\/span>Second<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u670d\u52a1\u7aef<\/p>\n<p><span class=\"token keyword\">package<\/span> main<\/p>\n<p><span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">(<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/ziface&#034;<\/span><br \/>\n<span class=\"token string\">&#034;datarace\/zinx\/znet&#034;<\/span><br \/>\n<span class=\"token string\">&#034;fmt&#034;<\/span><br \/>\n<span class=\"token punctuation\">)<\/span><\/p>\n<p><span class=\"token comment\">\/\/ ping test \u81ea\u5b9a\u4e49\u8def\u7531<\/span><br \/>\n<span class=\"token keyword\">type<\/span> PingRouter <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nznet<span class=\"token punctuation\">.<\/span>BaseRouter<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Ping Handle<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>this <span class=\"token operator\">*<\/span>PingRouter<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Handle<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Call PingRouter Handle&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5148\u8bfb\u53d6\u5ba2\u6237\u7aef\u7684\u6570\u636e&#xff0c;\u518d\u56de\u5199ping&#8230;ping&#8230;ping<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recv from client : msgId&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;, data&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nerr <span class=\"token operator\">:&#061;<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">SendBuffMsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token function\">byte<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ping&#8230;ping&#8230;ping&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">type<\/span> HelloZinxRouter <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nznet<span class=\"token punctuation\">.<\/span>BaseRouter<br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ HelloZinxRouter Handle<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>this <span class=\"token operator\">*<\/span>HelloZinxRouter<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Handle<\/span><span class=\"token punctuation\">(<\/span>request ziface<span class=\"token punctuation\">.<\/span>IRequest<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Call HelloZinxRouter Handle&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5148\u8bfb\u53d6\u5ba2\u6237\u7aef\u7684\u6570\u636e&#xff0c;\u518d\u56de\u5199ping&#8230;ping&#8230;ping<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recv from client : msgId&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetMsgID<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;, data&#061;&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">string<\/span><span class=\"token punctuation\">(<\/span>request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetData<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\nerr <span class=\"token operator\">:&#061;<\/span> request<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetConnection<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">SendBuffMsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token function\">byte<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Hello Zinx Router V0.10&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521b\u5efa\u8fde\u63a5\u7684\u65f6\u5019\u6267\u884c<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">DoConnectionBegin<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;DoConnecionBegin is Called &#8230; &#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u8bbe\u7f6e\u4e24\u4e2a\u94fe\u63a5\u5c5e\u6027&#xff0c;\u5728\u8fde\u63a5\u521b\u5efa\u4e4b\u540e&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Set conn Name, Home done!&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetProperty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Name&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;Aceld&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\nconn<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetProperty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Home&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;https:\/\/www.jianshu.com\/u\/35261429b7f1&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nerr <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">SendMsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token function\">byte<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;DoConnection BEGIN&#8230;&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">if<\/span> err <span class=\"token operator\">!&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u8fde\u63a5\u65ad\u5f00\u7684\u65f6\u5019\u6267\u884c<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">DoConnectionLost<\/span><span class=\"token punctuation\">(<\/span>conn ziface<span class=\"token punctuation\">.<\/span>IConnection<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;\u5728\u8fde\u63a5\u9500\u6bc1\u4e4b\u524d&#xff0c;\u67e5\u8be2conn\u7684Name&#xff0c;Home\u5c5e\u6027&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\n<span class=\"token keyword\">if<\/span> name<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetProperty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Name&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Conn Property Name &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> name<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">if<\/span> home<span class=\"token punctuation\">,<\/span> err <span class=\"token operator\">:&#061;<\/span> conn<span class=\"token punctuation\">.<\/span><span class=\"token function\">GetProperty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Home&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> err <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Conn Property Home &#061; &#034;<\/span><span class=\"token punctuation\">,<\/span> home<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token comment\">\/\/&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;&#061;<\/span><br \/>\nfmt<span class=\"token punctuation\">.<\/span><span class=\"token function\">Println<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;DoConneciotnLost is Called &#8230; &#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/\u521b\u5efa\u4e00\u4e2aserver\u53e5\u67c4<\/span><br \/>\ns <span class=\"token operator\">:&#061;<\/span> znet<span class=\"token punctuation\">.<\/span><span class=\"token function\">NewServer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u6ce8\u518c\u94fe\u63a5hook\u56de\u8c03\u51fd\u6570<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetOnConnStart<\/span><span class=\"token punctuation\">(<\/span>DoConnectionBegin<span class=\"token punctuation\">)<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">SetOnConnStop<\/span><span class=\"token punctuation\">(<\/span>DoConnectionLost<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u914d\u7f6e\u8def\u7531<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>PingRouter<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">AddRouter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>HelloZinxRouter<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/\/\u5f00\u542f\u670d\u52a1<\/span><br \/>\ns<span class=\"token punctuation\">.<\/span><span class=\"token function\">Serve<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250418151705-68026cf132509.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/> <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250418151705-68026cf14ae85.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb908\u6b21\u3002Zinx \u662f\u4e00\u4e2a\u7528 Go \u8bed\u8a00\u7f16\u5199\u7684\u9ad8\u6027\u80fd\u3001\u8f7b\u91cf\u7ea7\u7684 TCP \u670d\u52a1\u5668\u6846\u67b6\uff0c\u5b83\u88ab\u8bbe\u8ba1\u4e3a\u7b80\u5355\u3001\u5feb\u901f\u4e14\u6613\u4e8e\u4f7f\u7528\u3002Zinx \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u529f\u80fd\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u7f16\u89e3\u7801\u3001\u4e1a\u52a1\u5904\u7406\u3001\u8d1f\u8f7d\u5747\u8861\u7b49\uff0c\u9002\u7528\u4e8e\u6784\u5efa\u5404\u79cd TCP \u7f51\u7edc\u670d\u52a1\uff0c\u5982\u6e38\u620f\u670d\u52a1\u5668\u3001\u5373\u65f6\u901a\u8baf\u670d\u52a1\u5668\u7b49\u3002\u4e0b\u9762\u5b9e\u73b0zinx\u7684\u591a\u4e2a\u529f\u80fd\u5305\u62ec\uff1a\u8def\u7531\u3001\u5168\u5c40\u914d\u7f6e\u3001\u6d88\u606f\u5c01\u88c5\u3001\u8bfb\u5199\u5206\u79bb\u3001\u6d88\u606f\u961f\u5217\u3001\u94fe\u63a5\u7ba1\u7406\u7b49\u3002utils\u5305\u4e0bGlobalObj.go\u3002_zinx<\/p>\n","protected":false},"author":2,"featured_media":16849,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[92,745,423,43,44],"topic":[],"class_list":["post-16852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-github","tag-go","tag-423","tag-43","tag-44"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/16852.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb908\u6b21\u3002Zinx \u662f\u4e00\u4e2a\u7528 Go \u8bed\u8a00\u7f16\u5199\u7684\u9ad8\u6027\u80fd\u3001\u8f7b\u91cf\u7ea7\u7684 TCP \u670d\u52a1\u5668\u6846\u67b6\uff0c\u5b83\u88ab\u8bbe\u8ba1\u4e3a\u7b80\u5355\u3001\u5feb\u901f\u4e14\u6613\u4e8e\u4f7f\u7528\u3002Zinx \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u529f\u80fd\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u7f16\u89e3\u7801\u3001\u4e1a\u52a1\u5904\u7406\u3001\u8d1f\u8f7d\u5747\u8861\u7b49\uff0c\u9002\u7528\u4e8e\u6784\u5efa\u5404\u79cd TCP \u7f51\u7edc\u670d\u52a1\uff0c\u5982\u6e38\u620f\u670d\u52a1\u5668\u3001\u5373\u65f6\u901a\u8baf\u670d\u52a1\u5668\u7b49\u3002\u4e0b\u9762\u5b9e\u73b0zinx\u7684\u591a\u4e2a\u529f\u80fd\u5305\u62ec\uff1a\u8def\u7531\u3001\u5168\u5c40\u914d\u7f6e\u3001\u6d88\u606f\u5c01\u88c5\u3001\u8bfb\u5199\u5206\u79bb\u3001\u6d88\u606f\u961f\u5217\u3001\u94fe\u63a5\u7ba1\u7406\u7b49\u3002utils\u5305\u4e0bGlobalObj.go\u3002_zinx\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/16852.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-18T15:17:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250418151705-68026cf119ec6.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/16852.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/16852.html\",\"name\":\"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-04-18T15:17:06+00:00\",\"dateModified\":\"2025-04-18T15:17:06+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/16852.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/16852.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/16852.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/16852.html","og_locale":"zh_CN","og_type":"article","og_title":"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb908\u6b21\u3002Zinx \u662f\u4e00\u4e2a\u7528 Go \u8bed\u8a00\u7f16\u5199\u7684\u9ad8\u6027\u80fd\u3001\u8f7b\u91cf\u7ea7\u7684 TCP \u670d\u52a1\u5668\u6846\u67b6\uff0c\u5b83\u88ab\u8bbe\u8ba1\u4e3a\u7b80\u5355\u3001\u5feb\u901f\u4e14\u6613\u4e8e\u4f7f\u7528\u3002Zinx \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u529f\u80fd\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u8fde\u63a5\u7ba1\u7406\u3001\u6570\u636e\u7f16\u89e3\u7801\u3001\u4e1a\u52a1\u5904\u7406\u3001\u8d1f\u8f7d\u5747\u8861\u7b49\uff0c\u9002\u7528\u4e8e\u6784\u5efa\u5404\u79cd TCP \u7f51\u7edc\u670d\u52a1\uff0c\u5982\u6e38\u620f\u670d\u52a1\u5668\u3001\u5373\u65f6\u901a\u8baf\u670d\u52a1\u5668\u7b49\u3002\u4e0b\u9762\u5b9e\u73b0zinx\u7684\u591a\u4e2a\u529f\u80fd\u5305\u62ec\uff1a\u8def\u7531\u3001\u5168\u5c40\u914d\u7f6e\u3001\u6d88\u606f\u5c01\u88c5\u3001\u8bfb\u5199\u5206\u79bb\u3001\u6d88\u606f\u961f\u5217\u3001\u94fe\u63a5\u7ba1\u7406\u7b49\u3002utils\u5305\u4e0bGlobalObj.go\u3002_zinx","og_url":"https:\/\/www.wsisp.com\/helps\/16852.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-04-18T15:17:06+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/04\/20250418151705-68026cf119ec6.png"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"13 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/16852.html","url":"https:\/\/www.wsisp.com\/helps\/16852.html","name":"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-04-18T15:17:06+00:00","dateModified":"2025-04-18T15:17:06+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/16852.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/16852.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/16852.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u5e76\u53d1\u670d\u52a1\u5668\u6846\u67b6\u2014\u2014zinx"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/16852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=16852"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/16852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/16849"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=16852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=16852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=16852"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=16852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}