{"id":30,"date":"2010-01-02T01:34:45","date_gmt":"2010-01-01T17:34:45","guid":{"rendered":"http:\/\/sinofool.net\/blog\/?p=30"},"modified":"2010-01-03T14:22:51","modified_gmt":"2010-01-03T06:22:51","slug":"%e4%ba%ba%e4%ba%ba%e7%bd%91%e4%b8%ad%e9%97%b4%e5%b1%82%ef%bc%9a%e5%ae%9e%e8%b7%b5%e7%af%87","status":"publish","type":"post","link":"https:\/\/sinofool.net\/blog\/archives\/30","title":{"rendered":"\u4eba\u4eba\u7f51\u4e2d\u95f4\u5c42\uff1a\u5b9e\u8df5\u7bc7"},"content":{"rendered":"<p>\u4e4b\u524d\u7684\u95ee\u9898\u7bc7\u548c\u6c42\u89e3\u7bc7\u63cf\u8ff0\u4e86\u4eba\u4eba\u7f51\u5728\u53d1\u5c55\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u4ecb\u7ecd\u4e86\u6211\u4eec\u91c7\u7528\u4e2d\u95f4\u5c42\u6765\u63d0\u9ad8\u6027\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u3002\u4eca\u5929\u7684\u5b9e\u8df5\u7bc7\u5c06\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u5b9e\u73b0\u4e00\u4e2a\u4e2d\u95f4\u5c42\u670d\u52a1\u3002<br \/>\n\u8fd9\u4e2a\u670d\u52a1\u8981\u8fbe\u5230\u7684\u76ee\u7684\u662f\u5feb\u901f\u7684\u67e5\u8be2\u7528\u6237\u662f\u5426\u6709\u6548\uff0c\u6570\u636e\u5c06\u8981\u4f7f\u7528bitset\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\uff0c\u6bcf\u4e2a\u7528\u6237\u4e00\u4f4d\uff0c\u4ec5\u4fdd\u5b58\u6b63\u6574\u6570\u7ea621\u4ebf\uff0c\u5360\u7528\u5185\u5b58256M\u3002<\/p>\n<h2>\u5f00\u59cb\u7f16\u7801<\/h2>\n<p>\u4e0b\u9762\u7684\u4ee3\u7801\u90fd\u5728\u8fd9\u4e2a\u4f4d\u7f6e\u4fdd\u5b58\uff1a<a href=\"http:\/\/gitorious.org\/renren\/bitserver\">http:\/\/gitorious.org\/renren\/bitserver<\/a>\u3002<\/p>\n<h2>\u63a5\u53e3\u5b9a\u4e49<\/h2>\n<p>\u5b9a\u4e49\u63a5\u53e3\u5982\u4e0b\uff1a<br \/>\n[code lang=&#8221;c++&#8221;]#include <Ice\/BuiltinSequences.ice><br \/>\nmodule renren {<br \/>\n\u00a0\u00a0\u00a0\u00a0 struct BitSegment {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int begin;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int end;<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ice::ByteSeq data;<br \/>\n\u00a0\u00a0\u00a0\u00a0 };<br \/>\n\u00a0\u00a0\u00a0 interface BitServer {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool get(int offset);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ice::BoolSeq gets(Ice::IntSeq offsets);<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BitSegment getSegment(int begin, int end);<br \/>\n\u00a0\u00a0\u00a0\u00a0 };<br \/>\n};[\/code]<br \/>\n\u8fd9\u4e2aBitServer.ice\u6587\u4ef6\uff0c\u901a\u8fc7slice2cpp\u547d\u4ee4\u7f16\u8bd1\u6210\u4e3a\u670d\u52a1\u7aef\u7684Skeleton\u6587\u4ef6\uff1a<br \/>\n[code lang=&#8221;bash&#8221;]slice2cpp -I\/opt\/Ice-3.3\/slice BitServer.ice[\/code]<\/p>\n<h2>\u670d\u52a1\u7aef<\/h2>\n<p>\u6709\u4e86\u4e0a\u9762\u751f\u6210\u7684\u670d\u52a1\u7aef\u6587\u4ef6\u540e\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u6211\u4eec\u81ea\u5df1\u7684\u4e1a\u52a1\u529f\u80fd\u4e86\u3002<br \/>\nBitServerI.h\u548cBitServerI.cpp\uff0c\u6682\u65f6\u53ea\u662f\u5b9e\u73b0\u4e86\u5355\u4e2aget\u7684\u63a5\u53e3\u3002<br \/>\n[code lang=&#8221;c++&#8221;]#ifndef __BitServerI_h__<br \/>\n#define __BitServerI_h__<\/p>\n<p>#include <BitServer.h><\/p>\n<p>#define SIZE_OF_BIT 2147483647<br \/>\n#include <bitset><\/p>\n<p>namespace renren<br \/>\n{<\/p>\n<p>class BitServerI : virtual public BitServer<br \/>\n{<br \/>\npublic:<br \/>\n void initialize();<\/p>\n<p> virtual bool get(::Ice::Int,<br \/>\n const Ice::Current&#038;);<\/p>\n<p> virtual ::Ice::BoolSeq gets(const ::Ice::IntSeq&#038;,<br \/>\n const Ice::Current&#038;);<\/p>\n<p> virtual ::renren::BitSegment getSegment(::Ice::Int,<br \/>\n ::Ice::Int,<br \/>\n const Ice::Current&#038;);<br \/>\nprivate:<br \/>\n std::bitset<SIZE_OF_BIT> bits_;<br \/>\n};<\/p>\n<p>}<\/p>\n<p>#endif[\/code]<br \/>\n[code lang=&#8221;c++&#8221;]<br \/>\n#include <BitServerI.h><br \/>\n#include <Ice\/Ice.h><\/p>\n<p>int main(int argc, char** argv) {<br \/>\n int status = 0;<br \/>\n Ice::CommunicatorPtr ic;<br \/>\n try{<br \/>\n ic = Ice::initialize(argc, argv);<br \/>\n Ice::ObjectAdapterPtr adapter = ic->createObjectAdapter(&#8220;BitServer&#8221;);<br \/>\n renren::BitServerI* obj = new renren::BitServerI;<br \/>\n obj->initialize();<br \/>\n adapter->add(obj, ic->stringToIdentity(&#8220;BitServer&#8221;));<br \/>\n adapter->activate();<br \/>\n ic->waitForShutdown();<br \/>\n } catch (const Ice::Exception&#038; e) {<br \/>\n std::cerr << e << std::endl;\n status = 1;\n } catch (const std::exception&#038; e) {\n std::cerr << e.what() << std::endl;\n status = 1;\n } catch (...) {\n std::cerr << \"unknown exception\" << std::endl;\n status = 1;\n }\n if (ic) {\n try {\n ic->destroy();<br \/>\n } catch (const Ice::Exception&#038; e) {<br \/>\n std::cerr << e << std::endl;\n status = 1;\n } catch (const std::exception&#038; e) {\n std::cerr << e.what() << std::endl;\n status = 1;\n } catch (...) {\n std::cerr << \"unknown exception\" << std::endl;\n status = 1;\n }\n }\n return status;\n}\n\nvoid\nrenren::BitServerI::initialize() {\n for (int i=0; i<0xFFFFF;i=i+2) {\n bits_[i]=true;\n }\n}\n\nbool\nrenren::BitServerI::get(::Ice::Int offset,\n const Ice::Current&#038; current)\n{\n if(offset < 0) return false;\n return bits_[offset];\n}\n\n::Ice::BoolSeq\nrenren::BitServerI::gets(const ::Ice::IntSeq&#038; offsets,\n const Ice::Current&#038; current)\n{\n return ::Ice::BoolSeq();\n}\n\n::renren::BitSegment\nrenren::BitServerI::getSegment(::Ice::Int begin,\n ::Ice::Int end,\n const Ice::Current&#038; current)\n{\n return ::renren::BitSegment();\n}[\/code]\n\n\n<h2>\u5ba2\u6237\u7aef<\/h2>\n<p>\u6211\u4eec\u4f7f\u7528Java\u4f5c\u4e3a\u5ba2\u6237\u7aef\uff0c\u9996\u5148\u7528slice2java\u5de5\u5177\u751f\u6210Java\u7684Proxy\u7c7b\u3002<br \/>\n[code lang=&#8221;bash&#8221;]slice2java -I\/opt\/Ice-3.3\/slice BitServer.ice[\/code]<br \/>\n\u7136\u540e\u81ea\u5df1\u5b9e\u73b0\u5ba2\u6237\u7aef\u4ee3\u7801\uff1a<br \/>\n[code lang=&#8221;java&#8221;]package renren;<\/p>\n<p>class BitServerAdapter {<br \/>\n private final String endpoints_;<br \/>\n private Ice.Communicator ic_;<br \/>\n private renren.BitServerPrx prx_;<\/p>\n<p> public BitServerAdapter(String endpoints) {<br \/>\n this.endpoints_ = endpoints;<br \/>\n }<\/p>\n<p> public void initialize() {<br \/>\n ic_ = Ice.Util.initialize();<br \/>\n prx_ = renren.BitServerPrxHelper.uncheckedCast(ic_.stringToProxy(endpoints_));<br \/>\n }<\/p>\n<p> public boolean get(int id) {<br \/>\n return prx_.get(id);<br \/>\n }<\/p>\n<p> public static void main(String[] args) {<br \/>\n BitServerAdapter adapter = new BitServerAdapter(args[0]);<br \/>\n adapter.initialize();<br \/>\n boolean ret = adapter.get(Integer.valueOf(args[1]));<br \/>\n System.out.println(ret);<br \/>\n System.exit(0);<br \/>\n }<br \/>\n}[\/code]<\/p>\n<h2>\u6027\u80fd\u6d4b\u8bd5<\/h2>\n<p>\u5b8c\u6210\u4e86\u4ee3\u7801\uff0c\u6765\u6d4b\u8bd5\u4e00\u4e0b\u6027\u80fd\u5427\u3002<br \/>\n\u9996\u5148\u542f\u52a8\u670d\u52a1\u5668<br \/>\n[code lang=&#8221;bash&#8221;]target\/bitserver &#8211;Ice.Config=config[\/code]<br \/>\n\u518d\u542f\u52a8\u5ba2\u6237\u7aef<br \/>\n[code lang=&#8221;bash&#8221;]java -cp \/opt\/Ice-3.3\/lib\/Ice.jar:target\/bitclient.jar \\<br \/>\n  renren.BitServerAdapter \u201cBitServer:default -p 10000\u201d 1022[\/code]<br \/>\n\u5728\u5ba2\u6237\u7aef\u8c03\u7528\u589e\u52a0\u5faa\u73af50000\u6b21\uff0c\u5355\u7ebf\u7a0b\u5e73\u5747\u6bcf\u79d2\u5904\u7406\u4e00\u4e07\u6b21\u3002<\/p>\n<p>\u5728\u591a\u7ebf\u7a0b\u7684\u73af\u5883\u4e0b\uff0c\u5355\u4e2a\u670d\u52a1\u5668\u6bcf\u79d2\u53ef\u5904\u7406\u7684\u8bf7\u6c428\u4e07\u6b21\u5de6\u53f3\uff0c\u5df2\u7ecf\u8d85\u8fc7\u4e86\u76ee\u524d\u7684\u9700\u8981\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e4b\u524d\u7684\u95ee\u9898\u7bc7\u548c\u6c42\u89e3\u7bc7\u63cf\u8ff0\u4e86\u4eba\u4eba\u7f51\u5728\u53d1\u5c55\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u95ee\u9898\uff0c\u5e76\u4e14\u4ecb\u7ecd\u4e86\u6211\u4eec\u91c7\u7528\u4e2d\u95f4\u5c42\u6765\u63d0\u9ad8\u6027\u80fd\u7684\u89e3\u51b3\u65b9\u6848\u3002\u4eca\u5929\u7684\u5b9e\u8df5\u7bc7\u5c06\u901a\u8fc7\u4e00\u4e2a\u4f8b\u5b50\u6765\u5b9e\u73b0\u4e00\u4e2a\u4e2d\u95f4\u5c42\u670d\u52a1\u3002 \u8fd9\u4e2a\u670d\u52a1\u8981\u8fbe\u5230\u7684\u76ee\u7684\u662f\u5feb\u901f\u7684\u67e5\u8be2\u7528\u6237\u662f\u5426\u6709\u6548\uff0c\u6570\u636e\u5c06\u8981\u4f7f\u7528bitset\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\uff0c\u6bcf\u4e2a\u7528\u6237\u4e00\u4f4d\uff0c\u4ec5\u4fdd\u5b58\u6b63\u6574\u6570\u7ea621\u4ebf\uff0c\u5360\u7528\u5185\u5b58256M\u3002 \u5f00\u59cb\u7f16\u7801 \u4e0b\u9762\u7684\u4ee3\u7801\u90fd\u5728\u8fd9\u4e2a\u4f4d\u7f6e\u4fdd\u5b58\uff1ahttp:\/\/gitorious.org\/renren\/bitserver\u3002 \u63a5\u53e3\u5b9a\u4e49 \u5b9a\u4e49\u63a5\u53e3\u5982\u4e0b\uff1a [code lang=&#8221;c++&#8221;]#include module renren { \u00a0\u00a0\u00a0\u00a0 struct BitSegment { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int begin; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int end; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ice::ByteSeq data; \u00a0\u00a0\u00a0\u00a0 }; \u00a0\u00a0\u00a0 interface BitServer { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool get(int offset); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Ice::BoolSeq gets(Ice::IntSeq offsets); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BitSegment getSegment(int begin, int end); \u00a0\u00a0\u00a0\u00a0 }; };[\/code] \u8fd9\u4e2aBitServer.ice\u6587\u4ef6\uff0c\u901a\u8fc7slice2cpp\u547d\u4ee4\u7f16\u8bd1\u6210\u4e3a\u670d\u52a1\u7aef\u7684Skeleton\u6587\u4ef6\uff1a [code lang=&#8221;bash&#8221;]slice2cpp -I\/opt\/Ice-3.3\/slice BitServer.ice[\/code] \u670d\u52a1\u7aef \u6709\u4e86\u4e0a\u9762\u751f\u6210\u7684\u670d\u52a1\u7aef\u6587\u4ef6\u540e\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u6211\u4eec\u81ea\u5df1\u7684\u4e1a\u52a1\u529f\u80fd\u4e86\u3002 BitServerI.h\u548cBitServerI.cpp\uff0c\u6682\u65f6\u53ea\u662f\u5b9e\u73b0\u4e86\u5355\u4e2aget\u7684\u63a5\u53e3\u3002 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-30","post","type-post","status-publish","format-standard","hentry","category-renren","category-tech"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/posts\/30","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/comments?post=30"}],"version-history":[{"count":11,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/posts\/30\/revisions"}],"predecessor-version":[{"id":40,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/posts\/30\/revisions\/40"}],"wp:attachment":[{"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/media?parent=30"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/categories?post=30"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sinofool.net\/blog\/wp-json\/wp\/v2\/tags?post=30"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}