锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美另类中文字幕,在线观看中文字幕不卡,欧美99久久http://www.shnenglu.com/API/category/20757.htmlzh-cnThu, 07 May 2020 14:46:01 GMTThu, 07 May 2020 14:46:01 GMT60origin娓告垙鏈嶅姟鍣ㄥ紩鎿庝粙緇?/title><link>http://www.shnenglu.com/API/archive/2020/05/07/217287.html</link><dc:creator>C++鎶鏈腑蹇?/dc:creator><author>C++鎶鏈腑蹇?/author><pubDate>Thu, 07 May 2020 08:06:00 GMT</pubDate><guid>http://www.shnenglu.com/API/archive/2020/05/07/217287.html</guid><wfw:comment>http://www.shnenglu.com/API/comments/217287.html</wfw:comment><comments>http://www.shnenglu.com/API/archive/2020/05/07/217287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/API/comments/commentRss/217287.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/API/services/trackbacks/217287.html</trackback:ping><description><![CDATA[<div>origin 娓告垙鏈嶅姟鍣ㄥ紩鎿庣畝浠?/div><div>==================</div><div></div><div></div><div>origin 鏄竴涓敱 Go 璇█錛坓olang錛夌紪鍐欑殑鍒嗗竷寮忓紑婧愭父鎴忔湇鍔″櫒寮曟搸銆俹rigin閫傜敤浜庡悇綾繪父鎴忔湇鍔″櫒鐨勫紑鍙戯紝鍖呮嫭 H5錛圚TML5錛夋父鎴忔湇鍔″櫒銆?/div><div></div><div>origin 瑙e喅鐨勯棶棰橈細</div><div>* origin鎬諱綋璁捐濡俫o璇█璁捐涓鏍鳳紝鎬繪槸灝藉彲鑳界殑鎻愪緵綆媧佸拰鏄撶敤鐨勬ā寮忥紝蹇熷紑鍙戙?/div><div>* 鑳藉鏍規(guī)嵁涓氬姟闇姹傚揩閫熷茍鐏墊椿鐨勫埗瀹氭湇鍔″櫒鏋舵瀯銆?/div><div>* 鍒╃敤澶氭牳浼樺娍錛屽皢涓嶅悓鐨剆ervice閰嶇疆鍒頒笉鍚岀殑node錛屽茍鑳介珮鏁堢殑鍗忓悓宸ヤ綔銆?/div><div>* 灝嗘暣涓紩鎿庢娊璞′笁澶у璞★紝node,service,module銆傞氳繃緇熶竴鐨勭粍鍚堟ā鍨嬬鐞嗘父鎴忎腑鍚勫姛鑳芥ā鍧楃殑鍏崇郴銆?/div><div>* 鏈変赴瀵屽茍鍋ュ.鐨勫伐鍏峰簱銆?/div><div></div><div>Hello world!</div><div>---------------</div><div>涓嬮潰鎴戜滑鏉ヤ竴姝ユ鐨勫緩绔媜rigin鏈嶅姟鍣?鍏堜笅杞絒origin寮曟搸](https://github.com/duanhf2012/origin "origin寮曟搸"),鎴栬呬嬌鐢ㄥ涓嬪懡浠わ細</div><div>```go</div><div>go get -v -u  github.com/duanhf2012/origin</div><div>```</div><div>浜庢槸涓嬭澆鍒癎OPATH鐜鐩綍涓?鍦╯rc涓姞鍏ain.go,鍐呭濡備笅錛?/div><div>```go</div><div>package main</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div>)</div><div></div><div>func main() {</div><div><span style="white-space:pre"> </span>node.Start()</div><div>}</div><div>```</div><div>涓涓猳rigin榪涚▼闇瑕佸垱寤轟竴涓猲ode瀵硅薄,Start寮濮嬭繍琛屻傛?zhèn)ㄤ篃鍙互鐩存帴涓嬭浇origin寮曟搸紺轟緥:</div><div>```</div><div>go get -v -u github.com/duanhf2012/originserver</div><div>```</div><div>鏈枃鎵鏈夌殑璇存槑閮芥槸鍩轟簬璇ョず渚嬩負涓匯?/div><div></div><div>origin寮曟搸涓夊ぇ瀵硅薄鍏崇郴</div><div>---------------</div><div>* Node:   鍙互璁や負姣忎竴涓狽ode浠h〃鐫涓涓猳rigin榪涚▼</div><div>* Service:涓涓嫭绔嬬殑鏈嶅姟鍙互璁や負鏄竴涓ぇ鐨勫姛鑳芥ā鍧楋紝浠栨槸Node鐨勫瓙闆嗭紝鍒涘緩瀹屾垚騫跺畨瑁匩ode瀵硅薄涓傛湇鍔″彲浠ユ敮鎸佸澶栭儴RPC絳夊姛鑳姐?/div><div>* Module: 榪欐槸origin鏈灝忓璞″崟鍏冿紝寮虹儓寤鴻鎵鏈夌殑涓氬姟妯″潡閮藉垝鍒嗘垚鍚勪釜灝忕殑Module緇勫悎錛宱rigin寮曟搸灝嗙洃鎺ф墍鏈夋湇鍔′笌Module榪愯鐘舵侊紝渚嬪鍙互鐩戞帶瀹冧滑鐨勬參澶勭悊鍜屾寰幆鍑芥暟銆侻odule鍙互寤虹珛鏍戠姸鍏崇郴銆係ervice鏈韓涔熸槸Module鐨勭被鍨嬨?/div><div></div><div>origin闆嗙兢鏍稿績閰嶇疆鏂囦歡鍦╟onfig鐨刢luster鐩綍涓嬶紝鍦╟luster涓嬫湁瀛愮綉鐩綍錛屽github.com/duanhf2012/originserver鐨刢onfig/cluster鐩綍涓嬫湁subnet鐩綍錛岃〃紺哄瓙緗戝悕涓簊ubnet錛屽彲浠ユ柊鍔犲涓瓙緗戠殑鐩綍閰嶇疆銆傚瓙緗戜笌瀛愮綉闂存槸闅旂鐨勶紝鍚庣畫灝嗘敮鎸佸瓙緗戦棿閫氫俊瑙勫垯錛宱rigin闆嗙兢閰嶇疆浠ュ瓙緗戠殑妯″紡閰嶇疆錛屽湪姣忎釜瀛愮綉涓嬮厤緗涓狽ode鏈嶅姟鍣?瀛愮綉鍦ㄥ簲瀵瑰鏉傜殑緋葷粺鏃跺彲浠ュ簲鐢ㄥ埌鍚勪釜瀛愮郴緇燂紝鏂逛究姣忎釜瀛愮郴緇熺殑闅旂銆傚湪紺轟緥鐨剆ubnet鐩綍涓湁cluster.json涓巗ervice.json閰嶇疆錛?/div><div></div><div>cluster.json濡備笅錛?/div><div>---------------</div><div>```</div><div>{</div><div>    "NodeList":[</div><div>        {</div><div>          "NodeId": 1,</div><div>          "ListenAddr":"127.0.0.1:8001",</div><div>          "NodeName": "Node_Test1",</div><div><span style="white-space:pre"> </span>  "remark":"http://浠鎵撳ご鐨勶紝琛ㄧず鍙湪鏈満榪涚▼錛屼笉瀵規(guī)暣涓瓙緗戝紑鍙?,</div><div>          "ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","_TcpService","HttpService","WSService"]</div><div>        },</div><div><span style="white-space:pre"> </span> {</div><div>          "NodeId": 2,</div><div>          "ListenAddr":"127.0.0.1:8002",</div><div>          "NodeName": "Node_Test1",</div><div><span style="white-space:pre"> </span>  "remark":"http://浠鎵撳ご鐨勶紝琛ㄧず鍙湪鏈満榪涚▼錛屼笉瀵規(guī)暣涓瓙緗戝紑鍙?,</div><div>          "ServiceList": ["TestService1","TestService2","TestServiceCall","GateService","TcpService","HttpService","WSService"]</div><div>        }</div><div>    ]</div><div>```</div><div>---------------</div><div>浠ヤ笂閰嶇疆浜嗕袱涓粨鐐規(guī)湇鍔″櫒紼嬪簭:</div><div>* NodeId: 琛ㄧずorigin紼嬪簭鐨勭粨鐐笽d鏍囪瘑錛屼笉鍏佽閲嶅銆?/div><div>* ListenAddr:Rpc閫氫俊鏈嶅姟鐨勭洃鍚湴鍧</div><div>* NodeName:緇撶偣鍚嶇О</div><div>* remark:澶囨敞錛屽彲閫夐」</div><div>* ServiceList:璇ode灝嗗畨瑁呯殑鏈嶅姟鍒楄〃</div><div>---------------</div><div></div><div>鍦ㄥ惎鍔ㄧ▼搴忓懡浠rogram start nodeid=1涓璶odeid灝辨槸鏍規(guī)嵁璇ラ厤緗杞芥湇鍔°?/div><div>service.json濡備笅錛?/div><div>---------------</div><div>```</div><div>{</div><div>  "Service":{</div><div><span style="white-space:pre"> </span>  "HttpService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9402",</div><div><span style="white-space:pre"> </span>"ReadTimeout":10000,</div><div><span style="white-space:pre"> </span>"WriteTimeout":10000,</div><div><span style="white-space:pre"> </span>"ProcessTimeout":10000,</div><div><span style="white-space:pre"> </span>"CAFile":[</div><div><span style="white-space:pre"> </span>{</div><div><span style="white-space:pre"> </span>"Certfile":"",</div><div><span style="white-space:pre"> </span>"Keyfile":""</div><div><span style="white-space:pre"> </span>}</div><div><span style="white-space:pre"> </span>]</div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre"> </span>  },</div><div><span style="white-space:pre"> </span>  "TcpService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9030",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"LittleEndian":false,</div><div><span style="white-space:pre"> </span>"MinMsgLen":4,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  },</div><div><span style="white-space:pre"> </span>  "WSService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9031",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  }  </div><div>  },</div><div>  "NodeService":[</div><div>   {</div><div>      "NodeId":1,</div><div><span style="white-space:pre"> </span>  "TcpService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9830",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"LittleEndian":false,</div><div><span style="white-space:pre"> </span>"MinMsgLen":4,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  },</div><div><span style="white-space:pre"> </span>  "WSService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9031",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  }  </div><div>   },</div><div>   {</div><div>      "NodeId":2,</div><div><span style="white-space:pre"> </span>  "TcpService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9030",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"LittleEndian":false,</div><div><span style="white-space:pre"> </span>"MinMsgLen":4,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  },</div><div><span style="white-space:pre"> </span>  "WSService":{</div><div><span style="white-space:pre"> </span>"ListenAddr":"0.0.0.0:9031",</div><div><span style="white-space:pre"> </span>"MaxConnNum":3000,</div><div><span style="white-space:pre"> </span>"PendingWriteNum":10000,</div><div><span style="white-space:pre"> </span>"MaxMsgLen":65535</div><div><span style="white-space:pre"> </span>  }  </div><div>   }</div><div>  ]</div><div> </div><div>}</div><div>```</div><div></div><div>---------------</div><div>浠ヤ笂閰嶇疆鍒嗕負涓や釜閮ㄥ垎錛歋ervice涓嶯odeService錛孨odeService涓厤緗殑瀵瑰簲緇撶偣涓湇鍔$殑閰嶇疆錛屽鏋滃惎鍔ㄧ▼搴忎腑鏍規(guī)嵁nodeid鏌ユ壘璇ュ煙鐨勫搴旂殑鏈嶅姟錛屽鏋滄壘涓嶅埌鏃訛紝浠嶴ervice鍏叡閮ㄥ垎鏌ユ壘銆?/div><div></div><div>**HttpService閰嶇疆**</div><div>* ListenAddr:Http鐩戝惉鍦板潃</div><div>* ReadTimeout:璇葷綉緇滆秴鏃舵縐?/div><div>* WriteTimeout:鍐欑綉緇滆秴鏃舵縐?/div><div>* ProcessTimeout: 澶勭悊瓚呮椂姣</div><div>* CAFile: 璇佷功鏂囦歡錛屽鏋滄?zhèn)ㄧ殑鏈嶅姟鍣ㄩ氳繃web鏈嶅姟鍣ㄤ唬鐞嗛厤緗甴ttps鍙互蹇界暐璇ラ厤緗?/div><div></div><div>**TcpService閰嶇疆**</div><div>* ListenAddr: 鐩戝惉鍦板潃</div><div>* MaxConnNum: 鍏佽鏈澶ц繛鎺ユ暟</div><div>* PendingWriteNum錛氬彂閫佺綉緇滈槦鍒楁渶澶ф暟閲?/div><div>* LittleEndian:鏄惁灝忕</div><div>* MinMsgLen:鍖呮渶灝忛暱搴?/div><div>* MaxMsgLen:鍖呮渶澶ч暱搴?/div><div></div><div>**WSService閰嶇疆**</div><div>* ListenAddr: 鐩戝惉鍦板潃</div><div>* MaxConnNum: 鍏佽鏈澶ц繛鎺ユ暟</div><div>* PendingWriteNum錛氬彂閫佺綉緇滈槦鍒楁渶澶ф暟閲?/div><div>* MaxMsgLen:鍖呮渶澶ч暱搴?/div><div>---------------</div><div></div><div></div><div></div><div></div><div>絎竴绔狅細origin鍩虹:</div><div>---------------</div><div>鏌ョ湅github.com/duanhf2012/originserver涓殑simple_service涓柊寤轟袱涓湇鍔★紝鍒嗗埆鏄疶estService1.go涓嶤TestService2.go銆?/div><div></div><div>simple_service/TestService1.go濡備笅錛?/div><div>```</div><div>package simple_service</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div>)</div><div></div><div>//妯″潡鍔犺澆鏃惰嚜鍔ㄥ畨瑁匱estService1鏈嶅姟</div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService1{})</div><div>}</div><div></div><div>//鏂板緩鑷畾涔夋湇鍔estService1</div><div>type TestService1 struct {</div><div></div><div><span style="white-space:pre"> </span>//鎵鏈夌殑鑷畾涔夋湇鍔″繀闇鍔犲叆service.Service鍩烘湇鍔?/div><div><span style="white-space:pre"> </span>//閭d箞璇ヨ嚜瀹氫箟鏈嶅姟灝嗘湁鍚勭鍔熻兘鐗規(guī)?/div><div><span style="white-space:pre"> </span>//渚嬪: Rpc,浜嬩歡椹卞姩,瀹氭椂鍣ㄧ瓑</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>//鏈嶅姟鍒濆鍖栧嚱鏁幫紝鍦ㄥ畨瑁呮湇鍔℃椂錛屾湇鍔″皢鑷姩璋冪敤OnInit鍑芥暟</div><div>func (slf *TestService1) OnInit() error {</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div></div><div>```</div><div>simple_service/TestService2.go濡備笅錛?/div><div>```</div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService2{})</div><div>}</div><div></div><div>type TestService2 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>func (slf *TestService2) OnInit() error {</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div></div><div>```</div><div></div><div>* main.go榪愯浠g爜</div><div></div><div>```go</div><div>package main</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>//瀵煎叆simple_service妯″潡</div><div><span style="white-space:pre"> </span>_"orginserver/simple_service"</div><div>)</div><div></div><div>func main(){</div><div><span style="white-space:pre"> </span>node.Start()</div><div>}</div><div></div><div>```</div><div></div><div>* config/cluster/subnet/cluster.json濡備笅錛?/div><div>```</div><div>{</div><div>    "NodeList":[</div><div>        {</div><div>          "NodeId": 1,</div><div>          "ListenAddr":"127.0.0.1:8001",</div><div>          "NodeName": "Node_Test1",</div><div><span style="white-space:pre"> </span>  "remark":"http://浠鎵撳ご鐨勶紝琛ㄧず鍙湪鏈満榪涚▼錛屼笉瀵規(guī)暣涓瓙緗戝紑鍙?,</div><div>          "ServiceList": ["TestService1","TestService2"]</div><div>        }</div><div>    ]</div><div>}</div><div>```</div><div></div><div>緙栬瘧鍚庤繍琛岀粨鏋滃涓嬶細</div><div>```</div><div>#originserver start nodeid=1</div><div>TestService1 OnInit.</div><div>TestService2 OnInit.</div><div>```</div><div></div><div>絎簩绔狅細Service涓父鐢ㄥ姛鑳?</div><div>---------------</div><div></div><div>瀹氭椂鍣?</div><div>---------------</div><div>鍦ㄥ紑鍙戜腑鏈甯哥敤鐨勫姛鑳芥湁瀹氭椂浠誨姟錛宱rigin鎻愪緵涓ょ瀹氭椂鏂瑰紡錛?/div><div></div><div>涓縐岮fterFunc鍑芥暟錛屽彲浠ラ棿闅斾竴瀹氭椂闂磋Е鍙戝洖璋冿紝鍙傜収simple_service/TestService2.go,瀹炵幇濡備笅錛?/div><div>```</div><div>func (slf *TestService2) OnInit() error {</div><div><span style="white-space:pre"> </span>fmt.Printf("TestService2 OnInit.\n")</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*1,slf.OnSecondTick)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestService2) OnSecondTick(){</div><div><span style="white-space:pre"> </span>fmt.Printf("tick.\n")</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*1,slf.OnSecondTick)</div><div>}</div><div>```</div><div>姝ゆ椂鏃ュ織鍙互鐪嬪埌姣忛殧1縐掗挓浼歱rint涓嬈?tick."錛屽鏋滀笅嬈¤繕闇瑕佽Е鍙戯紝闇瑕侀噸鏂拌緗畾鏃跺櫒</div><div></div><div></div><div>鍙︿竴縐嶆柟寮忔槸綾諱技Linux緋葷粺鐨刢rontab鍛戒護錛屼嬌鐢ㄥ涓嬶細</div><div>```</div><div></div><div>func (slf *TestService2) OnInit() error {</div><div><span style="white-space:pre"> </span>fmt.Printf("TestService2 OnInit.\n")</div><div></div><div><span style="white-space:pre"> </span>//crontab妯″紡瀹氭椂瑙﹀彂</div><div><span style="white-space:pre"> </span>//NewCronExpr鐨勫弬鏁板垎鍒唬琛?Seconds Minutes Hours DayOfMonth Month DayOfWeek</div><div><span style="white-space:pre"> </span>//浠ヤ笅涓烘瘡鎹㈠垎閽熸椂瑙﹀彂</div><div><span style="white-space:pre"> </span>cron,_:=timer.NewCronExpr("0 * * * * *")</div><div><span style="white-space:pre"> </span>slf.CronFunc(cron,slf.OnCron)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div></div><div>func (slf *TestService2) OnCron(){</div><div><span style="white-space:pre"> </span>fmt.Printf(":A minute passed!\n")</div><div>}</div><div>```</div><div>浠ヤ笂榪愯緇撴灉姣忔崲鍒嗛挓鏃舵墦鍗?A minute passed!</div><div></div><div></div><div>鎵撳紑澶氬崗紼嬫ā寮?</div><div>---------------</div><div>鍦╫rigin寮曟搸璁捐涓紝鎵鏈夌殑鏈嶅姟鏄崟鍗忕▼妯″紡錛岃繖鏍峰湪緙栧啓閫昏緫浠g爜鏃訛紝涓嶇敤鑰冭檻綰跨▼瀹夊叏闂銆傛瀬澶х殑鍑忓皯寮鍙戦毦搴︼紝浣嗘煇浜涘紑鍙戝満鏅笅涓嶇敤鑰冭檻榪欎釜闂錛岃屼笖闇瑕佸茍鍙戞墽琛岀殑鎯呭喌錛屾瘮濡傦紝鏌愭湇鍔″彧澶勭悊鏁版嵁搴撴搷浣滄帶鍒訛紝鑰屾暟鎹簱澶勭悊涓彂鐢熼樆濉炵瓑寰呯殑闂錛屽洜涓轟竴涓崗紼嬶紝璇ユ湇鍔℃帴鍙楃殑鏁版嵁搴撴搷浣滃彧鑳芥槸涓涓?/div><div>涓涓殑鎺掗槦澶勭悊錛屾晥鐜囪繃浣庛備簬鏄彲浠ユ墦寮姝ゆā寮忔寚瀹氬鐞嗗崗紼嬫暟錛屼唬鐮佸涓嬶細</div><div>```</div><div>func (slf *TestService1) OnInit() error {</div><div><span style="white-space:pre"> </span>fmt.Printf("TestService1 OnInit.\n")</div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre"> </span>//鎵撳紑澶氱嚎紼嬪鐞嗘ā寮忥紝10涓崗紼嬪茍鍙戝鐞?/div><div><span style="white-space:pre"> </span>slf.SetGoRouterNum(10)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div>```</div><div>涓轟簡</div><div></div><div></div><div>鎬ц兘鐩戞帶鍔熻兘:</div><div>---------------</div><div>鎴戜滑鍦ㄥ紑鍙戜竴涓ぇ鍨嬬殑緋葷粺鏃訛紝緇忓父鐢變簬涓浜涗唬鐮佽川閲忕殑鍘熷洜錛屼駭鐢熷鐞嗚繃鎱㈡垨鑰呮寰幆鐨勪駭鐢燂紝璇ュ姛鑳藉彲浠ヨ鐩戞祴鍒般備嬌鐢ㄦ柟娉曞涓嬶細</div><div></div><div>```</div><div>func (slf *TestService1) OnInit() error {</div><div><span style="white-space:pre"> </span>fmt.Printf("TestService1 OnInit.\n")</div><div><span style="white-space:pre"> </span>//鎵撳紑鎬ц兘鍒嗘瀽宸ュ叿</div><div><span style="white-space:pre"> </span>slf.OpenProfiler()</div><div><span style="white-space:pre"> </span>//鐩戞帶瓚呰繃1縐掔殑鎱㈠鐞?/div><div><span style="white-space:pre"> </span>slf.GetProfiler().SetOverTime(time.Second*1)</div><div><span style="white-space:pre"> </span>//鐩戞帶瓚呰繃10縐掔殑瓚呮參澶勭悊錛屾?zhèn)ㄥ彲浠ョ敤瀹冩潵瀹氫綅鏄惁瀛樺湪姝诲惊鐜?/div><div><span style="white-space:pre"> </span>//姣斿浠ヤ笅璁劇疆10縐掞紝鎴戠殑搴旂敤涓槸涓嶄細鍙戠敓瓚呰繃10縐掔殑涓嬈″嚱鏁拌皟鐢?/div><div><span style="white-space:pre"> </span>//鎵浠ヨ緗負10縐掋?/div><div><span style="white-space:pre"> </span>slf.GetProfiler().SetMaxOverTime(time.Second*10)</div><div></div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*2,slf.Loop)</div><div><span style="white-space:pre"> </span>//鎵撳紑澶氱嚎紼嬪鐞嗘ā寮忥紝10涓崗紼嬪茍鍙戝鐞?/div><div><span style="white-space:pre"> </span>//slf.SetGoRouterNum(10)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestService1) Loop(){</div><div><span style="white-space:pre"> </span>for {</div><div><span style="white-space:pre"> </span>time.Sleep(time.Second*1)</div><div><span style="white-space:pre"> </span>}</div><div>}</div><div></div><div></div><div>func main(){</div><div><span style="white-space:pre"> </span>//鎵撳紑鎬ц兘鍒嗘瀽鎶ュ憡鍔熻兘錛屽茍璁劇疆10縐掓眹鎶ヤ竴嬈?/div><div><span style="white-space:pre"> </span>node.OpenProfilerReport(time.Second*10)</div><div><span style="white-space:pre"> </span>node.Start()</div><div>}</div><div></div><div>```</div><div>涓婇潰閫氳繃GetProfiler().SetOverTime涓巗lf.GetProfiler().SetMaxOverTimer璁劇疆鐩戞帶鏃墮棿</div><div>騫跺湪main.go涓紝鎵撳紑浜嗘ц兘鎶ュ憡鍣紝浠ユ瘡10縐掓眹鎶ヤ竴嬈★紝鍥犱負涓婇潰鐨勪緥瀛愪腑錛屽畾鏃跺櫒鏄湁姝誨驚鐜紝鎵浠ュ彲浠ュ緱鍒頒互涓嬫姤鍛婏細</div><div></div><div>2020/04/22 17:53:30 profiler.go:179: [release] Profiler report tag TestService1:</div><div>process count 0,take time 0 Milliseconds,average 0 Milliseconds/per.</div><div>too slow process:Timer_orginserver/simple_service.(*TestService1).Loop-fm is take 38003 Milliseconds</div><div>鐩存帴甯姪鎵懼埌TestService1鏈嶅姟涓殑Loop鍑芥暟</div><div></div><div></div><div></div><div>絎笁绔狅細Module浣跨敤:</div><div>---------------</div><div></div><div>Module鍒涘緩涓庨攢姣?</div><div>---------------</div><div>鍙互璁や負Service灝辨槸涓縐峂odule錛屽畠鏈塎odule鎵鏈夌殑鍔熻兘銆傚湪紺轟緥浠g爜涓彲浠ュ弬鑰僶riginserver/simple_module/TestService3.go銆?/div><div>```</div><div>package simple_module</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"fmt"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService3{})</div><div>}</div><div></div><div>type TestService3 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>type Module1 struct {</div><div><span style="white-space:pre"> </span>service.Module</div><div>}</div><div></div><div>type Module2 struct {</div><div><span style="white-space:pre"> </span>service.Module</div><div>}</div><div></div><div>func (slf *Module1) OnInit()error{</div><div><span style="white-space:pre"> </span>fmt.Printf("Module1 OnInit.\n")</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *Module1) OnRelease(){</div><div><span style="white-space:pre"> </span>fmt.Printf("Module1 Release.\n")</div><div>}</div><div></div><div>func (slf *Module2) OnInit()error{</div><div><span style="white-space:pre"> </span>fmt.Printf("Module2 OnInit.\n")</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *Module2) OnRelease(){</div><div><span style="white-space:pre"> </span>fmt.Printf("Module2 Release.\n")</div><div>}</div><div></div><div></div><div>func (slf *TestService3) OnInit() error {</div><div><span style="white-space:pre"> </span>//鏂板緩涓や釜Module瀵硅薄</div><div><span style="white-space:pre"> </span>module1 := &Module1{}</div><div><span style="white-space:pre"> </span>module2 := &Module2{}</div><div><span style="white-space:pre"> </span>//灝唌odule1娣誨姞鍒版湇鍔′腑</div><div><span style="white-space:pre"> </span>module1Id,_ := slf.AddModule(module1)</div><div><span style="white-space:pre"> </span>//鍦╩odule1涓坊鍔爉odule2妯″潡</div><div><span style="white-space:pre"> </span>module1.AddModule(module2)</div><div><span style="white-space:pre"> </span>fmt.Printf("module1 id is %d, module2 id is %d",module1Id,module2.GetModuleId())</div><div></div><div><span style="white-space:pre"> </span>//閲婃斁妯″潡module1</div><div><span style="white-space:pre"> </span>slf.ReleaseModule(module1Id)</div><div><span style="white-space:pre"> </span>fmt.Printf("xxxxxxxxxxx")</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>```</div><div>鍦∣nInit涓垱寤轟簡涓鏉$嚎鍨嬬殑妯″潡鍏崇郴TestService3->module1->module2錛岃皟鐢ˋddModule鍚庝細榪斿洖Module鐨処d錛岃嚜鍔ㄧ敓鎴愮殑Id浠?0e17寮濮?鍐呴儴鐨刬d錛屾?zhèn)ㄥ彲浠ヨ嚜宸辫畡〗甀d銆傚綋璋冪敤ReleaseModule閲婃斁鏃秏odule1鏃訛紝鍚屾牱浼氬皢module2閲婃斁銆備細鑷姩璋冪敤OnRelease鍑芥暟錛屾棩蹇楅『搴忓涓嬶細</div><div>```</div><div>Module1 OnInit.</div><div>Module2 OnInit.</div><div>module1 id is 100000000000000001, module2 id is 100000000000000002</div><div>Module2 Release.</div><div>Module1 Release.</div><div>```</div><div>鍦∕odule涓悓鏍峰彲浠ヤ嬌鐢ㄥ畾鏃跺櫒鍔熻兘錛岃鍙傜収絎簩绔犺妭鐨勫畾鏃跺櫒閮ㄥ垎銆?/div><div></div><div></div><div>絎洓绔狅細浜嬩歡浣跨敤</div><div>---------------</div><div>浜嬩歡鏄痮rigin涓竴涓噸瑕佺殑緇勬垚閮ㄥ垎錛屽彲浠ュ湪鍚屼竴涓猲ode涓殑service涓巗ervice鎴栬呬笌module涔嬮棿榪涜浜嬩歡閫氱煡銆傜郴緇熷唴緗殑鍑犱釜鏈嶅姟錛屽錛歍cpService/HttpService絳夐兘鏄氳繃浜嬩歡鍔熻兘瀹炵幇銆備粬涔熸槸涓涓吀鍨嬬殑瑙傚療鑰呰璁℃ā鍨嬨傚湪event涓湁涓や釜綾誨瀷鐨刬nterface錛屼竴涓槸event.IEventProcessor瀹冩彁渚涙敞鍐屼笌鍗歌澆鍔熻兘錛屽彟涓涓槸event.IEventHandler鎻愪緵娑堟伅騫挎挱絳夊姛鑳姐?/div><div></div><div>鍦ㄧ洰褰晄imple_event/TestService4.go涓?/div><div>```</div><div>package simple_event</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/event"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div><span style="white-space:pre"> </span>"time"</div><div>)</div><div></div><div>const (</div><div><span style="white-space:pre"> </span>//鑷畾涔変簨浠剁被鍨嬶紝蹇呴渶浠巈vent.Sys_Event_User_Define寮濮?/div><div><span style="white-space:pre"> </span>//event.Sys_Event_User_Define浠ュ唴緇欑郴緇熼鐣?/div><div><span style="white-space:pre"> </span>EVENT1 event.EventType =event.Sys_Event_User_Define+1</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService4{})</div><div>}</div><div></div><div>type TestService4 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>func (slf *TestService4) OnInit() error {</div><div><span style="white-space:pre"> </span>//10縐掑悗瑙﹀彂騫挎挱浜嬩歡</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*10,slf.TriggerEvent)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestService4) TriggerEvent(){</div><div><span style="white-space:pre"> </span>//騫挎挱浜嬩歡錛屼紶鍏vent.Event瀵硅薄錛岀被鍨嬩負EVENT1,Data鍙互鑷畾涔変換浣曟暟鎹?/div><div><span style="white-space:pre"> </span>//榪欐牱錛屾墍鏈夌洃鍚呴兘鍙互鏀跺埌璇ヤ簨浠?/div><div><span style="white-space:pre"> </span>slf.GetEventHandler().NotifyEvent(&event.Event{</div><div><span style="white-space:pre"> </span>Type: EVENT1,</div><div><span style="white-space:pre"> </span>Data: "event data.",</div><div><span style="white-space:pre"> </span>})</div><div>}</div><div></div><div></div><div>```</div><div></div><div>鍦ㄧ洰褰晄imple_event/TestService5.go涓?/div><div>```</div><div>package simple_event</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"fmt"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/event"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService5{})</div><div>}</div><div></div><div>type TestService5 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>type TestModule struct {</div><div><span style="white-space:pre"> </span>service.Module</div><div>}</div><div></div><div>func (slf *TestModule) OnInit() error{</div><div><span style="white-space:pre"> </span>//鍦ㄥ綋鍓峮ode涓煡鎵綯estService4</div><div><span style="white-space:pre"> </span>pService := node.GetService("TestService4")</div><div></div><div><span style="white-space:pre"> </span>//鍦═estModule涓紝寰TestService4涓敞鍐孍VENT1綾誨瀷浜嬩歡鐩戝惉</div><div><span style="white-space:pre"> </span>pService.(*TestService4).GetEventProcessor().RegEventReciverFunc(EVENT1,slf.GetEventHandler(),slf.OnModuleEvent)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestModule) OnModuleEvent(ev *event.Event){</div><div><span style="white-space:pre"> </span>fmt.Printf("OnModuleEvent type :%d data:%+v\n",ev.Type,ev.Data)</div><div>}</div><div></div><div></div><div>//鏈嶅姟鍒濆鍖栧嚱鏁幫紝鍦ㄥ畨瑁呮湇鍔℃椂錛屾湇鍔″皢鑷姩璋冪敤OnInit鍑芥暟</div><div>func (slf *TestService5) OnInit() error {</div><div><span style="white-space:pre"> </span>//閫氳繃鏈嶅姟鍚嶈幏鍙栨湇鍔″璞?/div><div><span style="white-space:pre"> </span>pService := node.GetService("TestService4")</div><div></div><div><span style="white-space:pre"> </span>////鍦═estModule涓紝寰TestService4涓敞鍐孍VENT1綾誨瀷浜嬩歡鐩戝惉</div><div><span style="white-space:pre"> </span>pService.(*TestService4).GetEventProcessor().RegEventReciverFunc(EVENT1,slf.GetEventHandler(),slf.OnServiceEvent)</div><div><span style="white-space:pre"> </span>slf.AddModule(&TestModule{})</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestService5) OnServiceEvent(ev *event.Event){</div><div><span style="white-space:pre"> </span>fmt.Printf("OnServiceEvent type :%d data:%+v\n",ev.Type,ev.Data)</div><div>}</div><div></div><div></div><div>```</div><div>紼嬪簭榪愯10縐掑悗錛岃皟鐢╯lf.TriggerEvent鍑芥暟騫挎挱浜嬩歡錛屼簬鏄湪TestService5涓細鏀跺埌</div><div>```</div><div>OnServiceEvent type :1001 data:event data.</div><div>OnModuleEvent type :1001 data:event data.</div><div>```</div><div>鍦ㄤ笂闈㈢殑TestModule涓洃鍚殑浜嬫儏錛屽綋榪欎釜Module琚玆elease鏃剁洃鍚細鑷姩鍗歌澆銆?/div><div></div><div>絎簲绔狅細RPC浣跨敤</div><div>---------------</div><div>RPC鏄痵ervice涓巗ervice闂撮氫俊鐨勯噸瑕佹柟寮忥紝瀹冨厑璁歌法榪涚▼node浜掔浉璁塊棶錛屽綋鐒朵篃鍙互鎸囧畾nodeid榪涜璋冪敤銆傚涓嬬ず渚嬶細</div><div></div><div>simple_rpc/TestService6.go鏂囦歡濡備笅錛?/div><div>```</div><div>package simple_rpc</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService6{})</div><div>}</div><div></div><div>type TestService6 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>func (slf *TestService6) OnInit() error {</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>type InputData struct {</div><div><span style="white-space:pre"> </span>A int</div><div><span style="white-space:pre"> </span>B int</div><div>}</div><div></div><div>func (slf *TestService6) RPC_Sum(input *InputData,output *int) error{</div><div><span style="white-space:pre"> </span>*output = input.A+input.B</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>```</div><div></div><div>simple_rpc/TestService7.go鏂囦歡濡備笅錛?/div><div>```</div><div>package simple_rpc</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"fmt"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div><span style="white-space:pre"> </span>"time"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&TestService7{})</div><div>}</div><div></div><div>type TestService7 struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>func (slf *TestService7) OnInit() error {</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*2,slf.CallTest)</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*2,slf.AsyncCallTest)</div><div><span style="white-space:pre"> </span>slf.AfterFunc(time.Second*2,slf.GoTest)</div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestService7) CallTest(){</div><div><span style="white-space:pre"> </span>var input InputData</div><div><span style="white-space:pre"> </span>input.A = 300</div><div><span style="white-space:pre"> </span>input.B = 600</div><div><span style="white-space:pre"> </span>var output int</div><div></div><div><span style="white-space:pre"> </span>//鍚屾璋冪敤鍏朵粬鏈嶅姟鐨剅pc,input涓轟紶鍏ョ殑rpc,output涓鴻緭鍑哄弬鏁?/div><div><span style="white-space:pre"> </span>err := slf.Call("TestService6.RPC_Sum",&input,&output)</div><div><span style="white-space:pre"> </span>if err != nil {</div><div><span style="white-space:pre"> </span>fmt.Printf("Call error :%+v\n",err)</div><div><span style="white-space:pre"> </span>}else{</div><div><span style="white-space:pre"> </span>fmt.Printf("Call output %d\n",output)</div><div><span style="white-space:pre"> </span>}</div><div>}</div><div></div><div></div><div>func (slf *TestService7) AsyncCallTest(){</div><div><span style="white-space:pre"> </span>var input InputData</div><div><span style="white-space:pre"> </span>input.A = 300</div><div><span style="white-space:pre"> </span>input.B = 600</div><div><span style="white-space:pre"> </span>/*slf.AsyncCallNode(1,"TestService6.RPC_Sum",&input,func(output *int,err error){</div><div><span style="white-space:pre"> </span>})*/</div><div><span style="white-space:pre"> </span>//寮傛璋冪敤錛屽湪鏁版嵁榪斿洖鏃訛紝浼氬洖璋冧紶鍏ュ嚱鏁?/div><div><span style="white-space:pre"> </span>//娉ㄦ剰鍑芥暟鐨勭涓涓弬鏁頒竴瀹氭槸RPC_Sum鍑芥暟鐨勭浜屼釜鍙傛暟錛宔rr error涓篟PC_Sum榪斿洖鍊?/div><div><span style="white-space:pre"> </span>slf.AsyncCall("TestService6.RPC_Sum",&input,func(output *int,err error){</div><div><span style="white-space:pre"> </span>if err != nil {</div><div><span style="white-space:pre"> </span>fmt.Printf("AsyncCall error :%+v\n",err)</div><div><span style="white-space:pre"> </span>}else{</div><div><span style="white-space:pre"> </span>fmt.Printf("AsyncCall output %d\n",*output)</div><div><span style="white-space:pre"> </span>}</div><div><span style="white-space:pre"> </span>})</div><div>}</div><div></div><div>func (slf *TestService7) GoTest(){</div><div><span style="white-space:pre"> </span>var input InputData</div><div><span style="white-space:pre"> </span>input.A = 300</div><div><span style="white-space:pre"> </span>input.B = 600</div><div></div><div><span style="white-space:pre"> </span>//鍦ㄦ煇浜涘簲鐢ㄥ満鏅笅涓嶉渶瑕佹暟鎹繑鍥炲彲浠ヤ嬌鐢℅o錛屽畠鏄笉闃誨鐨?鍙渶瑕佸~鍏ヨ緭鍏ュ弬鏁?/div><div><span style="white-space:pre"> </span>err := slf.Go("TestService6.RPC_Sum",&input)</div><div><span style="white-space:pre"> </span>if err != nil {</div><div><span style="white-space:pre"> </span>fmt.Printf("Go error :%+v\n",err)</div><div><span style="white-space:pre"> </span>}</div><div></div><div><span style="white-space:pre"> </span>//浠ヤ笅鏄箍鎾柟寮忥紝濡傛灉鍦ㄥ悓涓涓瓙緗戜腑鏈夊涓悓鍚嶇殑鏈嶅姟鍚嶏紝CastGo灝嗕細騫挎挱緇欐墍鏈夌殑node</div><div><span style="white-space:pre"> </span>//slf.CastGo("TestService6.RPC_Sum",&input)</div><div>}</div><div></div><div>```</div><div>鎮(zhèn)ㄥ彲浠ユ妸TestService6閰嶇疆鍒板叾浠栫殑Node涓紝姣斿NodeId涓?涓傚彧瑕佸湪涓涓瓙緗戯紝origin寮曟搸鍙互鏃犲樊鍒皟鐢ㄣ傚紑鍙戣呭彧闇瑕佸叧娉⊿ervice鍏崇郴銆傚悓鏍峰畠涔熸槸鎮(zhèn)ㄦ湇鍔″櫒鏋舵瀯璁捐鐨勬牳蹇冮渶瑕佹濊冪殑閮ㄥ垎銆?/div><div></div><div></div><div>絎叚绔狅細HttpService浣跨敤</div><div>---------------</div><div>HttpService鏄痮rigin寮曟搸涓郴緇熷疄鐜扮殑http鏈嶅姟錛宧ttp鎺ュ彛涓父鐢ㄧ殑GET,POST浠ュ強url璺敱澶勭悊銆?/div><div></div><div>simple_http/TestHttpService.go鏂囦歡濡備笅錛?/div><div>```</div><div>package simple_http</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"fmt"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/sysservice"</div><div><span style="white-space:pre"> </span>"net/http"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&sysservice.HttpService{})</div><div><span style="white-space:pre"> </span>node.Setup(&TestHttpService{})</div><div>}</div><div></div><div>//鏂板緩鑷畾涔夋湇鍔estService1</div><div>type TestHttpService struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div>}</div><div></div><div>func (slf *TestHttpService) OnInit() error {</div><div><span style="white-space:pre"> </span>//鑾峰彇緋葷粺httpservice鏈嶅姟</div><div><span style="white-space:pre"> </span>httpervice := node.GetService("HttpService").(*sysservice.HttpService)</div><div></div><div><span style="white-space:pre"> </span>//鏂板緩騫惰緗礬鐢卞璞?/div><div><span style="white-space:pre"> </span>httpRouter := sysservice.NewHttpHttpRouter()</div><div><span style="white-space:pre"> </span>httpervice.SetHttpRouter(httpRouter,slf.GetEventHandler())</div><div></div><div><span style="white-space:pre"> </span>//GET鏂規(guī)硶錛岃姹倁rl:http://127.0.0.1:9402/get/query?nickname=boyce</div><div><span style="white-space:pre"> </span>//騫秇eader涓柊澧瀔ey涓簎id,value涓?000鐨勫ご,鍒欑敤postman嫻嬭瘯榪斿洖緇撴灉涓猴細</div><div><span style="white-space:pre"> </span>//head uid:1000, nickname:boyce</div><div><span style="white-space:pre"> </span>httpRouter.GET("/get/query", slf.HttpGet)</div><div></div><div><span style="white-space:pre"> </span>//POST鏂規(guī)硶 璇鋒眰url:http://127.0.0.1:9402/post/query</div><div><span style="white-space:pre"> </span>//榪斿洖緇撴灉涓猴細{"msg":"hello world"}</div><div><span style="white-space:pre"> </span>httpRouter.POST("/post/query", slf.HttpPost)</div><div></div><div><span style="white-space:pre"> </span>//GET鏂瑰紡鑾峰彇鐩綍涓嬬殑璧勬簮錛宧ttp://127.0.0.1:port/img/head/a.jpg</div><div><span style="white-space:pre"> </span>httpRouter.SetServeFile(sysservice.METHOD_GET,"/img/head/","d:/img")</div><div></div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div>func (slf *TestHttpService) HttpGet(session *sysservice.HttpSession){</div><div><span style="white-space:pre"> </span>//浠庡ご涓幏鍙杒ey涓簎id瀵瑰簲鐨勫?/div><div><span style="white-space:pre"> </span>uid := session.GetHeader("uid")</div><div><span style="white-space:pre"> </span>//浠巙rl鍙傛暟涓幏鍙杒ey涓簄ickname瀵瑰簲鐨勫?/div><div><span style="white-space:pre"> </span>nickname,_ := session.Query("nickname")</div><div><span style="white-space:pre"> </span>//鍚慴ody閮ㄥ垎鍐欏叆鏁版嵁</div><div><span style="white-space:pre"> </span>session.Write([]byte(fmt.Sprintf("head uid:%s, nickname:%s",uid,nickname)))</div><div><span style="white-space:pre"> </span>//鍐欏叆http鐘舵?/div><div><span style="white-space:pre"> </span>session.WriteStatusCode(http.StatusOK)</div><div><span style="white-space:pre"> </span>//瀹屾垚榪斿洖</div><div><span style="white-space:pre"> </span>session.Done()</div><div>}</div><div></div><div>type HttpRespone struct {</div><div><span style="white-space:pre"> </span>Msg string `json:"msg"`</div><div>}</div><div></div><div>func (slf *TestHttpService) HttpPost(session *sysservice.HttpSession){</div><div><span style="white-space:pre"> </span>//涔熷彲浠ラ噰鐢ㄧ洿鎺ヨ繑鍥炴暟鎹璞℃柟寮忥紝濡備笅錛?/div><div><span style="white-space:pre"> </span>session.WriteJsonDone(http.StatusOK,&HttpRespone{Msg: "hello world"})</div><div>}</div><div></div><div>```</div><div>娉ㄦ剰錛岃鍦╩ain.go涓姞鍏mport _ "orginserver/simple_service"錛屽茍涓斿湪config/cluster/subnet/cluster.json涓殑ServiceList鍔犲叆鏈嶅姟銆?/div><div></div><div></div><div></div><div>絎竷绔狅細TcpService鏈嶅姟浣跨敤</div><div>---------------</div><div>TcpService鏄痮rigin寮曟搸涓郴緇熷疄鐜扮殑Tcp鏈嶅姟錛屽彲浠ユ敮鎸佽嚜瀹氫箟娑堟伅鏍煎紡澶勭悊鍣ㄣ傚彧瑕侀噸鏂板疄鐜皀etwork.Processor鎺ュ彛銆傜洰鍓嶅唴緗凡緇忓疄鐜版渶甯哥敤鐨刾rotobuf澶勭悊鍣ㄣ?/div><div></div><div>simple_tcp/TestTcpService.go鏂囦歡濡備笅錛?/div><div>```</div><div>package simple_tcp</div><div></div><div>import (</div><div><span style="white-space:pre"> </span>"fmt"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/network/processor"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/node"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/service"</div><div><span style="white-space:pre"> </span>"github.com/duanhf2012/origin/sysservice"</div><div><span style="white-space:pre"> </span>"github.com/golang/protobuf/proto"</div><div><span style="white-space:pre"> </span>"orginserver/simple_tcp/msgpb"</div><div>)</div><div></div><div>func init(){</div><div><span style="white-space:pre"> </span>node.Setup(&sysservice.TcpService{})</div><div><span style="white-space:pre"> </span>node.Setup(&TestTcpService{})</div><div>}</div><div></div><div>//鏂板緩鑷畾涔夋湇鍔estService1</div><div>type TestTcpService struct {</div><div><span style="white-space:pre"> </span>service.Service</div><div><span style="white-space:pre"> </span>processor *processor.PBProcessor</div><div><span style="white-space:pre"> </span>tcpService *sysservice.TcpService</div><div>}</div><div></div><div>func (slf *TestTcpService) OnInit() error {</div><div><span style="white-space:pre"> </span>//鑾峰彇瀹夎濂戒簡鐨凾cpService瀵硅薄</div><div><span style="white-space:pre"> </span>slf.tcpService =  node.GetService("TcpService").(*sysservice.TcpService)</div><div></div><div><span style="white-space:pre"> </span>//鏂板緩鍐呯疆鐨刾rotobuf澶勭悊鍣紝鎮(zhèn)ㄤ篃鍙互鑷畾涔夎礬鐢卞櫒錛屾瘮濡俲son錛屽悗緇細琛ュ厖</div><div><span style="white-space:pre"> </span>slf.processor = processor.NewPBProcessor()</div><div></div><div><span style="white-space:pre"> </span>//娉ㄥ唽鐩戝惉瀹㈡埛榪炴帴鏂紑浜嬩歡</div><div><span style="white-space:pre"> </span>slf.processor.RegisterDisConnected(slf.OnDisconnected)</div><div><span style="white-space:pre"> </span>//娉ㄥ唽鐩戝惉瀹㈡埛榪炴帴浜嬩歡</div><div><span style="white-space:pre"> </span>slf.processor.RegisterConnected(slf.OnConnected)</div><div><span style="white-space:pre"> </span>//娉ㄥ唽鐩戝惉娑堟伅綾誨瀷MsgType_MsgReq錛屽茍娉ㄥ唽鍥炶皟</div><div><span style="white-space:pre"> </span>slf.processor.Register(uint16(msgpb.MsgType_MsgReq),&msgpb.Req{},slf.OnRequest)</div><div><span style="white-space:pre"> </span>//灝唒rotobuf娑堟伅澶勭悊鍣ㄨ緗埌TcpService鏈嶅姟涓?/div><div><span style="white-space:pre"> </span>slf.tcpService.SetProcessor(slf.processor,slf.GetEventHandler())</div><div></div><div><span style="white-space:pre"> </span>return nil</div><div>}</div><div></div><div></div><div>func (slf *TestTcpService) OnConnected(clientid uint64){</div><div><span style="white-space:pre"> </span>fmt.Printf("client id %d connected\n",clientid)</div><div>}</div><div></div><div></div><div>func (slf *TestTcpService) OnDisconnected(clientid uint64){</div><div><span style="white-space:pre"> </span>fmt.Printf("client id %d disconnected\n",clientid)</div><div>}</div><div></div><div>func (slf *TestTcpService) OnRequest (clientid uint64,msg proto.Message){</div><div><span style="white-space:pre"> </span>//瑙f瀽瀹㈡埛绔彂榪囨潵鐨勬暟鎹?/div><div><span style="white-space:pre"> </span>pReq := msg.(*msgpb.Req)</div><div><span style="white-space:pre"> </span>//鍙戦佹暟鎹粰瀹㈡埛绔?/div><div><span style="white-space:pre"> </span>err := slf.tcpService.SendMsg(clientid,&msgpb.Req{</div><div><span style="white-space:pre"> </span>Msg: proto.String(pReq.GetMsg()),</div><div><span style="white-space:pre"> </span>})</div><div><span style="white-space:pre"> </span>if err != nil {</div><div><span style="white-space:pre"> </span>fmt.Printf("send msg is fail %+v!",err)</div><div><span style="white-space:pre"> </span>}</div><div>}</div><div>```</div><div></div><div></div><div>絎叓绔狅細鍏朵粬緋葷粺妯″潡浠嬬粛</div><div>---------------</div><div>* sysservice/wsservice.go:鏀寔浜哤ebSocket鍗忚錛屼嬌鐢ㄦ柟娉曚笌TcpService綾諱技</div><div>* sysmodule/DBModule.go:瀵筸ysql鏁版嵁搴撴搷浣?/div><div>* sysmodule/RedisModule.go:瀵筊edis鏁版嵁榪涜鎿嶄綔</div><div>* sysmodule/HttpClientPoolModule.go:Http瀹㈡埛绔姹傚皝瑁?/div><div>* log/log.go:鏃ュ織鐨勫皝瑁咃紝鍙互浣跨敤瀹冩瀯寤哄璞¤褰曚笟鍔℃枃浠舵棩蹇?/div><div>* util:鍦ㄨ鐩綍涓嬶紝鏈夊父鐢ㄧ殑uuid,hash,md5,鍗忕▼灝佽絳夊伐鍏峰簱</div><div>* https://github.com/duanhf2012/originservice: 鍏朵粬鎵╁睍鏀寔鐨勬湇鍔″彲浠ュ湪璇ュ伐紼嬩笂鐪嬪埌錛岀洰鍓嶆敮鎸乫irebase鎺ㄩ佺殑灝佽銆?/div><div></div><div></div><div>**嬈㈣繋鍔犲叆origin鏈嶅姟鍣ㄥ紑鍙慟Q浜ゆ祦緹?168306674錛屾湁浠諱綍鐤戦棶鎴戦兘浼氬強鏃惰В絳?*</div><div></div><div>鎻愪氦bug鍙婄壒鎬? https://github.com/duanhf2012/origin/issues</div><div></div><div></div><div></div><img src ="http://www.shnenglu.com/API/aggbug/217287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/API/" target="_blank">C++鎶鏈腑蹇?/a> 2020-05-07 16:06 <a href="http://www.shnenglu.com/API/archive/2020/05/07/217287.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>golang娓告垙鏈嶅姟鍣ㄥ紩鎿?/title><link>http://www.shnenglu.com/API/archive/2020/05/07/217286.html</link><dc:creator>C++鎶鏈腑蹇?/dc:creator><author>C++鎶鏈腑蹇?/author><pubDate>Thu, 07 May 2020 08:04:00 GMT</pubDate><guid>http://www.shnenglu.com/API/archive/2020/05/07/217286.html</guid><wfw:comment>http://www.shnenglu.com/API/comments/217286.html</wfw:comment><comments>http://www.shnenglu.com/API/archive/2020/05/07/217286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/API/comments/commentRss/217286.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/API/services/trackbacks/217286.html</trackback:ping><description><![CDATA[<span data-offset-key="51d80-0-0" style="color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: 15px; white-space: pre-wrap; background-color: #ffffff;"><span data-text="true">鐜板湪go璇█姣旇緝嫻佽鐨勬湁leaf,gowold,origin銆傚墠涓や釜姣旇緝鍩虹錛屽疄鐜伴泦緹よ繕闇瑕佽繘琛屼簩嬈$殑緙栫爜璁捐銆俹rigin涓嶄竴鏍鳳紝鍙渶瑕侀氳繃閰嶇疆鏂逛究蹇熺殑闆嗙兢銆?/span></span>origin鎬諱綋璁捐濡俫o璇█璁捐涓鏍鳳紝鎬繪槸灝藉彲鑳界殑鎻愪緵綆媧佸拰鏄撶敤鐨勬ā寮忥紝蹇熷紑鍙戙?鑳藉鏍規(guī)嵁涓氬姟闇姹傚揩閫熷茍鐏墊椿鐨勫埗瀹氭湇鍔″櫒鏋舵瀯銆?鍒╃敤澶氭牳浼樺娍錛屽皢涓嶅悓鐨剆ervice閰嶇疆鍒頒笉鍚岀殑node錛屽茍鑳介珮鏁堢殑鍗忓悓宸ヤ綔銆?灝嗘暣涓紩鎿庢娊璞′笁澶у璞★紝node,service,module銆傞氳繃緇熶竴鐨勭粍鍚堟ā鍨嬬鐞嗘父鎴忎腑鍚勫姛鑳芥ā鍧楃殑鍏崇郴銆?nbsp;<br /><br /><br /><div>origin寮曟搸涓夊ぇ瀵硅薄鍏崇郴</div><div>---------------</div><div>* Node:   鍙互璁や負姣忎竴涓狽ode浠h〃鐫涓涓猳rigin榪涚▼</div><div>* Service:涓涓嫭绔嬬殑鏈嶅姟鍙互璁や負鏄竴涓ぇ鐨勫姛鑳芥ā鍧楋紝浠栨槸Node鐨勫瓙闆嗭紝鍒涘緩瀹屾垚騫跺畨瑁匩ode瀵硅薄涓傛湇鍔″彲浠ユ敮鎸佸澶栭儴RPC絳夊姛鑳姐?/div><div>* Module: 榪欐槸origin鏈灝忓璞″崟鍏冿紝寮虹儓寤鴻鎵鏈夌殑涓氬姟妯″潡閮藉垝鍒嗘垚鍚勪釜灝忕殑Module緇勫悎錛宱rigin寮曟搸灝嗙洃鎺ф墍鏈夋湇鍔′笌Module榪愯鐘舵侊紝渚嬪鍙互鐩戞帶瀹冧滑鐨勬參澶勭悊鍜屾寰幆鍑芥暟銆侻odule鍙互寤虹珛鏍戠姸鍏崇郴銆係ervice鏈韓涔熸槸Module鐨勭被鍨嬨?br /><br />鏇村姞璇︾粏鐨勫弬鐓ч」鐩湴鍧錛?a >https://github.com/duanhf2012/origin</a></div><img src ="http://www.shnenglu.com/API/aggbug/217286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/API/" target="_blank">C++鎶鏈腑蹇?/a> 2020-05-07 16:04 <a href="http://www.shnenglu.com/API/archive/2020/05/07/217286.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>SVN鍒嗘敮/鍚堝茍鍘熺悊鍙婃渶浣沖疄璺?杞?http://www.shnenglu.com/API/archive/2017/04/12/214834.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Wed, 12 Apr 2017 07:15:00 GMThttp://www.shnenglu.com/API/archive/2017/04/12/214834.htmlhttp://www.shnenglu.com/API/comments/214834.htmlhttp://www.shnenglu.com/API/archive/2017/04/12/214834.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/214834.htmlhttp://www.shnenglu.com/API/services/trackbacks/214834.html浣跨敤svn鍑犲勾浜嗭紝涓鐩村鍒嗘敮鍜屽悎騫舵暚鑰岃繙涔嬶紝涓鏉ユ槸鍥犱負鍒嗘敮鐨勭鐞嗕笉璇ユ垜鎿嶅績錛屼簩鏉ュ嵆浣挎秹鍙婂埌鍒嗘敮鐨勭鐞嗭紝涔熶笉鏁㈣錘鐒朵嬌鐢ㄥ悎騫跺姛鑳斤紝鐢熸曞悎騫跺嚭浜嗛棶棰樺鍥㈤槦閫犳垚涓嶈壇褰卞搷錛屾渶涓昏鐨勫師鍥犳槸錛岃嚜宸卞鍒嗘敮鐨勭洰鐨勫拰鍚堝茍鐨勬柟娉曚笉鐢氫簡瑙o紝榪欐墠鏄‖浼ゃ?/p>


鏈榪戠敱浜庨傞厤鏈哄瀷鐨勯渶瑕侊紙鏈漢浠庝簨鎵嬫満瀹㈡埛绔殑寮鍙戯級錛岄渶瑕佺粡甯告帴瑙﹀垎鏀拰鍚堝茍涓ら」宸ヤ綔錛岀獊鐒跺彂鐜拌繖鐜╂剰鏁翠笉鏄庣櫧寰堥毦寮灞曞伐浣滐紝閬傝繖涓ゅぉ鐫閲嶇爺絀朵簡涓涓嬶紝鏈夌偣鏀惰幏錛屾曚互鍚庡繕浜嗭紝鏁呰秮鐫浣欐俯灝氬湪璧剁揣鍐欎笅鏉ワ紝濂借鎬т笉濡傜儌絎斿ご鍢涖備笅鏂囩殑瀹炶返涓昏鏄弬鑰冧簡TortoiseSVN鐨勫府鍔╂枃妗e拰Subversion鐨勫湪綰挎枃妗o紝Subversion鐨勫湪綰挎枃妗o細http://svnbook.red-bean.com/en/1.5/svn-book.html


璇濊鎴戝叕鍙哥幇鍦ㄧ殑婧愪唬鐮佺鐞嗘尯涔辯殑錛宻vn鐩綍騫舵病鏈夐噰鍙栨爣鍑嗙殑source/branches銆乻ource/trunk緇撴瀯錛屼富綰垮拰鍒嗘敮鏀懼緱鍒板閮芥槸錛宺elease鐗堟湰涔熷茍娌℃湁褰撴垚tag澶勭悊錛岃屾槸褰撴垚branch鏉ョ鐞嗭紝緇忓父榪樿鍦╮elease鐗堟湰涓婃敼鏉ユ敼鍘匯傘傘?/p>


鍏堣璇翠粈涔堟槸branch銆傛寜鐓ubversion鐨勮娉曪紝涓涓猙ranch鏄煇涓猟evelopment line錛堥氬父鏄富綰夸篃鍗硉runk錛夌殑涓涓嫹璐濓紝瑙佷笅鍥撅細

branch瀛樺湪鐨勬剰涔夊湪浜庯紝鍦ㄤ笉騫叉壈trunk鐨勬儏鍐典笅錛屽拰trunk騫惰寮鍙戯紝寰呭紑鍙戠粨鏉熷悗鍚堝茍鍥瀟runk涓紝鍦╞ranch鍜宼runk鍚勮嚜寮鍙戠殑榪囩▼涓紝浠栦滑閮藉彲浠ヤ笉鏂湴鎻愪氦鑷繁鐨勪慨鏀癸紝浠庤屼嬌寰楁瘡嬈′慨鏀瑰湪repository涓兘鏈夎褰曘?/p>



璁炬兂浠ヤ笅鍦烘櫙錛屽鏋滀綘鐨勯」鐩渶瑕佸紑鍙戜竴涓柊鍔熻兘錛岃岃鍔熻兘鍙兘浼氫慨鏀歸」鐩腑鐨勭粷澶у鏁版枃浠訛紝鑰屼笌姝ゅ悓鏃訛紝浣犵殑鍙︿竴浣嶅悓浜嬫鍦ㄨ繘琛宐ug fix錛屽鏋滀綘鐨勬柊鍔熻兘涓嶅湪branch涓紑鍙戣岀洿鎺ュ湪trunk涓紑鍙戯紝閭d箞浣犳瀬鏈夊彲鑳藉獎鍝嶅彟涓浣嶅悓浜嬬殑bug fix錛屼粬/濂瑰湪bug淇涓彲鑳戒細閬囧埌鍚勭鍚勬牱鐨勯棶棰橈紝鍥犱負浣犵殑棰戠箒鎻愪氦浠g爜寮曞叆浜嗚繃澶氱殑涓嶇ǔ瀹氬洜绱犮備綘鍙兘浼氳錛岄偅鎴戝湪寮鍙戠殑榪囩▼涓笉鎻愪氦涓嶅氨琛屼簡錛岀瓑鍒版垜鍏ㄩ儴寮鍙戠粨鏉熸垜鍐嶆彁浜わ紝鏄紝浣犲彲浠ヨ繖涔堝仛錛岄偅榪樿鐗堟湰鎺у埗騫蹭粈涔堝憿錛熶篃璁哥瓑鍒頒綘鏈鍚庢彁浜や唬鐮佺殑鏃跺欙紙涔熻涓鍛紝涔熻涓ゅ懆錛燂級錛屼綘浼氬彂鐜版湁涓澶у爢conflict絳夌潃浣爎esolve銆傘傘?/p>


閭d箞錛屾紜殑鍋氭硶鏄粈涔堬紵浣跨敤branch錛屼粠trunk鍒涘緩branch錛岀劧鍚庡湪浣犵殑branch涓婂紑鍙戯紝寮鍙戝畬鎴愬悗鍐嶅悎騫跺埌trunk涓?br />


鍏充簬branch鍏堣鍒拌繖閲岋紝涓嬮潰璇磋浠涔堝彨鍋氬悎騫躲傚緢濂界悊瑙o紝褰揵ranch寮鍙戝畬鎴愬悗錛堝寘鎷繀瑕佺殑嫻嬭瘯錛夛紝灝哹ranch涓殑淇敼鍚屾鍒皌runk涓紝榪欎釜榪囩▼鏈夊彲鑳藉寘鎷慨鏀規(guī)枃浠躲佸鍔犳枃浠躲佸垹闄ゆ枃浠剁瓑絳夈?/p>


璇村埌榪欓噷錛岃矊浼兼湰鏂囧樊涓嶅鍙互緇撴潫浜嗭紝涓嶅氨鏄垎鏀拰鍚堝茍涔堬紵鍙鍐嶇畝鍗曞湴璇磋濡備綍寤虹珛鍒嗘敮鍜屽浣曞悎騫跺氨鍙互鏀跺熬浜嗭紝鍙兘鍙渶涓や釜鍛戒護錛屼篃鍙兘鍙渶榧犳爣鐐瑰嚑涓嬬劧鍚庨敭鐩樻暡涓や笅鍗沖彲銆傚叾瀹炰簨鎯呰繙闈炶繖涔堢畝鍗曪紝鐖卞姩鑴戠瓔鐨勫悓瀛﹀彲鑳戒細闂簡錛屽皢branch鐨勬敼鍔╩erge鍒皌runk鐨勬椂鍊欙紝鍜屼笂鏂囪鐨勭洿鎺ュ湪trunk涓叏閮ㄥ紑鍙戝畬鐒跺悗鎻愪氦鏈変綍鍖哄埆錛熶綘鏈鍚庤繕涓嶆槸瑕佸鐞嗕竴澶у爢conflict錛?/p>


榪欎釜闂闂緱闈炲父濂斤紝鍏跺疄榪欐鏄湰鏂囩殑閲嶇偣錛歜ranch鍜宼runk鍦ㄥ茍琛屽紑鍙戠殑榪囩▼涓浣曟劅鐭ュ鏂癸紝branch濡備綍鎵嶈兘鍦ㄥ紑鍙戣繃紼嬩腑涓嶄細鍜宼runk瓚婅蛋瓚婅繙錛屽鑷存渶鍚庢棤娉曞悎騫訛紵璇曟兂涓涓嬶紝濡傛灉鍦ㄤ綘寮鍙慴ranch鐨勮繃紼嬩腑錛宼runk涓殑鏌愪釜綾繪枃浠跺凡緇忚鍒犻櫎浜嗭紙榪欏彲鑳芥槸鍙﹀涓涓浼欏湪鍙︿竴涓猙ranch涓婂紑鍙戜簡涓ゅ懆鍚庢墠鍚堝茍鍒皌runk鐨勶級錛岃屼綘绔熺劧鍦ㄨ繖涓被鏂囦歡涓婂仛浜嗗ぇ閲忎慨鏀癸紝璇曢棶浣犲埌鏈鍚庡悎騫跺洖trunk鐨勬椂鍊欒鏈夊铔嬬柤錛熻В鍐寵繖涓闂鐨勫敮涓鎵嬫鏄紝branch瑕佷笉鍋滃湴鍜宼runk淇濇寔鍚屾錛屼綘瑕佸強鏃跺湴鐭ラ亾trunk閮藉仛浜嗕粈涔堜慨鏀癸紝榪欎簺淇敼鏄惁浼氬獎鍝嶄綘姝e湪寮鍙戠殑鏂板姛鑳斤紝濡傛灉闇瑕侊紝浣犲繀欏誨強鏃惰皟鏁碽ranch鐨勪唬鐮侊紝浣夸箣鑳戒笌trunk“鍏煎”銆?/p>


閭d箞濡備綍璁゜ranch鍜宼runk淇濇寔鍚屾錛熷悎騫訛紝浠巘runk鍚堝茍鍒癰ranch錛屼綘娌″惉閿欙紝鏄粠trunk鍚堝茍鍒癰ranch銆傚叧浜嶵ortoiseSVN鐨勫悎騫訛紝鏈夊嚑鐐歸渶瑕佹敞鎰忥細

  • TortoiseSVN鐨勫悎騫跺彂鐢熷湪鏈湴錛屼篃鍗充綘鐨剋orking copy涓紝浣犳棤闇榪囧鎷呭績浼氬repository涓殑浠g爜閫犳垚褰卞搷
  • 涓嶇鏄粠trunk鍚堝茍鍒癰ranch榪樻槸鏈緇堜粠branch鍚堝茍鍥瀟runk錛屽湪姣忔鍚堝茍鍓嶆渶濂藉厛update錛岀劧鍚庡皢鏈湴鐨勪慨鏀瑰厛鍏ㄩ儴commit錛屼繚鎶ゅソ鐜板満錛屼竾涓鍚堝茍涓嶇悊鎯抽殢鏃墮兘鍙互revert
  • 鍚堝茍瀹屾垚鍚庣湅鏄惁鑳芥紜紪璇戯紝鐒跺悗嫻嬭瘯楠岃瘉錛屾渶鍚庡皢鍚堝茍鍚庣殑鏀瑰姩鎻愪氦鍒皉epository



涓嬮潰鎴戝皢step by step鍦版紨紺哄浣曚竴嬈″畬鏁寸殑branching鍜宮erging錛屽寘鎷垱寤哄垎鏀佸垎鏀紑鍙戙佸垎鏀拰涓葷嚎鍚屾錛屽垎鏀悎騫跺埌涓葷嚎鐨勫叏榪囩▼錛岀敋鑷沖寘鎷浣曞湪鏈湴鍒涘緩涓涓祴璇曠敤鐨剅epository銆?/p>


棣栧厛闇瑕佸畨瑁匱ortoiseSVN錛屾垜瀹夎鐨勭増鏈槸錛歍ortoiseSVN 1.6.15, Build 21041 - 32 Bit , 2011/03/23 18:00:27


1銆佹湰鍦癛epository鐨勫垱寤?/strong>

repository鐨勫垱寤哄緢綆鍗曪紝鍋囪鎴戣鍦―:\TortoiseSVN\TestRepository鐩綍涓垱寤簉epository錛屽彧闇鍙抽敭TestRepository鐩綍錛屼緷嬈¢夋嫨"TortoiseSVN" -> "Create repository here"渚垮畬鎴愪簡repository鐨勫垱寤恒?/p>


2銆丆heck out

鍋囪瑕乧heck out鍒癉:\TortoiseSVN\TestSVN錛屽悓鏍峰緢綆鍗曪紝鍦―:\TortoiseSVN鐩綍涓嬪垱寤篢estSVN鐩綍錛岀劧鍚庡湪璇ョ洰褰曚笂鍙抽敭錛岄夋嫨"SVN Check out..."錛屽湪寮瑰嚭鐨勭獥鍙d腑鐨?URL of repository"涓~鍏?file:///D:/TortoiseSVN/TestRepository"錛屽叾浠栭粯璁ゅ嵆鍙紝鏈鍚庣偣鍑籵k銆?br />


3銆乼runk鍒涘緩鏂伴」鐩甅yProject

鐩稿綋綆鍗曞氨涓嶈禈榪頒簡錛屽彧鍒楀嚭鏈鎿嶄綔鎵浣滃嚭鐨勪慨鏀癸細



4銆佸垱寤篵ranch

鍦?trunk/MyProject鐩綍涓婂彸閿紝渚濇閫夋嫨"TortoiseSVN" -> "Branch/tag..."錛屽湪寮瑰嚭紿楀彛鐨?To URL"涓~鍏ュ垎鏀殑鍦板潃錛屽湪榪欓噷鐩爣revision閫夋嫨HEAD revision錛屽涓嬪浘鎵紺猴紝娣誨姞log鍚庣偣鍑籵k鍒嗘敮渚垮緩绔嬩簡銆傝繖涓搷浣滈熷害闈炲父蹇紝鏂板緩鐨刡ranch鍦╮epository涓叾瀹炲彧鏄竴涓寚鍚憈runk鏌愪釜revision鐨勮蔣榪炴帴鑰屽凡錛屽茍娌℃湁鐪熺殑澶嶅埗鏂囦歡銆?/p>


5銆丆heck out鍒嗘敮

鍙抽敭TestSVN鐩綍閫夋嫨"TortoiseSVN Update"鍗沖彲灝嗗垰鍒氬緩绔嬬殑鍒嗘敮涓嬭澆鍥炴湰鍦般傝繘鍏?branches/MyProject鐩綍涓嬩綘浼氬彂鐜板叾鏂囦歡緇撴瀯鍜?trunk/MyProject涓妯′竴鏍楓?br />


6銆乥ranch鎻愪氦涓涓柊鏂囦歡


7銆乼runk绱ф帴鐫鎻愪氦涓涓慨鏀?br />

8銆乥ranch鍐嶆鎻愪氦涓涓慨鏀?br />

9銆佸皢trunk涓殑淇敼鍚屾鍒癰ranch


6-8婕旂ず鐨勬槸branch鍜宼runk鍦ㄧ嫭绔嬨佸茍琛屽湴寮鍙戙備負浜嗛槻姝㈠湪“閿欒”鐨勯亾璺笂瓚婅蛋瓚婅繙錛岀幇鍦╞ranch鎰忚瘑鍒版槸鏃跺欏拰trunk鏉ヤ竴嬈″悓姝ヤ簡錛堝皢trunk鍚堝茍鍒癰ranch錛夈?/p>

棣栧厛錛屽湪鏈湴trunk涓厛update涓涓嬶紝鏈夊啿紿佺殑瑙e喅鍐茬獊錛屼繚璇乼runk鍜宺epository宸茬粡瀹屽叏鍚屾錛岀劧鍚庡湪/branches/MyProject涓婂彸閿紝渚濇閫夋嫨"TortoiseSVN" -> “Merge...”錛屽湪寮瑰嚭鐨勭獥鍙d腑閫夋嫨絎竴欏?Merge a range of revision"錛岃繖涓被鍨嬬殑Merge宸茬粡浠嬬粛寰楀緢娓呮錛岄傜敤浜庡皢鏌愪釜鍒嗘敮鎴栦富綰夸笂鎻愪氦鐨勫涓猺evision闂寸殑鍙樺寲鍚堝茍鍒板彟澶栦竴涓垎鏀笂銆?br />


鐐瑰嚮next鍚庯紝鍑虹幇濡備笅紿楀彛錛?br />
鐢變簬鏄浠巘runk鍚堝茍鍒癰ranch錛岀悊鎵褰撶劧榪欓噷鐨?URL to merge from"搴旇濉玹runk鐨勮礬寰勶紝"Revision range to merge"寰堝ソ鐞嗚В錛屽氨鏄綘瑕佸皢trunk鐨勫摢浜況evision鎵瀵瑰簲鐨勫彉鍖栧悎騫跺埌branch涓紝鍙互鏄煇涓榪炰覆鐨剅evision錛屾瘮濡?-7錛?5-HEAD錛屼篃鍙互鏄煇涓崟鐙殑revision鍙楓傜敱浜庡湪r4涓紝trunk淇敼浜哖erson.Java涓殑talk()鏂規(guī)硶錛屾墍浠ヨ繖閲岀殑revision鍙渶濉?鍗沖彲銆傜偣鍑籲ext鍚庡嚭鐜頒笅鍥撅細

鍦ㄨ繖閲屽彧闇淇濈暀榛樿璁劇疆鍗沖彲銆傚湪鐐瑰嚮Merge鎸夐挳鍓嶄綘鍙互鍏圱est merge涓鎶婏紝鐪嬫垚鍔熶笌鍚︼紝浠ュ強merge鐨勮緇嗕俊鎭傜偣鍑籑erge鎸夐挳鍚巘runk鎵鍋氱殑淇敼灝嗗悓姝ュ埌branch涓?/p>



10銆佹彁浜ゅ悎騫跺悗鐨刡ranch


鑷蟲錛宐ranch宸茬粡瀹屽叏鍜宼runk鍚屾錛宐ranch鍜宼runk鐨勪唬鐮佺浉澶勫緢铻嶆唇錛屾病鏈変換浣曞啿紿侊紝濡傛灉branch宸茬粡寮鍙戠粨鏉燂紝閭f槸鏃跺欏皢branch鍚堝茍鍥瀟runk浜嗭紝褰撶劧錛屽鏋渂ranch榪樿緇х畫寮鍙戯紝閭d綘灝嗕笉鏂湴閲嶅6-10榪欏嚑涓楠ゃ?/p>


11銆佸皢branch鍚堝茍鍥瀟runk

鍦?trunk/MyProject涓婂彸閿紙娉ㄦ剰鏄湪涓葷嚎鐨勭洰褰曚笂鍙抽敭錛夛紝渚濇閫夋嫨"TortoiseSVN" -> "Merge..."錛屽湪寮瑰嚭鐨勭獥鍙d腑錛孧erge type閫夋嫨絎簩欏?Reintegrate a branch"錛岃繖縐嶇被鍨嬬殑鍚堝茍閫傚悎鍦ㄥ垎鏀紑鍙戠粨鏉熷悗灝嗘墍鏈夌殑鏀瑰姩鍚堝茍鍥炰富綰褲?/p>



鐐瑰嚮next鍚庡嚭鐜板涓嬬獥鍙o細

鍦ㄨ繖閲岋紝"From URL"閫夋嫨/branches/MyProject錛屾棤闇閫夋嫨revision鍙鳳紝Reintegrate浼氬皢branch涓婃墍鏈変慨鏀瑰悎騫跺埌trunk銆傚悗闈㈢殑姝ラ鍜屼笂鏂囩9姝ヤ腑鐨勪竴鏍鳳紝涓嶅啀鍟板棪浜嗐傚鏃犳剰澶栵紝branch灝嗘垚鍔熷悎騫跺埌trunk錛屼綘闇瑕佸仛鐨勫彧鏄皢鍚堝茍鍚庣殑trunk璧剁揣commit錛?/p>


12銆佹彁浜ゅ悎騫跺悗鐨則runk

so easy...


13銆佸垹闄ranch

濡傛灉浣犺涓轟綘鏂板姞鐨勫姛鑳藉凡緇忓紑鍙戝畬鎴愪簡錛屼綘鍙互鍒犻櫎浣犵殑鍒嗘敮



鍒拌繖閲岋紝鎴戝凡緇忕粰浣犳紨紺哄畬浜嗘暣涓繃紼嬶紝鎴戜竴韜殑姹椾篃涓嬫潵浜嗭紝鎴戞兂緗㈠伐浜嗭紝涓嶈繃鏈鍚庢垜浠繕鏄湅鐪嬫墍鏈夌殑log淇℃伅鍚э紝閫氳繃log鑳藉彂鐜版垜浠共鐨勬墍鏈変簨鎯咃細

r1-r7姝f槸鎴戜笂鏂囧湪騫茬殑浜嬫儏錛屼粠Message涓綘鑳藉彂鐜版垜瀵箃runk鍜宐ranch閮藉共浜嗕粈涔堬紝鍙﹀錛屽湪Log Messages紿楀彛鐨勫乏涓嬭鍕鵑変簡"Include merged revisions"浣犺繕鑳界湅鍒伴澶栫殑Merge information錛?br />

鍥句腑鐏拌壊鐨勬槸鍜宮erge鐩稿叧鐨刲og錛屽叡鍙戠敓浜嗕袱嬈erge錛岀涓嬈℃槸鍦╮6錛屽湪r6涓紝branch鍚堝茍浜唗runk鍦╮4鏃舵彁浜ょ殑鍙樺寲錛涚浜屾鏄湪r7錛屽湪r7涓紝trunk鍚堝茍浜哹ranch浠巖2鍒皉6鐨勬墍鏈夊彉鍖栥?br />




緇堜簬鍙互鍐欏啓鎬葷粨浜嗭細

  • branch涓昏鐢ㄤ簬鏂板姛鑳界殑寮鍙?/li>
  • 鍚堝茍鍙戠敓鍦ㄦ湰鍦皐orking copy錛屽彧瑕佷綘涓嶆彁浜ゅ氨涓嶄細褰卞搷鍒皉epository
  • 鍚堝茍鍓嶄竴瀹氳鍏坲pdate銆乧ommit錛屼繚璇佷笉浼歰ut of day錛屽茍灝嗘湰鍦扮殑淇敼淇濆瓨鍒皉epository
  • branch鍜宼runk騫惰寮鍙戠殑榪囩▼涓紝瑕佺粡甯稿悓姝ワ紝灝唗runk鐨勪慨鏀瑰悎騫跺埌branch錛屽悎騫舵椂閫夋嫨"Merge a range of revision"
  • branch鏈鍚庡悎騫跺洖trunk鏃訛紝merge type閫夋嫨"Reintegrate a branch"


]]>
protobuf repeated綾誨瀷鐨勪嬌鐢?/title><link>http://www.shnenglu.com/API/archive/2014/12/09/209070.html</link><dc:creator>C++鎶鏈腑蹇?/dc:creator><author>C++鎶鏈腑蹇?/author><pubDate>Tue, 09 Dec 2014 11:14:00 GMT</pubDate><guid>http://www.shnenglu.com/API/archive/2014/12/09/209070.html</guid><wfw:comment>http://www.shnenglu.com/API/comments/209070.html</wfw:comment><comments>http://www.shnenglu.com/API/archive/2014/12/09/209070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/API/comments/commentRss/209070.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/API/services/trackbacks/209070.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">protobuf鏄疓oogle寮鍙戠殑涓涓簭鍒楀寲妗嗘灦錛岀被浼糥ML錛孞SON錛屽熀浜庝簩榪涘埗錛屾瘮浼犵粺鐨刋ML琛ㄧず鍚屾牱涓孌靛唴瀹硅鐭皬寰楀銆傞氳繃protobuf錛屽彲浠ュ緢杞繪澗鐨勮皟鐢ㄧ浉鍏蟲柟娉曟潵瀹屾垚涓氬姟鏁版嵁鐨勫簭鍒楀寲涓庡弽搴忓垪鍖栥俻rotobuf repeated綾誨瀷鐩稿綋浜巗td鐨剉ector錛屽彲浠ョ敤鏉ュ瓨鏀綨涓浉鍚岀被鍨嬬殑鍐呭錛屾枃绔犲皢綆鍗曚粙緇峱rotobuf repeated鐨勪嬌鐢ㄣ?/p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">棣栧厛瀹氫箟涓涓猵rotobuf緇撴瀯錛屽涓嬶細<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->message Person {<br />  required int32 age = 1;<br />  required <span style="color: #0000FF; ">string</span> name = 2;<br />}<br /><br />message Family {<br />  repeated Person person = 1;<br />}</div><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br />涓嬮潰鎴戜滑浠ヤ緥瀛愮畝鍗曡鏄庡浣曚嬌鐢細<br /></p><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">int</span> main(<span style="color: #0000FF; ">int</span> argc, <span style="color: #0000FF; ">char</span>* argv[])<br />{<br /><br />    GOOGLE_PROTOBUF_VERIFY_VERSION;<br /><br />    Family family;<br />    Person* person;<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 娣誨姞涓涓搴垚鍛橈紝John</span><span style="color: #008000; "><br /></span>    person = family.add_person();<br />    person->set_age(25);<br />    person->set_name("John");<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 娣誨姞涓涓搴垚鍛橈紝Lucy</span><span style="color: #008000; "><br /></span>    person = family.add_person();<br />    person->set_age(23);<br />    person->set_name("Lucy");<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 娣誨姞涓涓搴垚鍛橈紝Tony</span><span style="color: #008000; "><br /></span>    person = family.add_person();<br />    person->set_age(2);<br />    person->set_name("Tony");<br /><br />    <span style="color: #008000; ">//</span><span style="color: #008000; "> 鏄劇ず鎵鏈夊搴垚鍛?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">int</span> size = family.person_size();<br /><br />    cout << "榪欎釜瀹跺涵鏈?nbsp;" << size << " 涓垚鍛橈紝濡備笅錛? << endl;<br /><br />    <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0; i<size; i++)<br />    {<br />        Person psn = family.person(i);<br />        cout << i+1 << ". " << psn.name() << ", 騫撮緞 " << psn.age() << endl;<br />    }<br /><br />    getchar();<br />    <span style="color: #0000FF; ">return</span> 0;<br />}</div><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><br /></p><img src ="http://www.shnenglu.com/API/aggbug/209070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/API/" target="_blank">C++鎶鏈腑蹇?/a> 2014-12-09 19:14 <a href="http://www.shnenglu.com/API/archive/2014/12/09/209070.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>cocos2dx鐜鎼緩http://www.shnenglu.com/API/archive/2014/07/01/207481.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Tue, 01 Jul 2014 09:34:00 GMThttp://www.shnenglu.com/API/archive/2014/07/01/207481.htmlhttp://www.shnenglu.com/API/comments/207481.htmlhttp://www.shnenglu.com/API/archive/2014/07/01/207481.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/207481.htmlhttp://www.shnenglu.com/API/services/trackbacks/207481.html涓錛?      鍓嶆湡鍑嗗
cocos2d-x2.2.1  
2013騫?1鏈?9鏃ユ洿鏂?/div>
涓嬭澆鍦板潃錛歨ttp://www.cocos2d-x.org/download
 
2.jdk
java鐜鏄繀欏葷殑錛岃繖涓湪瀹樼綉涓婁笅杞?/div>
涓嬭澆鍦板潃錛歨ttp://www.java.com/zh_CN/download/manual.jsp
3. Android寮鍙戠幆澧?/div>
榪欎釜鏄痑ndroid浜ゅ弶緙栬瘧蹇呴』鐨処DE鐜錛屽唴鍚獷clipse
涓嬭澆鍦板潃錛歨ttp://developer.android.com/sdk/index.html
 
4.Android NDK
android浜ゅ弶緙栬瘧鏃訛紝瀵笴/C++浠g爜鐨勮В閲婄紪璇戝伐鍏?/div>
涓嬭澆鍦板潃錛歨ttp://developer.android.com/tools/sdk/ndk/index.html
 
5.python
cocos2d-x2.0鐗堟湰浠ュ悗鐢╬ython鑴氭湰鏉ュ垱寤哄伐紼嬶紝鎵浠ラ渶瑕乸ython鐜
涓嬭澆鍦板潃錛歨ttp://www.python.org/download/
娉ㄦ剰錛氳涓嬭澆python2.7.6  64浣嶇増鏈紝涓嶈涓?.3鐨勭増鏈?/div>
 
 
6.cygwin
瀵筩ocos2d-x鏈湴C/C++浠g爜鐨勮В閲婄紪璇戝伐鍏?/div>
涓嬭澆鍦板潃錛歨ttp://cygwin.com/install.html
 
鑷蟲鎴戜滑鎵闇瑕佺殑杞歡閮藉凡緇忓噯澶囧畬姣曪紝鎺ヤ笅鏉ュ彲浠ュ紑濮嬫寮忔惌寤虹幆澧冧簡!
浜岋紟       鎼緩Android寮鍙戠幆澧?/div>
1.java鐜
android鐜鐨勬惌寤哄皯涓嶄簡java錛屽厛鎶婁笅杞藉ソ鐨凧DK閫夋嫨榛樿璺緞瀹夎濂藉悗錛岀劧鍚庣敤wmic鍛戒護鍚戠郴緇熸坊鍔爅ava鐨勭幆澧冨彉閲忋?/div>
win+R榪愯cmd錛岃緭鍏ヤ互涓嬩笁涓懡浠わ細
wmic ENVIRONMENT create name="JAVA_HOME",username="<system>",VariableValue="C:\Program Files\Java\jre7"
浠ヤ笂涓轟竴琛?/div>
wmic ENVIRONMENT create name="CLASSPATH",username="<system>",VariableValue=";%JAVA_HOME%\lib\;"
浠ヤ笂涓轟竴琛?/div>
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="%path%;C:\Program Files\Java\jre7\bin"
浠ヤ笂涓轟竴琛?/div>
鐒跺悗榪涘叆緋葷粺鐜鍙橀噺璁劇疆鐣岄潰鏇存柊涓涓嬶紝閲嶅惎cmd錛岃瘯涓涓嬭緭鍏ava錛屽彧瑕佷笉鏄嚭鐜?#8220;java涓嶆槸鍐呴儴鍛戒護鎴栧閮ㄥ懡浠?#8221;涔嬬被鐨勶紝灝辮〃紺轟綘璁劇疆鎴愬姛浜嗐?/div>
2.Android鐜
鎵懼埌鎴戜滑涓嬭澆鐨刟dt-bundle-windows-x86_64-20131030.zip錛岃В鍘嬶紝璺緞鍙互鑷繁閰嶇疆錛岃繕鏄敞鎰忚嫳鏂囪礬寰勶紝涓嶅姞絀烘牸鍗沖彲銆?/div>
鎺ョ潃榪愯adt-bundle-windows-x86_64-20131030\eclipse涓嬬殑eclipse錛圓DT鑷甫Eclipse緙栬瘧鐜錛夛紝閫夋嫨宸ョ▼鏂囦歡澶癸紝榪欓噷鍙互闅忔剰閰嶇疆
 
鎺ョ潃鍏蟲帀璇存槑欏碉紝榪涘叆涓葷晫闈€傚湪涓葷晫闈㈢偣鍑婚厤緗甋DK
鐒跺悗鍙互鎸夌収闇姹傞夋嫨Android SDK鐨勭増鏈紝榪欓噷鎴戦夋嫨涓嬭澆Android錛圓PI 8錛夛紝鐒跺悗閫夋嫨瀹夎
 
 
 
鎱㈡參絳夊緟涓嬭澆瀹夎緇撴潫銆?/div>
鎺ヤ笅鏉ラ厤緗瓵ndroid VDM
 
鐒跺悗閫夋嫨DeviceDefinitions錛岄殢渚塊夋嫨涓涓垱寤猴紝濂藉儚鏄幇鍦ㄧ殑VDM涓嶆敮鎸丱penGL鐨勯珮鐗堟湰錛屾墍浠ユ垜浣夸細鐢˙lueStacks妯℃嫙鍣ㄦ潵璋冭瘯錛岃繖閲屽彧鏄敓鎴恆pk
 
涓夛紟       瀹夎cygwin錛岄厤緗瓵ndroid NDK
榪愯涓嬭澆濂界殑cygwin-setup-x86_64.exe錛岀湅鍒頒笅鍒楀畨瑁呯晫闈?/div>
 
鐐瑰嚮涓嬩竴姝?/div>
 
緇х畫
 
 榛樿璺緞瀹夎錛岀劧鍚庨夋嫨涓嬭澆淇濆瓨鐨勮礬寰勶紝榪欎釜澶у鍙互鑷繁閰嶇疆錛屽畨瑁呭畬姣曞悗鏈濂藉仛涓浠斤紝鍏嶅緱鍐嶆闇瑕佸畨瑁呮椂榪樿涓嬭澆
 
榛樿閫夋嫨錛屼笅涓姝?/div>
閫夋嫨絎竴涓綉绔?/div>
榪欓噷娉ㄦ剰浜嗭紝涓瀹氳灝嗙孩妗嗘爣鍑烘潵鐨勭偣鍑諱竴涓嬶紝鍙樻垚install
 
鐐瑰嚮涓嬩竴姝ワ紝婕暱鐨勭瓑寰呬笅杞絶~~~~~
緇堜簬瀹夎瀹屾瘯錛屾垜浠刀绱ф墦寮鏉ヨ瘯璇曞惂
絎竴嬈$偣寮cygwin鐩綍浼氬湪c:\cygwin64\home鏂囦歡涓嬬敓鎴愪互緋葷粺鐧誨綍璐︽埛涓哄悕瀛楃殑鏂囦歡澶?/div>
鐜板湪錛屽皢鎴戜滑涓嬭澆涓嬫潵鐨凙ndroid NDK涔熷氨鏄痑ndroid-ndk-r9b-windows-x86_64.zip瑙e帇緙╄嚦鑻辨枃璺緞涓嬶紝榪欎釜璺緞灝嗕細鍦ㄦ帴涓嬫潵鍐欏叆鍒癱ygwin鐨?bash_profile閰嶇疆鏂囦歡涓紝濂戒簡錛屾垜鐨勮В鍘嬭礬寰勪負錛欴:\ android-ndk-r9b
娉ㄦ剰錛氳璺緞涓嶈兘瀛樺湪絀烘牸錛屽叏鑻辨枃
澶у鍦╟:\cygwin\home鏂囦歡涓嬬敓鎴愮殑浠ョ郴緇熺櫥褰曡處鎴蜂負鍚嶅瓧鐨勬枃浠跺す涓嬫壘鍒?bash_profile鏂囦歡錛岀偣鍑誨彸閿紝鐢‥ditPlus杞歡鎵撳紑錛屽湪緇撳熬澶勮緭鍏ュ洖杞︼紝鎺ョ潃杈撳叆涓嬪垪璇彞錛?/div>
NDK_ROOT="/cygdrive/d/android-ndk-r9d"
export NDK_ROOT
 
NDK_MODULE_PATH="/cygdrive/d/cocos2d-x-2.2.1:/cygdrive/d/cocos2d-x-2.2.1/cocos2dx/platform/third_party/android/prebuilt"
export NDK_MODULE_PATH
 
鐒跺悗鐐瑰嚮淇濆瓨錛屽叧闂傝繖閲岀殑cygwin鏄寚鏈湴紓佺洏錛宒鏄痙鐩橈紝鍚庨潰鏄疦DK璺緞錛屽ぇ瀹舵寜鐓ц嚜宸辯殑鏂囦歡璺緞濉啓錛屾敞鎰弚indows璺緞涓?#8220;\”鍜宑ygwin涓?#8220;/”鐨勫尯鍒傞『渚挎彁涓鍙ワ紝鐩綍涓鐩磋鍐欏埌鏈塶dk-build.cmd鏂囦歡鐨勬枃浠跺す銆?/div>
鍥涳紟       瀹夎python錛屽垱寤鴻嚜宸辯殑cocos2d-x宸ョ▼
瀹夎鎴戜滑宸茬粡涓嬭澆濂界殑python-2.7.6.amd64錛岄夋嫨榛樿璺緞銆?/div>
 
瀹夎瀹屾瘯錛屾垜浠帴涓嬫潵浣跨敤python鍛戒護鍒涘緩鑷繁鐨刢ocos2d-x宸ョ▼銆?/div>
棣栧厛闇瑕佽緗畃ython鐨勭郴緇熺幆澧冿紝鐢變簬鍒氭墠鏄粯璁ゅ畨瑁咃紝鎵浠ython鐨勫畨瑁呰礬寰勪負C:\Python27\錛屽ぇ瀹跺彲浠ユ墜鍔ㄥ湪寮濮?>璁$畻鏈猴紙鍦ㄤ笂闈㈢偣鍙抽敭錛?>灞炴?>楂樼駭緋葷粺璁劇疆->鐜鍙橀噺涓緗畃ath璺緞錛屾坊鍔爌ython鐨勫畨瑁呯洰褰曘?/div>
濂戒簡錛岃刀绱ц瘯涓涓嬫垜浠殑閰嶇疆鏄惁姝g‘鍚с傚湪cmd杈撳叆鍛戒護錛?/div>
python -?
鐒跺悗balabala...鍑虹幇涓鍫嗭紝榪欏氨璇存槑鎴戜滑鐨刾ython閰嶇疆濂戒簡銆?/div>
鎺ヤ笅鏉ヤ嬌鐢╬ython鍒涘緩宸ョ▼銆傝繘鍏ocos2d-x-2.2.1鐩綍涓嬬殑tools->project-creator錛屽ぇ瀹跺彲浠ョ湅鍒版湁涓涓猚reate_project.py鑴氭湰錛屽鏋滄湁鍏磋叮鍙互鍙抽敭鍦↖DE涓墦寮鏉ョ湅鐪嬶紝浠庝腑鍙互鎴彇鍒拌鑴氭湰鐨勪嬌鐢ㄦ柟娉?/div>
 
濂戒簡錛屾垜浠刀蹇皢榪欎釜鑴氭湰浣跨敤璧鋒潵鍚?/div>
鍏堝湪cocos2d-x-2.2.1鐩綍涓嬪緩涓涓猵rojects鏂囦歡澶癸紝鍦╬roject-creator鐩綍涓嬫寜浣弒hift+榧犳爣鍙抽敭錛岄夋嫨鍦ㄦ澶勬墦寮鍛戒護紿楀彛錛岃緭鍏ュ懡浠わ細
python create_project.py -project HelloWorld -package org.HelloWorld.game -language cpp
鐒跺悗絳夊緟緇撴灉
 
澶у鍙互鐪嬪埌錛屾垜浠殑宸ョ▼鍒涘緩瀹屾瘯浜嗭紝鍏朵腑錛孒elloWorld鏄垜浠懡浠や腑杈撳叆鐨勫伐紼嬪悕錛屼篃灝辨槸鍦╟ocos2d-x-2.2.1->projects鏂囦歡澶逛笅鍒涘緩浜嗘垜浠殑宸ョ▼錛屽悕瀛楀氨鏄疕elloWorld錛屽湪HelloWorld鏂囦歡澶逛笅鐨刾roj.android鏂囦歡澶瑰氨鏄垜浠箣鍚庨渶瑕佺紪璇戠殑android欏圭洰錛屽垱寤哄懡浠ゅ悗闈㈢殑org.HelloWorld.game鏄畨鍗揂PK鐨勮瘑鍒悕錛屽ぇ瀹跺彲浠ユ寜鐓?#8220;xxx.xxx.xxx”鐨勬牸寮忚嚜宸卞懡鍚嶃?/div>
榪欓噷鎴戝啓浜嗕竴涓猙at鎵瑰鐞嗭紝澶у鍙互鏀懼湪project-creator鐩綍涓嬶紝浠ュ悗鍙互寰堟柟渚跨殑鍒涘緩宸ョ▼銆?/div>
鍦╬roject-creator鐩綍涓嬬偣鍙抽敭鍒涘緩涓涓枃鏈枃妗o紝鎵撳紑錛屽皢浠ヤ笅鍐呭澶嶅埗榪涘幓錛岀劧鍚庣偣淇濆瓨錛屾洿鏀規(guī)枃浠剁殑鍚庣紑鍚嶄負bat鍗沖彲
-----------------------------------------------------------------------------------------
@echo off
:label1
@cls
echo 嬈㈣繋浣跨敤Python鍒涘緩Cocos2d-x宸ョ▼
set /p project=璇瘋緭鍏ラ渶瑕佸垱寤虹殑宸ョ▼鍚?
set /p aID=璇瘋緭鍏ラ渶瑕佸垱寤虹殑android鐗堟湰鍖呮爣璇嗗悕:
echo 鎮(zhèn)ㄨ緭鍏ョ殑宸ョ▼鍚嶄負%project%
echo 鎮(zhèn)ㄨ緭鍏ョ殑android鐗堟湰鍖呮爣璇嗗悕涓?aID%
echo 紜鍒涘緩宸ョ▼鍚?
CHOICE /C 123 /M "紜璇鋒寜 1錛屽彇娑堣鎸?2錛屾垨鑰呴鍑鴻鎸?3銆?
echo %errorlevel%
if %errorlevel%==1 goto label2
if %errorlevel%==2 goto label1
if %errorlevel%==3 goto label3
:label2
echo 姝e湪鍒涘緩宸ョ▼...
python create_project.py -project %project% -package %aID% -language cpp
:label3
pause
-----------------------------------------------------------------------------------------
浜旓紟       鍦‥cliopse涓嬬紪璇慉ndroid欏圭洰
濂戒簡錛屼互涓婃垜浠墍鏈夌殑鐜閮藉凡鎼緩瀹屾垚錛屽湪灝嗘垜浠殑欏圭洰瀵煎叆eclipse涔嬪墠錛屾垜浠繕闇瑕佸皢cocos2d-x-2.2.1\cocos2dx\platform\android\java\src涓嬬殑org鏂囦歡澶規(guī)嫹璐濊嚦鎴戜滑鐨勯」鐩腑錛屼篃灝辨槸cocos2d-x-2.2.1\projects\HelloWorld\proj.android\src涓嬶紝鐢變簬鎴戜滑涔嬪墠鍒涘緩欏圭洰鏃跺畾鐨刟ndroid鍖呭悕鍓嶉潰涔熸槸org錛屾墍浠ヤ細鏈夎鐩栭夐」錛岃閫夋嫨鍚堝茍瑕嗙洊鍗沖彲
鎺ョ潃錛屽洖鍒癳clipse鐜錛屽鍏ラ」鐩?/div>
 
 
 
娉ㄦ剰鍦ㄩ夋嫨璺緞鏃跺啓鍒癏elloWorld鏂囦歡澶逛笅鍗沖彲
瀵煎叆宸ョ▼鍚庯紝鍦ㄥ伐紼婬elloWorld涓婄偣閫夊彸閿紝閫夋嫨Properties
 
 
閫夋嫨builders錛岀偣鍑籒ew
 
閫夋嫨program
 
鐒跺悗鍦ㄦ帴涓嬫潵鐨勭晫闈腑鐨?/div>
name鏍忚緭鍏ワ細Native_Builder
Location鏍忚緭鍏ワ細C:\cygwin\bin\bash.exe
Arguments鏍忚緭鍏ワ細--login -c "cd  D:/cocos2d-x-2.2.1/projects/HelloWorld/proj.android && /cygdrive/d/android-ndk-r9b/ndk-build"
 
浠ヤ笂涓轟竴琛?/div>
 
閫夋嫨OK錛岄変腑Native_Builder錛屽茍灝嗗叾璋冨埌鏈涓婇潰
 
鐒跺悗閫夋嫨C/C++ Build->Environment->Add
 
 
鎺ヤ笅鏉ュ湪Name鏍忚緭鍏ath錛屽湪Value鏍忚緭鍏:\cygwin\bin
 
鐒跺悗鍦↗ava Build Path閲岄潰閫夋嫨Libraries鏍忥紝灝咥ndroid Dependencies浠ュ強Android Private Libraries涓や釜library鍒犳帀
 
錛堣鏄庝竴涓嬶紝浠ヤ笂鎴戜滑鏄皢cygwin鐨勭紪璇戠幆澧冨悎騫跺埌浜咵clipse閲岋紝Eclipse鍒╃敤cygwin騫惰皟鐢╟ygwin鐨刡ash浠ュ強make錛岄氳繃NDK鏉ョ紪璇戞垜浠殑Android紼嬪簭錛屾墍浠ユ瘡嬈″鍏ユ柊鐨勫伐紼嬮兘瑕佸皢涓婅堪姝ラ閲嶆柊閰嶇疆涓涓嬶紝榪欑偣闈炲父閲嶈錛屽鏋滈厤緗笉姝g‘錛屼細瀵艱嚧寰堝鑾悕鍏跺鐨勬姤閿欙紝鏈鍏稿瀷鐨勯敊璇氨鏄彁紺烘壘涓嶅埌bash鍛戒護浠涔堢殑~~~~錛?/div>
濂戒簡錛岀幇鍦ㄦ垜浠彲浠ョ敓鎴怉PK鏂囦歡浜嗭紝鍦ㄤ富鐣岄潰閫変腑鑷繁鐨勫伐紼嬶紝鐒跺悗鍦ㄥ懡浠ゆ潯涓婇夋嫨Run->Run as->Android Application
 
 
鍦ㄧ紪璇戠殑榪囩▼涓紝浼氭湁鍚勭緙栬瘧閿欒鐨勯棶棰橈紝榪欐槸鎴戠鍒扮殑涓変釜錛?/div>
please define NDK_ROOT
瑙e喅鏂規(guī)硶錛?/div>
鍦ㄥ伐紼嬬殑proj.android鐩綍涓嬬殑build_native.sh涓姞鍏?/div>
export NDK_ROOT=/cygdrive/e/android-ndk-r9
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml   
瑙e喅鍔炴硶錛?/div>
鍦ㄨ宸ョ▼鐨刯ni鏂囦歡澶逛笅錛屽垱寤猴紙鑻ヤ笉瀛樺湪錛屾墠鍒涘緩錛変竴涓悕涓篈pplication.mk鐨勬枃浠訛紝鍦ㄥ叾鍐呭啓涓鍙ワ細
APP_PLATFORM := android-8
緙栬瘧鎴愬姛錛屼絾鏄痓in鐩綍涓嬫病鏈夌敓鎴恆pk鏂囦歡
瑙e喅鍔炴硶錛?/div>
鍦ㄥ伐紼嬬殑proj.android鐩綍涓嬬殑build_native.sh涓姞鍏?/div>
chmod 666 -R "$APP_ANDROID_ROOT"/assets
 
濡傛灉浠ヤ笂姝ラ閮芥寜鐓ф楠よ瀹氱殑璇濓紝灝辮兘澶熺敓鎴怉PK浜嗭紝APK瀛樻斁鍦╬roj.android->bin鏂囦歡澶逛笅
蹇皢APK瑁呭湪鑷繁鐨勭湡鏈轟笂榪涜嫻嬭瘯鍚э紒錛侊紒錛侊紒
浠ヤ笂緙栬瘧鐜?yōu)閰嵕|粨鏉熶簡銆?/div>
 


]]>lua甯哥敤鍑芥暟http://www.shnenglu.com/API/archive/2014/06/27/207436.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Fri, 27 Jun 2014 07:34:00 GMThttp://www.shnenglu.com/API/archive/2014/06/27/207436.htmlhttp://www.shnenglu.com/API/comments/207436.htmlhttp://www.shnenglu.com/API/archive/2014/06/27/207436.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/207436.htmlhttp://www.shnenglu.com/API/services/trackbacks/207436.htmllua_newtable
void lua_newtable (lua_State *L);

鍒涘緩涓涓┖ table 錛屽茍灝嗕箣鍘嬪叆鍫嗘爤銆?瀹冪瓑浠蜂簬 lua_createtable(L, 0, 0) 銆?/p>

 

lua_gettop

int lua_gettop (lua_State *L);

榪斿洖鏍堥《鍏冪礌鐨勭儲寮曘?鍥犱負绱㈠紩鏄粠 1 寮濮嬬紪鍙風殑錛?鎵浠ヨ繖涓粨鏋滅瓑浜庡爢鏍堜笂鐨勫厓绱犱釜鏁幫紙鍥犳榪斿洖 0 琛ㄧず鍫嗘爤涓虹┖錛夈?/p>

 

luaL_newmetatable

int luaL_newmetatable (lua_State *L, const char *tname);

濡傛灉娉ㄥ唽琛ㄤ腑宸茬粡鏈塊ey涓簍name鐨勬暟鎹垯榪斿洖0. 鍚﹀垯鍒涘緩涓涓柊琛ㄤ綔涓簎serdata鐨刴etatable錛屽茍鍦ㄦ敞鍐岃〃涓敞鍐屽畠鐒跺悗榪斿洖1. 涓嶈繃涓ょ鎯呭喌閮戒細鎶婃敞鍐岃〃涓璽name鐩稿叧鐨勫煎帇鍏ュ爢鏍堛?/span>

luaL_checkudata

void *luaL_checkudata (lua_State *L, int narg, const char *tname);

Checks whether the function argument narg is a userdata of the type tname (see luaL_newmetatable).

lua_pushstring

void lua_pushstring (lua_State *L, const char *s);

鎶婃寚閽?nbsp;s 鎸囧悜鐨勪互闆剁粨灝劇殑瀛楃涓插帇鏍堛?Lua 瀵硅繖涓瓧絎︿覆鍋氫竴嬈″唴瀛樻嫹璐濓紙鎴栨槸澶嶇敤涓涓嫹璐濓級錛?鍥犳 s 澶勭殑鍐呭瓨鍦ㄥ嚱鏁拌繑鍥炲悗錛屽彲浠ラ噴鏀炬帀鎴栨槸閲嶇敤浜庡叾瀹冪敤閫斻?瀛楃涓蹭腑涓嶈兘鍖呭惈鏈夐浂瀛楃錛涚涓涓鍒扮殑闆跺瓧絎︿細璁や負鏄瓧絎︿覆鐨勭粨鏉熴?/p>

 

lua_pushlstring

void lua_pushlstring (lua_State *L, const char *s, size_t len);

鎶婃寚閽?nbsp;s 鎸囧悜鐨勯暱搴︿負 len 鐨勫瓧絎︿覆鍘嬫爤銆?Lua 瀵硅繖涓瓧絎︿覆鍋氫竴嬈″唴瀛樻嫹璐濓紙鎴栨槸澶嶇敤涓涓嫹璐濓級錛?鍥犳 s 澶勭殑鍐呭瓨鍦ㄥ嚱鏁拌繑鍥炲悗錛屽彲浠ラ噴鏀炬帀鎴栨槸閲嶇敤浜庡叾瀹冪敤閫斻?瀛楃涓插唴鍙互淇濆瓨鏈夐浂瀛楃銆?/p>

 

lua_pushvalue

void lua_pushvalue (lua_State *L, int index);

鎶婂爢鏍堜笂緇欏畾鏈夋晥澶勭儲寮曞鐨勫厓绱犱綔涓涓嫹璐濆帇鏍堛?/p>

 

lua_settable

void lua_settable (lua_State *L, int index);

浣滀竴涓瓑浠蜂簬 t[k] = v 鐨勬搷浣滐紝 榪欓噷 t 鏄竴涓粰瀹氭湁鏁堢儲寮?nbsp;index 澶勭殑鍊鹼紝 v 鎸囨爤欏剁殑鍊鹼紝 鑰?nbsp;k 鏄爤欏朵箣涓嬬殑閭d釜鍊箋?/p>

榪欎釜鍑芥暟浼氭妸閿拰鍊奸兘浠庡爢鏍堜腑寮瑰嚭銆?鍜屽湪 Lua 涓竴鏍鳳紝榪欎釜鍑芥暟鍙兘瑙﹀彂 "newindex" 浜嬩歡鐨勫厓鏂規(guī)硶 錛堝弬瑙?nbsp;§2.8錛夈?/p>

                                                                                                                                                                                                                                                                      

lua_pushcfunction

void lua_pushcfunction (lua_State *L, lua_CFunction f);

灝嗕竴涓?C 鍑芥暟鍘嬪叆鍫嗘爤銆?榪欎釜鍑芥暟鎺ユ敹涓涓?C 鍑芥暟鎸囬拡錛屽茍灝嗕竴涓被鍨嬩負 function 鐨?Lua 鍊?鍘嬪叆鍫嗘爤銆傚綋榪欎釜鏍堝畾鐨勫艱璋冪敤鏃訛紝灝嗚Е鍙戝搴旂殑 C 鍑芥暟銆?/p>

娉ㄥ唽鍒?Lua 涓殑浠諱綍鍑芥暟閮藉繀欏婚伒寰紜殑鍗忚鏉ユ帴鏀跺弬鏁板拰榪斿洖鍊?錛堝弬瑙?nbsp;lua_CFunction錛夈?/p>

lua_pushcfunction 鏄綔涓轟竴涓畯瀹氫箟鍑虹幇鐨勶細

      #define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)

 

 

lua_setmetatable

int lua_setmetatable (lua_State *L, int index);

鎶婁竴涓?table 寮瑰嚭鍫嗘爤錛屽茍灝嗗叾璁句負緇欏畾绱㈠紩澶勭殑鍊肩殑 metatable 銆?/p>

 

lua_pushcclosure

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);

鎶婁竴涓柊鐨?C closure 鍘嬪叆鍫嗘爤銆?/p>

褰撳垱寤轟簡涓涓?C 鍑芥暟鍚庯紝浣犲彲浠ョ粰瀹冨叧鑱斾竴浜涘鹼紝榪欐牱灝辨槸鍦ㄥ垱寤轟竴涓?C closure 錛堝弬瑙?nbsp;§3.4錛夛紱 鎺ヤ笅鏉ユ棤璁哄嚱鏁頒綍鏃惰璋冪敤錛岃繖浜涘奸兘鍙互琚繖涓嚱鏁拌闂埌銆?涓轟簡灝嗕竴浜涘煎叧鑱斿埌涓涓?C 鍑芥暟涓婏紝 棣栧厛榪欎簺鍊奸渶瑕佸厛琚帇鍏ュ爢鏍堬紙濡傛灉鏈夊涓鹼紝絎竴涓厛鍘嬶級銆?鎺ヤ笅鏉ヨ皟鐢?nbsp;lua_pushcclosure 鏉ュ垱寤哄嚭 closure 騫舵妸榪欎釜 C 鍑芥暟鍘嬪埌鍫嗘爤涓娿?鍙傛暟 n 鍛婁箣鍑芥暟鏈夊灝戜釜鍊奸渶瑕佸叧鑱斿埌鍑芥暟涓娿?nbsp;lua_pushcclosure 涔熶細鎶婅繖浜涘間粠鏍堜笂寮瑰嚭銆?/p>

 

lua_newuserdata

void *lua_newuserdata (lua_State *L, size_t size);

榪欎釜鍑芥暟鍒嗛厤鍒嗛厤涓鍧楁寚瀹氬ぇ灝忕殑鍐呭瓨鍧楋紝 鎶婂唴瀛樺潡鍦板潃浣滀負涓涓畬鏁寸殑 userdata 鍘嬪叆鍫嗘爤錛屽茍榪斿洖榪欎釜鍦板潃銆?/p>

userdata 浠h〃 Lua 涓殑 C 鍊箋?瀹屾暣鐨?userdata 浠h〃涓鍧楀唴瀛樸?瀹冩槸涓涓璞★紙灝卞儚 table 閭f牱鐨勫璞★級錛?浣犲繀欏誨垱寤哄畠錛屽畠鏈夌潃鑷繁鐨勫厓琛紝鑰屼笖瀹冨湪琚洖鏀舵椂錛屽彲浠ヨ鐩戞祴鍒般?涓涓畬鏁寸殑 userdata 鍙拰瀹冭嚜宸辯浉絳夛紙鍦ㄧ瓑浜庣殑鍘熺敓浣滅敤涓嬶級銆?/p>

褰?Lua 閫氳繃 gc 鍏冩柟娉曞洖鏀朵竴涓畬鏁寸殑 userdata 鏃訛紝 Lua 璋冪敤榪欎釜鍏冩柟娉曞茍鎶?userdata 鏍囪涓哄凡緇堟銆?絳夊埌榪欎釜 userdata 鍐嶆琚敹闆嗙殑鏃跺欙紝Lua 浼氶噴鏀炬帀鐩稿叧鐨勫唴瀛樸?/p>

 

lua_touserdata

void *lua_touserdata (lua_State *L, int index);

濡傛灉緇欏畾绱㈠紩澶勭殑鍊兼槸涓涓畬鏁寸殑 userdata 錛屽嚱鏁拌繑鍥炲唴瀛樺潡鐨勫湴鍧銆?濡傛灉鍊兼槸涓涓?light userdata 錛岄偅涔堝氨榪斿洖瀹冭〃紺虹殑鎸囬拡銆?鍚﹀垯錛岃繑鍥?nbsp;NULL 銆?/span>

 

 

Lua璋冪敤C++綾昏鐐癸細

1.       涓烘綾誨緩绔嬩竴涓叏灞琛紝琛ㄥ悕涓虹被鍚峵bClass錛?/p>

lua_newtable(L);

int methods = lua_gettop(L);

lua_pushstring(LT::className);

lua_pushvalue(Lmethods);

lua_settable(LLUA_GLOBALSINDEX);

 

 

2錛庢敞鍐屼竴涓猭ey涓篢::className鐨刴etatable錛屽茍鍒跺畾鍏朵腑鐨勪竴浜涙垚鍛橈紝鐢ㄤ簬涔嬪悗鐢熸垚鐨剈serdata銆?/p>

// 榪欎釜琛ㄧ敤浜巙serdata(T鐨勫璞?鐨刴etatable

          luaL_newmetatable(LT::className);

          int metatable = lua_gettop(L);

         // metatable["__index"] = tbClass

         lua_pushliteral(L"__index");

         lua_pushvalue(Lmethods);

         lua_settable(Lmetatable);

// metatable["__tostring"] = tostring_T

         lua_pushliteral(L"__tostring");

         lua_pushcfunction(Ltostring_T);

         lua_settable(Lmetatable);

     // metatable["__gc"] = gc_T

         lua_pushliteral(L"__gc");

         lua_pushcfunction(Lgc_T);

         lua_settable(Lmetatable);

 

 

 

3錛?nbsp;涓烘琛ㄦ寚瀹氭垚鍛橈紝姣忎釜鎴愬憳鐨刱ey涓虹被鐨勬垚鍛樺嚱鏁板悕錛孷alue涓轟竴涓甫鏈夐棴鍖呯殑緇熶竴鍑芥暟銆傛瘮濡倀bClass[FunName] = thunk錛屼箣鍚庡彲浠ユ牴鎹棴鍖呭緱鍒板叿浣撴槸璋冪敤鍒板摢涓嚱鏁般傞棴鍖呬腑鏈夊嚱鏁板悕鍜岀浉搴斿嚱鏁扮殑緇勫悎緇撴瀯(浠ightuserdata鐨勫艦寮忚祴緇欓棴鍖?銆傝繖浜涚被鎴愬憳鍑芥暟鍙傛暟閮藉繀欏誨寘鎷琹ua_State錛屽洜涓哄畠闇瑕佺殑鍙傛暟閮戒細鍦╨ua鍫嗘爤涓?/p>

// 涓簍bClass濉厖鎴愬憳鍑芥暟

         for (RegType *l = T::methodsl->namel++)

         {

              /* edited by Snaily: shouldn't it be const RegType *l ... ? */

              lua_pushstring(Ll->name);

// 鎶?鍑芥暟鍚?鍑芥暟鍦板潃)pair浠ightuserdata鐨勫艦寮忎綔涓篊 closure鐨剈pvalue鍏ユ爤

              lua_pushlightuserdata(L, (void*)l);

// 鎶婁竴涓柊鐨凜 closure 鍘嬪叆鍫嗘爤銆備負upvalue鐨勪釜鏁幫紝騫舵寚瀹氬洖璋冨嚱鏁扮粺涓涓簍hunk    lua_pushcclosure(Lthunk, 1);         

// tbClass[FunName] = Function

lua_settable(Lmethods);

         }

 

4錛庡垱寤篊瀵硅薄緇欒剼鏈嬌鐢╞ = Account.new(Account, 30); new鏄痶bClass涓嬬殑涓涓嚱鏁?鍙﹀鎸囧畾鐨勶紝涓嶄細鎺夊埌thunk錛岃繖涓鍙ヤ細璋冪敤鍒癈鐨勪竴涓嚱鏁幫紝閲岄潰浼氱敓鎴愪竴涓狢瀵硅薄錛岀劧鍚庡垱寤轟竴涓猽serdata 鐢ㄤ簬鍏寵仈鍒拌繖涓柊鐢熸垚鐨凜瀵硅薄銆傛渶鍚庝負榪欎釜userdata緇戝畾涓婃垜浠笂闈㈡敞鍐屼負T::classname鐨刴etatable銆傚洜涓哄畾鍒朵簡metatable鐨刜_index鎴愬憳錛屾墍浠ュ綋userdata鎵句笉鍒扮殑鎴愬憳浼氬幓璋冪敤__index錛屽洜涓轟箣鍓嶆垜浠妸__index緇戝畾鍒皌bClass錛屾墍浠ヤ篃浼氳皟鐢ㄥ埌tbClass鐨勭浉搴旀垚鍛樸?/p>

 

     // 鍒涘緩涓涓柊鐨凾瀵硅薄錛屽茍鍒涘緩涓涓熀浜巙serdataType鐨剈serdata錛屽叾涓繚鎶や簡鎸囧悜T瀵硅薄鐨勬寚閽?/span>

     static int new_T(lua_State *L)

     {

         lua_remove(L, 1);   // use classname:new(), instead of classname.new()

         T *obj = new T(L); // call constructor for T objects

         userdataType *ud =

              static_cast<userdataType*>(lua_newuserdata(Lsizeof(userdataType)));

         ud->pT = obj// store pointer to object in userdata

         luaL_getmetatable(LT::className); // lookup metatable in Lua registry

         lua_setmetatable(L, -2);

         return 1; // userdata containing pointer to T object

     }

 

5錛?nbsp;褰撹剼鏈腑鎸囧畾鍑芥暟琚皟鐢ㄧ殑鏃跺欙紝姣斿b:deposit(50.30)鐨勬椂鍊欙紝b鏄痷serdata錛屽畠鐨刴etatable鐨刜_index鍜宼bClass緇戝畾(瑙?)錛屾墍浠ヤ細璋冪敤鍒皌bClass鐨勭浉搴旀垚鍛橈紝灝辨槸涔嬪墠鍏寵仈鐨則hunk錛氳繖涓椂鍊橪鐨勫爢鏍堥噷闈㈡湁榪欎釜鍑芥暟鐨勪袱涓弬鏁幫紝涓涓槸b鏈韓錛屼竴涓槸50.30銆俠鏄痷serdata錛屽彲浠ユ牴鎹畠鍙栧嚭瀵硅薄鐨勬寚閽堛傝絎?姝ャ傚彟澶栧嚱鏁拌璋冪敤鐨勬椂鍊欙紝瀹冪浉鍏崇殑upvalue涔熷彲浠ュ彇寰楀埌錛岃姝ラ3銆傛湁浜嗗璞℃寚閽堝拰鐩稿簲鐨勫嚱鏁幫紝璋冪敤涔熶笉涓洪毦浜嗭紝璁頒綇鍙傛暟50.30鏄繚瀛樺湪鍫嗘爤涓紶緇欑被鐨勬垚鍛樺嚱鏁版潵鍙栧緱銆?/p>

// 鎵鏈夋垚鍛樺嚱鏁伴兘浼氳皟鐢ㄥ埌榪欓噷錛岀劧鍚庢牴鎹畊pvalue鏉ユ墽琛屽叿浣撶殑鎴愬憳鍑芥暟

     static int thunk(lua_State *L)

     {

         // stack has userdata, followed by method args

         T *obj = check(L, 1); // the object pointer from the table at index 0.

         lua_remove(L, 1); // remove self so member function args start at index 1

         // get member function from upvalue

         RegType *l = static_cast<RegType*>(lua_touserdata(Llua_upvalueindex(1)));

         return (obj->*(l->mfunc))(L); // call member function

     }

     // 鏍規(guī)嵁鎸囧畾浣嶇疆narg鑾峰緱瀵硅薄鎸囬拡,榪欎釜userdata鏄湪new_T鐨勬椂鍊欏垱寤虹殑

     static T *check(lua_State *Lint narg)

     {

         void *pUserData = luaL_checkudata(LnargT::className);   

         userdataType *ud = static_cast<userdataType*>(pUserData);    // 榪欎釜鏄嚱鏁扮殑upvalue

         if(!ud)

              luaL_typerror(LnargT::className);

         return ud->pT;

     }

 



]]>
lua5.1->lua5.0http://www.shnenglu.com/API/archive/2014/06/25/207409.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Wed, 25 Jun 2014 08:32:00 GMThttp://www.shnenglu.com/API/archive/2014/06/25/207409.htmlhttp://www.shnenglu.com/API/comments/207409.htmlhttp://www.shnenglu.com/API/archive/2014/06/25/207409.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/207409.htmlhttp://www.shnenglu.com/API/services/trackbacks/207409.html鍏抽敭瀛楋細
銆銆and break do else elseif end false for function if in local nil not or repeat return then true until銆while
浣跨敤鍙橀噺涓嶉渶瑕佸0鏄庯紝鎬繪槸鍏ㄥ眬鍙橀噺錛岄櫎闈炲姞"local"銆俵ocal鐨勪綔鐢ㄥ煙鏄湪鏈閲屽眰鐨別nd鍜屽叾閰嶅鐨勫叧閿瓧涔嬮棿銆傚叏灞鍙橀噺鐨勪綔鐢ㄥ煙鏄暣涓▼搴忋傚ぇ灝忓啓鐩稿叧銆傚畾涔変竴涓彉閲忕殑鏂規(guī)硶灝辨槸璧嬪?錛?鎿嶄綔銆傚彉閲忕被鍨嬶紝鍙互鐢╰ype()鍑芥暟鏉ユ鏌ワ細
銆銆Nil  絀哄鹼紝鎵鏈夋病鏈変嬌鐢ㄨ繃鐨勫彉閲忛兘鏄痭il銆俷il鏃㈡槸鍊煎張鏄被鍨嬨傚彉閲忔竻闄ょ洿鎺ョ粰鍙橀噺璧嬩互nil鍊箋?br />銆銆Boolean  甯冨皵鍊紅rue 鍜?false銆傚彧鏈塮alse鍜宯il鎵嶈璁$畻涓篺alse錛岃屾墍鏈変換浣曞叾瀹冪被鍨嬬殑鍊鹼紝閮芥槸true銆傛瘮濡?錛岀┖涓茬瓑絳夛紝閮芥槸true銆?br />銆銆Number  鏁板鹼紝鐩稿綋浜嶤璇█鐨刣ouble瀹炴暟濡傦細4 0.4 4.57e-3 0.3e12 5e+20
銆銆Userdata  鍙互鏄涓葷殑浠繪剰鏁版嵁綾誨瀷錛屽父鐢ㄧ殑鏈塖truct鍜屾寚閽堛?br />銆銆Thread銆綰跨▼綾誨瀷錛屽湪Lua涓病鏈夌湡姝g殑綰跨▼錛屽皢涓涓嚱鏁板垎鎴愬嚑閮ㄤ喚榪愯銆?br />銆銆String  瀛楃涓詫紝鍙互鍖呭惈'/0'瀛楃錛屽彲浠ュ畾涔夊緢闀跨殑瀛楃涓層傜敤鍙屽紩鍙鋒垨鍗曞紩鍙峰紩鐢ㄥ崟琛岋紝"[["鍜?]]"寮曠敤澶氳瀛楃涓層傛柊鐗堟敮鎸?[==["鍜?]==]"澶氬眰鏍囪錛?鍙蜂釜鏁頒負灞傛暟銆備弗鏍兼寜灞傛暟鍖歸厤銆傛敮鎸佷竴浜涜漿涔夊瓧絎︼細
/a閾?b閫鏍?f鎹㈤〉/n鎹㈣/r鍥炶濺/t鍒惰〃絎?v鍨傜洿鍒惰〃//鍙嶆枩鏉?"鍙屽紩鍙?'鍗曞紩鍙?[宸︿腑鎷彿/]鍙充腑鎷彿
銆銆Table  鍏崇郴琛ㄧ被鍨嬶紝鍔熻兘寮哄ぇ銆傚彲浠ョ敤闄や簡nil浠繪剰綾誨瀷鐨勫兼潵浣滄暟緇勭殑绱㈠紩鍜屽唴瀹廣?br />銆銆Table鐨勫畾涔夛細T1 = {}  T1[1]=10  T1["John"]={Age=27, Gender="Male"}
銆銆銆銆榪欎竴鍙ョ浉褰撲簬T1["John"]["Gender"]="Male"
銆銆銆銆绱㈠紩鏄瓧絎︿覆鏃跺彲浠ョ畝鍐欐垚錛歍1.John.Gender="Male"鎴朤1.John={Age=27, Gender="Male"}
銆銆銆銆絎竴錛屾墍鏈夊厓绱犱箣闂達紝鎬繪槸鐢ㄩ楀彿"錛?闅斿紑錛?br />銆銆銆銆絎簩錛屾墍鏈夌儲寮曞奸兘闇瑕佺敤"["鍜?]"鎷搗鏉ワ紱濡傛灉鏄瓧絎︿覆錛岃繕鍙互鍘繪帀寮曞彿鍜屼腑鎷彿錛?br />銆銆銆銆絎笁錛屽鏋滀笉鍐欑儲寮曪紝鍒欑儲寮曞氨浼氳璁や負鏄暟瀛楋紝騫舵寜欏哄簭鑷姩浠?寰鍚庣紪錛?br />銆銆銆銆T1=
銆銆銆銆{
銆銆銆銆銆銆10,  -- 鐩稿綋浜?[1] = 10
銆銆銆銆銆銆[100] = 40,
銆銆銆銆銆銆John=  -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"John"] =
銆銆銆銆銆銆{
銆銆銆銆銆銆銆銆Age=27,   -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"Age"] =27
銆銆銆銆銆銆銆銆Gender=Male   -- 濡傛灉浣犲師鎰忥紝浣犺繕鍙互鍐欐垚錛歔"Gender"] ="Male"
銆銆銆銆銆銆},
銆銆銆銆銆銆20  -- 鐩稿綋浜?[2] = 20
銆銆銆銆}
銆銆Function  鍑芥暟涔熸槸涓縐嶇被鍨嬶紝涔熷氨鏄鎵鏈夌殑鍑芥暟鏈韓灝辨槸涓涓彉閲忋?br />鍑芥暟鐨勫畾涔夛細function add(a,b) return a+b end 鐩稿綋浜巃dd = function (a,b) return a+b end
濡傛灉鍑芥暟鍙湁涓涓弬鏁幫紝鍙互鐪佺暐鎷彿銆?br />return璇█涓瀹氳鍐欏湪end涔嬪墠銆傚湪涓棿鏀句笂return錛屽啓鎴愶細do return end銆?br />鍑芥暟鍙互鎺ュ彈鍙彉鍙傛暟涓暟錛岀敤"..."鏉ュ畾涔塮unction sum (a,b,...)
濡?鏋滄兂鍙栧緱...鎵浠h〃鐨勫弬鏁幫紝5.0鐗堟湰鍙互鍦ㄥ嚱鏁頒腑璁塊棶arg灞閮ㄥ彉閲忥紙琛ㄧ被鍨嬶級寰楀埌銆傚 sum(1,2,3,4)鍒欙紝a = 1, b = 2, arg = {3, 4}錛屽湪5.1鐗堟湰澶氫簡涓涓?..鍙橀噺錛堝疄闄呭氨鏄弬鏁板垪琛級錛屽尯鍒彧鍦ㄤ簬arg鍜?..鍏卞悓瀛樺湪鐨勬儏鍐碉紝...浼氫嬌arg鍙榥il銆?br />鍙互鍚屾椂榪斿洖澶氫釜緇撴灉錛屾瘮濡傦細function s() return 1,2,3,4 end
銆銆銆銆a,b,c,d = s()  -- 姝ゆ椂錛宎 = 1, b = 2, c = 3, d = 4
浣跨敤闈㈠悜瀵硅薄緙栫▼錛?br />銆銆銆銆t =銆{ Age = 27, add = function(self, n) self.Age = self.Age+n end銆}
銆銆銆銆print(t.Age)  -- 27
銆銆銆銆t.add(t, 10) 鍙互綆鍐欐垚錛歵:add(10)
銆銆銆銆print(t.Age)  -- 37

鍗曡娉ㄩ噴"--"銆傚彧瑕?-鍚庨潰絎竴涓瓧絎︿笉鏄琛屽瓧絎︿覆寮曠敤絎[錛屽嵆涓哄琛屾敞閲娿?/div>
璇彞涔嬮棿鍙互鐢ㄥ垎鍙?錛?闅斿紑錛屼篃鍙互鐢ㄧ┖鐧介殧寮銆?/div>
鏉′歡鎺у埗錛歩f 鏉′歡 then … elseif 鏉′歡 then … else … end
While寰幆錛歸hile 鏉′歡 do … end
Repeat寰幆錛歳epeat … until 鏉′歡
For寰幆錛歠or 鍙橀噺 = 鍒濆鹼紝緇堢偣鍊鹼紝姝ヨ繘 do … end
鍙互鐪佺暐姝ヨ繘鍊鹼紝榪欐椂鍊欙紝for寰幆浼氫嬌鐢?浣滀負姝ヨ繘鍊箋?/div>
For寰幆錛歠or 鍙橀噺1錛屽彉閲?錛?#8230; 錛屽彉閲廚 in琛ㄦ垨鏋氫婦鍑芥暟 do … end
璇彞鍧楃敤do 鍜?end 鎷搗鏉ョ殑銆傚彲浠ュ湪鍑芥暟涓拰璇彞鍧椾腑瀹氬眬閮ㄥ彉閲忋?/div>
璧嬪艱鍙ュ彲浠ュ悓鏃剁粰澶氫釜鍙橀噺璧嬪箋備緥濡傦細a,b,c,d=1,2,3,4鐢氳嚦鏄細a,b=b,a 鏂逛究鐨勪氦鎹㈠彉閲忓姛鑳?/div>
榛樿鍙橀噺鎬繪槸鍏ㄥ眬鐨勩傚畾涔夊眬閮ㄥ彉閲忥紝鍒欏湪絎竴嬈¤祴鍊肩殑鏃跺欑敤local璇存槑銆傛瘮濡傦細
銆銆local a,b,c = 1,2,3  -- a,b,c閮芥槸灞閮ㄥ彉閲?/div>
鏁板艱繍綆楁敮鎸?+, -, *, /,^,#,%銆俕琛ㄧず鎸囨暟涔樻柟銆傛瘮濡?^3 緇撴灉涓?銆?.1鐗堝姞浜?闀垮害榪愮畻絎︺傚瓧絎︿覆鐨勯暱搴﹀崟浣嶄負瀛楄妭錛岃〃鐨勯暱搴︿負nil鍓嶇殑鏁存暟绱㈠紩涓暟錛屼篃灝辨槸鏁扮粍鐨勪釜鏁幫紝濡傛灉鏈夊悕涓簄鐨勭儲寮曪紝瀹冪殑鍊煎氨鏄暱搴︺?.1鐗堝紩榪?妯¤繍綆椼?/div>
鐢?.."榪炴帴涓や釜瀛楃涓層傚錛?This a " .. "string." -- 絳変簬 "this a string"
姣旇緝榪愮畻< > <= >= == ~=鍒嗗埆琛ㄧず 灝忎簬錛屽ぇ浜庯紝涓嶅ぇ浜庯紝涓嶅皬浜庯紝鐩哥瓑錛屼笉鐩哥瓑銆傛繪槸榪斿洖true鎴杅alse銆傚浜嶵able錛孎unction鍜孶serdata綾誨瀷鐨勬暟鎹紝鍙湁 == 鍜?~=鍙互鐢ㄣ傜浉絳夎〃紺轟袱涓彉閲忓紩鐢ㄧ殑鏄悓涓涓暟鎹傛瘮濡傦細銆a={1,2}銆銆銆銆b=a銆銆銆銆print(a==b, a~=b)  -- true, false
銆銆銆銆a={1,2}銆銆銆銆b={1,2}銆銆銆銆print(a==b, a~=b)  -- false, true
閫昏緫榪愮畻and, or, not鍙湁false鍜宯il鎵嶈綆椾負false錛屽叾瀹冧換浣曟暟鎹兘璁$畻涓簍rue錛?涔熸槸true錛?br />銆銆銆銆and 鍜?or鐨勮繍綆楃粨鏋滀笉鏄痶rue鍜宖alse錛岃屾槸鍜屽畠鐨勪袱涓搷浣滄暟鐩稿叧銆?br />銆銆銆銆a and b錛氬鏋渁涓篺alse錛屽垯榪斿洖a錛涘惁鍒欒繑鍥瀊
銆銆銆銆a or b錛氬鏋?a 涓簍rue錛屽垯榪斿洖a錛涘惁鍒欒繑鍥瀊
榪愮畻絎︿紭鍏堢駭錛屼粠楂樺埌浣庨『搴忓涓嬶細
銆銆銆銆^
銆銆銆銆not - 錛堜竴鍏冭繍綆楋級#
銆銆銆銆 * / %
銆銆銆銆 + -
銆銆銆銆 ..錛堝瓧絎︿覆榪炴帴錛?br />銆銆銆銆 < > <= >= ~= ==
銆銆銆銆 and
銆銆銆銆 or
銆銆銆銆 =
甯哥敤鏍囧噯搴撳嚱鏁?
print (···)鎶婃墍鏈夊弬鏁版墦鍗板嚭鏉ワ紝鍒╃敤tostring (e)杞崲闈炲瓧絎︺傚鎬殑鏄痭il涓嶈兘鍋?.鎿嶄綔銆?br />table.insert (table, [pos,] value)鍦╬os浣嶇疆鎻掑叆涓涓鹼紝榛樿鏄湯灝俱?br />table.remove (table [, pos])鍦╬os浣嶇疆鍒犻櫎涓涓鹼紝榛樿鏄湯灝俱?br />table.concat (table [, sep [, i [, j]]])鐢╯ep鏉ヨ繛鎺ユ暟緇勯噷浠巌鍒癹瀛楃涓叉垨鏁板瓧騫惰繑鍥炰竴涓暱瀛楃涓詫紝榛樿鐢ㄧ┖涓蹭粠1鍒版湯灝俱傚鏋渏澶т簬i錛岃繑鍥炵┖涓層?br />table.maxn (table)榪斿洖鏈澶ф鏁扮儲寮曟垨0銆?br />table.sort (table [, comp])瀵規(guī)暟緇勬帓搴忥紝鎺掑簭鍑芥暟榛樿鏄?lt;銆?br />string.byte (s [, i [, j]])榪斿洖s涓蹭粠i鍒癹鐨勬暟鍊箋傛棫鐗堝彧鏀寔2涓弬鏁?br />string.char (···)鍜宐yte鍑芥暟鍔熻兘鐩稿弽錛岃繑鍥?鎴栧涓暟瀛楀搴旂殑瀛楃涓層?br />string.find (s, pattern [, init [, plain]])浠巗涓蹭腑浠巌nit浣嶇疆寮濮嬫壘鍒扮涓涓尮閰嶆ā寮忕殑瀛愪覆浣嶇疆錛屽茍榪斿洖璧風偣鍜岀粓鐐廣俻lain濡傛灉涓簍rue錛屽拷鐣ユā寮忋傚鏋滀嬌鐢ㄤ簡鎹曡幏錛屽垯澧炲姞榪斿洖鎹曡幏鐨勯儴鍒嗐?br />string.gmatch (s, pattern)榪欐槸涓涓凱浠e嚱鏁幫紝姣忔榪斿洖涓涓尮閰嶇殑涓層傛棫鐗堝彨gfind銆傚鏋滀嬌鐢ㄤ簡鎹曡幏錛屽垯榪斿洖鎹曡幏鐨勯儴鍒嗐?br />string.gsub (s, pattern, repl [, n])鐢╮ep1鏇挎崲銆俷闄愬埗鏇挎崲涓暟銆?1-9琛ㄧず琚崟鑾風殑鍊箋傚鏋滅3涓弬鏁版槸涓嚱鏁板茍榪斿洖鍋囷紝鏇挎崲瀛楃灝嗕繚鎸佸師閰嶈屼笉鏄棫鐗堢殑絀轟覆銆?br />string.sub (s, i [, j])榪斿洖s浠庝綅緗甶鍒癹鐨勫瓙涓層傝礋鍊艱〃紺轟粠鏈熬寰鍓嶆暟鐨勪綅緗傞粯璁や粠1鍒版湯灝俱?br />string.match (s, pattern [, init])浠巌nit鍖歸厤鎴栨崟鑾峰艱繑鍥炪傛棫鐗堟病鏈夎繖涓嚱鏁般?br />string.format (formatstring, ···)鏍煎紡鍖栬緭鍑恒?q鍙互杈撳嚭瀹夊叏瀛楃涓層?br />string.rep (s, n)鎶妔澶嶅埗n浠?br />string.reverse (s)鎶妔鍊掕漿銆傛棫鐗堟病鏈夎繖涓嚱鏁般?br />string.len (s)璁$畻瀛楃涓查暱搴︺?br />string.lower (s)灝忓啓鍖栥俿tring.upper (s)澶у啓鍖栥?br />io.read (···)"*n"璇諱竴涓暟瀛楋紝鏀寔鍚勭鏍煎紡錛?*a"璇繪暣涓枃浠訛紱"*l":璇諱竴琛岋紝榛樿錛?n"璇籲涓瓧絎?br />io.write (···)鍐欏瓧絎︽垨鑰呮暟瀛?br />io.lines ([filename])榪唬榪斿洖鏂囦歡涓殑涓琛屻?br />pairs (t)榪唬榪斿洖琛ㄤ腑鐨勯敭鍊煎
ipairs (t)榪唬榪斿洖鏁扮粍涓殑绱㈠紩鍜屽?br />module (name [, ···])鍒涘緩涓涓ā鍧椼俽equire (modname)鍔犺澆涓涓ā鍧?/div>
妯″紡琛細
.浠繪剰瀛楃%w瀛楁瘝鍜屾暟瀛?a瀛楁瘝%d鏁板瓧%p鏍囩偣瀛楃%s絀虹櫧絎?澶у啓瀛楁瘝琛ㄧず鐩稿簲闆嗗悎鐨勮ˉ闆?br />%u澶у啓瀛楁瘝%l灝忓啓瀛楁瘝%x鍗佸叚榪涘埗鏁板瓧%z浠h〃0鐨勫瓧絎?c鎺у埗瀛楃
%鏄漿涔夋爣璇?[]闆嗗悎 ^琛ラ泦
()琛ㄧず鎹曡幏 %1-9鏄崟鑾峰?%bxy鏄互xy涓烘爣璇嗙殑瀵圭О緇撴瀯
?鍖歸厤鍓嶄竴瀛楃0嬈℃垨1嬈?+鍖歸厤鍓嶄竴瀛楃1嬈℃垨澶氭
*鏈闀垮尮閰嶅墠涓瀛楃0嬈℃垨澶氭 -鏈鐭尮閰嶅墠涓瀛楃0嬈℃垨澶氭
浠寮澶寸殑妯″紡鍙尮閰嶇洰鏍囦覆鐨勫紑濮嬮儴鍒嗭紝鐩鎬技鐨勶紝浠?緇撳熬鐨勬ā寮忓彧鍖歸厤鐩爣涓茬殑緇撳熬閮ㄥ垎銆?/div>
c璋冪敤lua鍑芥暟涓鑸殑榪囩▼鏄?
1. load涓涓猯ua鐨勬枃浠訛紝褰㈡垚涓涓棴鍖呭茍鎵ц瀹?br />2. 鍦ㄦ爤涓帇鍏ュ嚱鏁扮殑鍚嶇О
3. 渚濇鍦ㄦ爤涓帇鍏ュ嚱鏁扮殑瀹炲弬
4. 浣跨敤lua_pcall璋冪敤lua鍑芥暟銆傘褰㈠紡鏄? lua_pcall(L, 鍙傛暟涓暟,緇撴灉涓暟,銆閿欒澶勭悊鍑芥暟鍦ㄦ爤涓殑绱㈠紩)
    姝ゆ椂姝ゅ嚱鏁扮浉鍏崇殑鏍堝凡緇忚娓呯┖銆傛墽琛宭ua瀹屾瘯鍚庯紝濡傛灉鎴愬姛錛岀粨鏋滀緷嬈″皢鍘嬪叆鏍堜腑錛屻濡傛灉涓嶆垚鍔燂紝閿欒淇℃伅灝?鍘嬪叆鏍堜腑
5. 浠庢爤涓鍙栬繑鍥炵粨鏋滄垨鑰呴敊璇俊鎭?/div>
lua璋冪敤c鍑芥暟(鍐欐垚搴撶殑渚嬪瓙)
lua璋冪敤搴撳湪windows涓嬫槸dll鏂囦歡錛屽湪unix/linux涓嬮潰鏄痵o鏂囦歡
vs鐨勮繃紼嬪涓嬶細
1. 鏂板緩涓涓猟ll鐨勫伐紼?br />2. 瀹氫箟涓涓猟ef鏂囦歡錛屽畾涔塪ll鐨勫鍑猴紝mylib.def瀹氫箟濡備笅:
LIBRARY  mylib.dll
DESCRIPTION "first dll for lua"
EXPORTS
luaopen_mylib
3. 緙栧啓搴擄紝鏂板緩涓涓猚pp鏂囦歡.
4. 瀹氫箟搴撳嚱鏁幫紝榪欓噷浠il鐨刲sin鍑芥暟錛岃緭鍑轟紶鍏ュ弬鏁扮殑sin()鍊?br />5. 瀹氫箟luaL_reg鏁扮粍錛岃繖涓槸娉ㄥ唽涓緋誨垪鍏紑緇檒ua璋冪敤鐨勫嚱鏁版暟緇? 鏁扮粍鏈鍚庝竴涓厓绱犲繀欏繪槸 {NULL, NULL} 鐨刲uaL_reg緇撴瀯鐢ㄦ潵鍋氱粨鏉熸爣璇?
6. 鐢╨uaL_openlib澹版槑涓誨嚱鏁?/div>
5.1鐗堟湰鍜?.0鐗堟湰鐨勫尯鍒細
鏂版ā鍧楃郴緇燂紝澧為噺鍨冨溇鏀墮泦錛寁arargs鏂版満鍒訛紝澶氳瀛楃涓叉垨寮曠敤鐨勬柊璇硶錛?鍜?鏂版搷浣滅錛?metatable鏀寔鎵鏈夌被鍨嬶紝浣跨敤luaconf.h鏉ラ厤緗甽ua鏆傛椂閬垮厤鐗堟湰鍐茬獊錛屽畬鍠勭殑reentrant parser銆侾il絎簩鐗堝寘鎷簡5.1鐨勬柊鍐呭錛屽鍔犱簡鏂頒緥瀛愶紝瀵規(guī)柊妯″潡緋葷粺錛屽鐘舵佸拰鍨冨溇鏀墮泦鐨勮緇嗛槓榪般?/div>
璇硶錛?br />鍑芥暟浼犻掑彲鍙樺弬鏁扮敤...鏉ヤ唬鏇垮眬閮╝rg琛ㄣ備笉浣跨敤...鏃訛紝arg鐢ㄦ硶鍜屾棫鐗堟湰涓鏍鳳紱浣嗕嬌鐢?..鍚庯紙鏃犺鍏堝悗錛夛紝灞閮╝rg閮戒細鍙樻垚nil銆?br />鍦╮epeat.until閲岋紝灞閮ㄥ彉閲忕殑鐢熷懡鍛ㄦ湡瑕嗙洊鍒皍ntil鏉′歡鍚庨潰錛?br />澶氳瀛楃涓叉垨寮曠敤鐨勬柊璇硶浣跨敤澶氬眰鍖歸厤浠f浛浠ュ墠鐨勫祵濂楋紱
#鍜?鏂版搷浣滅銆?/div>
搴撳嚱鏁幫細
string.gfind鏀逛負string.gmatch錛?br />濡傛灉璋冪敤string.gsub鐨勭3涓弬鏁版槸涓嚱鏁幫紝濡傛灉鍑芥暟榪斿洖鍋囷紝鏇挎崲瀛楃灝嗕繚鎸佸師閰嶈屼笉鏄棫鐗堢殑絀轟覆錛?br />table.setn搴熷純錛宼able.getn鏀逛負浣跨敤#錛?br />loadlib鏀逛負package.loadlib錛?br />math.mod鏀逛負math.fmod錛?br />table.foreach鍜宼able.foreachi浣滃簾銆傚彲鐢╢or寰幆pairs鎴杋pairs浠f浛錛?br />require浠巔ackage.path鑰屼笉鏄疞UA_PATH寰楀埌path鍊鹼紱
collectgarbage (opt [, arg])鍙傛暟浠嶽limit]鏀逛負鏇村閫夋嫨錛実cinfo搴熷純鏀逛負collectgarbage("count")錛?br />string.byte (s [, i [, j]])榪斿洖s涓蹭粠i鍒癹鐨勬暟鍊箋傛棫鐗堝彧鏀寔2涓弬鏁?br />string.match (s, pattern [, init])浠巌nit鍖歸厤鎴栨崟鑾峰艱繑鍥炪傛棫鐗堟病鏈夎繖涓嚱鏁般?br />string.reverse (s)鎶妔鍊掕漿銆傛棫鐗堟病鏈夎繖涓嚱鏁般?br />module (name [, ···])鍒涘緩涓涓ā鍧椼傛棫鐗堟病鏈夎繖涓嚱鏁般?/div>
C API錛?br />5.1鐗堟湰澧炲姞浜嗕互luaL_寮澶寸殑杈呭姪搴揂uxiliary Library錛?br />luaL_getn鏀逛負lua_objlen錛宭uaL_setn搴熷純錛?br />luaL_openlib鏀逛負luaL_register錛?br />luaL_checkudata鏀逛負鎶涘嚭寮傚父鑰屼笉鏄繑鍥濶ULL銆?br />luaopen_* functions涓嶈兘鐩存帴璋冪敤錛屾敼涓哄儚璋冪敤鍏跺畠鏅歝鍑芥暟涓鏍風殑榪囩▼錛?br />lua_open鏀逛負lua_newstate錛屽彲浠ヨ緗唴瀛樺垎閰嶆柟娉曘俵uaL_newstate榛樿浣跨敤realloc鍒嗛厤鏂規(guī)硶錛?br />5.0鐨勮皟鐢ㄦ柟娉曪細
 lua_State *L = lua_open();
 luaopen_base(L);
 luaopen_string(L);
 luaopen_math(L);
5.1鐨勮皟鐢ㄦ柟娉曪細
 lua_State *L = luaL_newstate();
 lua_cpcall(L, luaopen_base, 0);
 lua_cpcall(L, luaopen_io, 0);
 lua_cpcall(L, luaopen_math, 0);
 lua_cpcall(L, luaopen_string, 0);
lua_pushcfunction(L, luaopen_*);lua_call();絳変環(huán)浜巐ua_cpcall(L, luaopen_*, 0);
鍙傝冭祫鏂欙細
鍙傝冩墜鍐岋細http://www.lua.org/manual/5.x/
lua 5.1 win32瑙f瀽鍣細http://luaforge.net/frs/download.php/2218/lua5_1_2_Win32_bin.zip
lua 5.1 VC++6.0 搴擄細http://luaforge.net/frs/download.php/2241/lua5_1_2_Win32_vc6_lib.zip
luasocket 鍙傝冩墜鍐岋細http://www.cs.princeton.edu/~diego/professional/luasocket/reference.html
luasocket win32鎵╁睍鍖卨uasocket-2.0.1-lua5.1-win32涓嬭澆錛?a style="color: #336699; text-decoration: none;">http://luaforge.net/frs/download.php/1618/luasocket-2.0.1-lua5.1-win32.zip
tolua++ 鍙傝冩墜鍐岋細http://www.codenix.com/~tolua/tolua++.html
tolua++ 1.0.92 婧愪唬鐮佷笅杞斤細http://www.codenix.com/~tolua/tolua++-1.0.92.tar.bz2
 
鍏朵粬緇忛獙錛?br />lua鐨勬墿灞曞簱luasocket, luasql, luacom, kepler...
紼嬪簭鍙互瀛樻垚cpp涔熷彲浠ュ瓨鎴恈, 濡傛灉浠?c涓烘墿灞曞悕灝變笉闇瑕佸姞extern "C"
c鍜宭ua浜や簰鐨勬椂鍊欙紝鏍堢殑緙栧彿鏄粠1-n錛屼篃鍙互鍙栬礋鍊鹼紝-1琛ㄧず鏈熬
璁劇疆鐜鍙橀噺LUA_PATH="E:/LuaEdit/myproject/?.lua"錛岀劧鍚庝嬌鐢╮equire "lua鍖?鏂囦歡鍚?銆傜劧鍚庡氨鍙互鐩存帴浣跨敤lua鏂囦歡閲岀殑鍑芥暟鑰屼笉闇瑕乨ofile(璺緞)浜嗐傚湪windows涓嬬殑璺緞濡傛灉鏄?蹇呴』鍐欐垚//錛屾垨鑰?銆?/div>
lua5.1win32鐨勮В鏋愬櫒涓嬭澆鏉ュ悗鍙互鐩存帴浣跨敤銆俵uasocketwin32鎵╁睍鍖呬笅杞藉悗錛岄渶瑕佹紜緗甃UA_PATH=< LDIR>/?.lua;?.lua鍜孡UA_CPATH=<CDIR>/?.dll;?.dll銆傜劧鍚庤繍琛宭ua瑙f瀽鍣紝 require鐩稿簲鐨剆ocket鍖呭氨鍙互浜嗐?/div>
鍦╒C++6涓嬬紪璇戝甫lua鐨?dll鏂囦歡鐨勬椂鍊欙紝鍦ㄥ伐紼嬭緗噷蹇呴』鎸囨槑LIBC.lib Libcmtd.lib鐨勫姞杞介『搴忋傞夋嫨VC鑿滃崟Project->Settings->Link->Catagory鐒跺悗鍦?Object/library  Modules鐨凟dit鏍忎腑濉叆LIBC.lib Libcmtd.lib銆傚惁鍒欎細鍑虹幇錛?br />Linking...
LIBC.lib(crt0dat.obj) : error LNK2005: __cinit already defined in LIBCMTD.lib(crt0dat.obj)
 
鏂扮増鏈笅琛ㄨ凱甯﹂渶瑕佸姞pairs(t)錛屾棫鐗堟湰浠ヤ笅浠g爜緇撴灉鏄紜殑錛?br />Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio
> function print_contents(t)
>> for k,v in t do
>> print(k .. "=" .. v)
>> end
>> end
> print_contents{x=10, y=20}
stdin:2: attempt to call a table value
stack traceback:
        stdin:2: in function 'print_contents'
        stdin:1: in main chunk
        [C]: ?
 
鏂扮増鏈腑鐨?..鍜宎rg涓嶈兘鍚屾椂鍑虹幇錛屾棤璁哄厛鍚庯紝...鐨勫嚭鐜伴兘浼氫嬌arg涓簄il錛?br />print(#arg)
function test(...)
--print(...)
print(type(arg),#arg)
--print(...)
end
test(1,2,3,4)
print(#arg)
榪愯緇撴灉錛?br />E:/lua5_1_2_Win32_bin>lua5.1 e....lua 1 2 3
3
table   4
3
緇撴灉璇存槑arg鍦ㄦ柊鐗堟湰涓繕鏄彲浠ヤ嬌鐢ㄧ殑錛屼絾璺?..鍐茬獊錛岃窡鍏ㄥ眬琛╝rg涓嶅啿紿併備絾鏈湴arg浼氳鐩栧叏灞鐨刟rg錛屽鏋滀袱鑰呴兘瑕佽皟鐢ㄨ濡備綍澶勭悊錛熶嬌鐢?..鍚庯紝緙栬瘧鍣ㄤ粛鐒舵妸鍑芥暟閲岀殑arg鐪嬫垚鏄眬閮ㄥ彉閲忋傚洜姝ゅ彉閫氱殑鏂規(guī)硶鏄細
print(#arg)
t=arg
function test(...)
print(...)
arg=t
print(type(arg),#arg)
--print(...)
end
test(1,2,3,4)
print(#arg)
榪欏拰鏃х増鏈槸涓鏍風殑銆傜湅鏉ュ紩鍏?..鐨勭敤鎰忎笉鏄負浜嗗尯鍒嗗叏灞鍜屽眬閮ㄧ殑arg銆傞偅絀剁珶鏄負浜嗕粈涔堝憿錛燂紵
 
lua瀹夎錛?br />Windows:  
鎶奺tc鐩綍涓嬬殑luavs.bat 鎷峰埌l(fā)ua鐨勮В鍘嬫牴鐩綍涓嬬洿鎺ヨ繍琛? 鐢熸垚鐨?h .dll .lib .exe鏂囦歡閮藉湪src涓嬨?br />Linux:
$make linux && make install 鏍囧噯鐨刲inux瀹夎

鍦╓indows XP SP2涓嬩嬌鐢╒isual C++ 6. 緙栬瘧lua鐨勮繃紼嬪垎涓?姝ワ細
1錛屽緩绔嬮潤鎬佸簱宸ョ▼錛岀紪璇戝簱鏂囦歡
     Lua搴撶敱鏍囧噯搴撳拰鏍稿績搴撶粍鎴愶紝鎴戠敤鐨勬槸5.1鐗堟湰錛屾墍鏈変唬鐮侀兘鏀懼湪src鐩綍涓傛妸src鐩綍涓櫎lua.c,luac.c鏂囦歡澶栨墍鏈夌殑*.c鏂囦歡娣誨姞鍒伴」鐩腑錛岃緗竴涓嬭緭鍑鴻礬寰勶紝F7緙栬瘧灝卞彲浠ヤ簡銆?br />2,寤虹珛Win32鎺у埗鍙板伐紼?緙栬瘧lua.exe Lua瑙i噴鍣?br />   鎶妉ua.c娣誨姞鍒板伐紼嬩腑錛宭ink閫夐」涓寘鍚繘鍒氭墠緙栬瘧濂界殑lib鏂囦歡錛孎7緙栬瘧
3.鍐嶅緩绔媁in32鎺у埗鍙板伐紼嬶紝 緙栬瘧luac.exe  Lua緙栬瘧鍣?br />   鍚屼笂姝ヤ竴鏍鳳紝緙栬瘧鎴愬姛鍚庣敓鎴恖uac.exe錛?鏈濂芥妸榪欎袱涓枃浠舵斁鍦ㄦ柊寤虹殑bin鏂囦歡涓嬶紝鍦ㄦ坊鍔犺繘緋葷粺鐨勭幆澧冨彉閲忋?nbsp;
 
tolua++鍦╟ygwin涓嬩笉鐢⊿Cons緙栬瘧錛?br />璇﹁http://lua-users.org/wiki/CompilingToluappWithoutScons
src/lib涓嬶細
gcc -shared -o tolua++.dll *.c /usr/local/lib/lua51.dll -I../../include -I/usr/local/include
gcc -c *.c  -I../../include -I/usr/local/include
ar rcsv libtolua++.a *.o
src/bin涓嬶細
gcc tolua.c toluabind.c -I../../include -I/usr/local/include -L /usr/local/lib -llua -L../lib/ -ltolua++
鐒跺悗鎶婃墍寰楀埌鐨勬枃浠跺鍒跺埌緋葷粺鐩稿簲鐩綍涓?/div>
浣跨敤tolua鐢?pkg鐢熸垚.cpp鐨勬椂鍊欙紝鍦ㄧ敓鎴愮殑.cpp鏈鍓嶉潰璁劇疆#define TOLUA_API extern "C" __declspec(dllexport)鍙互浣?dll鏂囦歡瀵煎嚭鏃朵笉鏀瑰彉鏂囦歡鍚嶃傝矊浼艱繕瑕佸姞
#ifndef __cplusplus#define __cplusplus#endif
浣跨敤cygwin浜х敓鐨?dll鏂囦歡涓嶈兘琚玪ua浣跨敤銆傜敤鍚屼竴婧愭枃浠跺湪vc涓嬬敓鎴愮殑.dll鏂囦歡鏄彲浠ヨlua鐢ㄧ殑銆?/div>
浣跨敤VC緙栬瘧tolua鏃訛紝鎶婇櫎浜唗olua.c鍜寈xx.defalt浠ュ鐨?c鍜?h閮藉寘鍚繘鍘伙紝鐒跺悗鍦╰olua++.h閲岃緗?#define TOLUA_API extern "C" __declspec錛屼笉鏂緱淇敼#include "tolua++.h"鍦ㄥ悇涓枃浠朵腑鐨勪綅緗紝浣垮緱鐢╠umpbin鐪嬪埌65涓鍑哄嚱鏁頒負姝€傝矊浼糣C6鐗堟湰澶綆涓嶈兘鎴愬姛璁劇疆棰勭紪璇戝鐞嗛夐」錛屽洜姝よ繖鏍烽夯鐑?鐐廣傜紪璇戞垚鍔熷悗灝辨湁.lib鍜?dll鏂囦歡渚涙帴涓嬫潵鐨?dll宸ョ▼浣跨敤銆?/div>

extern "C" _declspec(dillexport)
extern "C" void DLL_EXPORT __stdcall
 
============
瀹為檯搴旂敤鍦烘櫙緇冧範
============
涓銆佸埄鐢↙ua鐨凾able瀹炵幇綾葷殑澶氱戶鎵匡細
    1銆佸亣璁懼熀綾諱負B1銆丅2
    2銆佺戶鎵跨殑綾諱負A
    3銆佷嬌鐢ㄧ殑鏃跺欑被浼間簬錛?br />            Instance1 = A:new()
            Instance1:Method1(arg1, arg2)
    榪欎釜涓嶉毦錛屼絾鏄姟蹇呰鎺屾彙table鐨勫簲鐢?/div>
絳旀錛氳OO.lua銆傚湪lua瑙f瀽鍣ㄤ笅榪愯錛歞ofile "OO.lua"
 
浜屻佸埄鐢╨ua鐨勬墿灞曞寘luasocket瀹炵幇http鐨勪竴涓簲鐢細
    1銆佹瀯閫爃ttp鍗忚錛岃闂?a style="color: #336699; text-decoration: none;">www.qq.com錛屽叿浣撶殑璁塊棶鏂瑰紡緗戜笂鏈変緥瀛愩?br />    2銆佸湪榪斿洖鏉ョ殑http鍖呬腑錛屽彇鍑鴻吘璁叕鍙哥殑瀹㈡湇鐢佃瘽鍙風爜 -- 闇瑕佷嬌鐢ㄥ埌l(fā)ua鐨勫瓧絎︿覆鏌ユ壘鍜屾ā寮忓尮閰嶅嚱鏁般?/div>
絳旀錛?br />涓嬭澆lua5.1win32鐨勮В鏋愬櫒鍜宭uasocketwin32鎵╁睍鍖咃紝姝g‘璁劇疆LUA_PATH=< LDIR>/?.lua;?.lua鍜孡UA_CPATH=<CDIR>/?.dll;?.dll錛?lt;CDIR>鎸囧悜 luasocket-2.0.1-lua5.1-win32/lib錛?lt;LDIR>鎸囧悜luasocket-2.0.1-lua5.1- win32/lua銆俵ua紼嬪簭瑙丳hone.lua銆傚湪lua瑙f瀽鍣ㄤ笅榪愯錛歞ofile "Phone.lua"
----------------------------
http = require("socket.http")
qqweb = http.request("http://www.qq.com")
tel=string.match(qqweb,"鑵捐瀹㈡湇鐢佃瘽錛?%d+%-%d+)")
print("鎮(zhèn)ㄨ鐨勭數璇濆彿鐮佹槸錛?..tel)
-------------------------------

涓夈佸湪Windows涓嬶紝鍒╃敤C++瀹炵幇涓涓熀鏈殑Socket綾誨簱鏉ョ粰Lua浣跨敤錛?br />    1銆佺粨鍚坱olua++榪涜緙栬瘧錛岀敓鎴怢ua鍙互璋冪敤鐨刣ll鏂囦歡錛岃鍙傝冪綉涓婄殑璧勬枡鏉ョ啛鎮(zhèn)塼olua++鐨勪嬌鐢?br />    2銆佸亣璁綿ll鏂囦歡鍚嶄負MySocket.dll錛岀被涓篊MySocket錛屽垯璋冪敤鐨勬椂鍊欑被浼間簬錛?br />        require("MySocket")
        Instance1 = CMySocket:new()
        Instance2 = CMySocket:new()
        Instance1:Listen(9701)
        Instance2:Connect("127.0.0.1",9701)
絳旀錛?br />windows涓嬬紪璇憀ua錛?br />鎶奺tc鐩綍涓嬬殑luavs.bat 鎷峰埌l(fā)ua鐨勮В鍘嬫牴鐩綍涓嬬洿鎺ヨ繍琛? 鐢熸垚鐨?h .dll .lib .exe鏂囦歡閮藉湪src涓嬨?br />鎶婄浉搴旂殑.h鏂囦歡鍜宭ua51.lib鏂囦歡鎷瘋礉鍒癡C鐩稿簲鐩綍涓嬨俵ua.exe鍜宭ua51.dll涓簂ua瑙f瀽鍣ㄣ?br />鍦╟ygwin涓嬬紪璇戝畨瑁呮柟娉曪細$make linux && make install
鐢╟ygwin緙栬瘧瀹夎tolua++錛屼笖涓嶇敤SCons緙栬瘧錛?br />src/lib涓嬶細
鍔ㄦ侀摼鎺ユ枃浠訛細
gcc -shared -o tolua++.dll *.c /usr/local/lib/lua51.dll -I../../include -I/usr/local/include
闈欐佽繛鎺ユ枃浠訛細
gcc -c *.c  -I../../include -I/usr/local/include
ar rcsv libtolua++.a *.o
src/bin涓嬶細
鎵ц鏂囦歡錛屾敼鍚嶄負tolua++.exe錛?br />gcc tolua.c toluabind.c -I../../include -I/usr/local/include -L /usr/local/lib -llua -L../lib/ -ltolua++
鐒跺悗鎶婃墍寰楀埌鐨勬枃浠跺鍒跺埌緋葷粺鐩稿簲鐩綍涓?/div>
鏍規(guī)嵁mysocket.h璁捐mysocket綾繪ā寮忥紝鍐欐垚.pkg鏂囦歡銆?/div>
浜х敓binding鏂囦歡mypkg.cpp澶囩敤錛屾鏃惰鐢ㄥ埌mysocket.h錛歵olua++ -o mypkg.cpp mysocket.pkg
閫傚綋淇敼涓涓嬬敓鎴愮殑mypkg.cpp鏂囦歡錛屼嬌浠ュ悗瀵煎嚭鐨?dll鏂囦歡鍑芥暟鍚嶄笉鍙樸?br />#define TOLUA_API extern "C" __declspec
鐢ㄤ互涓嬫柟娉曞湪cygwin涓嬬紪璇戠殑.dll鏂囦歡涓嶈兘琚玪ua浣跨敤錛屽姞杞藉寘浼氬け璐ャ?br />g++ -shared -o MySocket.dll *.cpp  /usr/local/lib/lua51.dll -I/usr/local/include -I.. -L /usr/local/lib -ltolua++
鏀圭敤VC鏉ョ紪璇戙傚厛緙栬瘧tolua++銆?br />鎶妔rc涓嬮櫎浜唗olua.c鍜宼oluabind_default.x浠ュ鐨?c鍜?h閮藉寘 鍚繘鍘匯傚伐紼嬭緗噷瑕佸寘鍚獿IBC.lib Libcmtd.lib tolua.lib lua5.1.lib錛宨nclude鍜宭ib璺緞涔熻鍖呭惈lua鐨勩傜劧鍚庤緗?define TOLUA_API extern "C" __declspec緙栬瘧鎴愬姛鍚庡氨鏈塼olua.lib鍜宼olua.dll鏂囦歡渚涙帴涓嬫潵鐨?dll宸ョ▼浣跨敤銆?/div>
鎶奲ingding鏂囦歡mypkg.cpp鍜屽啓濂界殑mysocket.cpp錛宮ysocket.h涓璧峰湪VC涓嬬紪璇戠敓鎴?dll鏂囦歡銆傚伐紼嬭 緗噷瑕佸寘鍚獿IBC.lib Libcmtd.lib tolua.lib lua51.lib錛宨nclude鍜宭ib璺緞涔熻鍖呭惈lua鎴杢olua鐨勩傚墠闈袱涓枃浠墮『搴忎竴瀹氫笉瑕佸啓閿欙紝鍚﹀垯浜х敓濡備笅閿欒錛?br />Linking...
LIBC.lib(crt0dat.obj) : error LNK2005: __cinit already defined in LIBCMTD.lib(crt0dat.obj)
緙栬瘧浜х敓鐨凪ySocket.dll鏂囦歡灝卞彲浠ヨlua璋冪敤浜嗐?br />榪愯涓涓猯ua瑙f瀽鍣ㄧ▼搴忓疄渚嬶紝鎵ц錛?br />require("MySocket")
Instance1 = CMySocket:new()
Instance1:Listen(9701)
鍐嶈繍琛屽彟涓涓猯ua瑙f瀽鍣ㄧ▼搴忓疄渚嬶紝鎵ц錛?br />require("MySocket")
Instance2 = CMySocket:new()
Instance2:Connect("127.0.0.1",9701)


]]>鍒╃敤c++涓巗wig+luahttp://www.shnenglu.com/API/archive/2014/04/24/206699.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Thu, 24 Apr 2014 08:12:00 GMThttp://www.shnenglu.com/API/archive/2014/04/24/206699.htmlhttp://www.shnenglu.com/API/comments/206699.htmlhttp://www.shnenglu.com/API/archive/2014/04/24/206699.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/206699.htmlhttp://www.shnenglu.com/API/services/trackbacks/206699.htmlswigwin-2.0.9.zip錛屽畼緗戝湴鍧http://www.swig.org/ 杞借В鍘嬪悗錛岀洰褰曚笅鏈塻wig.exe紼嬪簭
2. 鍦╒S涓柊寤哄伐紼婽estLua
3.娣誨姞hello.h浠g爜濡備笅錛?br />
#ifndef HELLO_H__
#define HELLO_H__

int sum( int a, int b );
class Test
{
public:
    int a;
    int b;
    Test();
    void print();
};

#endif/*HELLO_H__*/

4.娣誨姞hello.cpp浠g爜濡備笅錛?br />
#include "stdafx.h"
#include "hello.h"

int sum( int a, int b )
{
    return (a + b);
}
Test::Test()
{
    a = 10;
    b = 20;
}
void Test::print()
{
    printf( "%d %d\n", a, b );
}

5.緙栧啓modulehello.i鏂囦歡,鍐呭濡備笅錛?br />
%module hello
%{
#include "hello.h"
%}
%include "hello.h"

6.浣跨敤浠ヤ笅鍛戒護鐢熸垚鏂囦歡
swig.exe -c++ -lua c:\modulehello.i
浜庢槸鐢熸垚錛?span style="font-size: 14px;">modulehello_wrap.cxx鏂囦歡

7.鍦ㄥ伐紼嬪寘鍚?br />
C:\Program Files (x86)\Lua\5.1\include
絎﹀姞搴撶洰褰?span style="font-size: 14px;">"C:\Program Files (x86)\Lua\5.1\lib"
騫朵笖瀵煎叆搴?/span>lua51.lib

8.鍦ㄥ伐紼嬫枃浠禩estLua.cpp浠g爜濡備笅錛?br />
#include "stdafx.h"
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};
#include "modulehello_wrap.cxx"
extern "C"
{
    extern int luaopen_hello(lua_State* L); // declare the wrapped module
};
int _tmain(int argc, _TCHAR* argv[])
{
    lua_State *L;
    L=lua_open();
    luaopen_base(L);    // load basic libs (eg. print)
    luaopen_hello(L);    // load the wrappered module
    if (luaL_loadfile(L,"./hello.lua")==0) // load and run the file
        lua_pcall(L,0,0,0);
    else
        printf("unable to load %s\n","hello.lua");
    lua_close(L);

    return 0;
}

9.緙栧啓lua鑴氭湰hello.lua濡備笅錛?br />
print( "嫻嬭瘯鑴氭湰鏄惁琚皟鐢? );
print( "hello" );
print( "hello, tpf" );
print( "鐪嬪埌hello鐨勫瓧鏍?琛ㄧず鑴氭湰琚皟鐢? );

print( "-----------------------------" );

print( "涓嬮潰嫻嬭瘯鍑芥暟" );
print( hello.sum( 1, 2 ) );
print( "鐪嬪埌鏁板瓧琛ㄧず鍑芥暟姝e父琚皟鐢? );

print( "-----------------------------" );

print( "涓嬮潰嫻嬭瘯綾昏皟鐢? );
a = hello.Test();

print( "-----------------------------" );
print( "鎴愬憳鍙橀噺>>>", a.a );
print( "鎴愬憳鍙橀噺>>>", a.b );

print( "涓嬮潰嫻嬭瘯鎴愬憳鍑芥暟" );
a:print();
print( "鐪嬪埌鏁板瓧琛ㄧず鎴愬憳鍑芥暟琚甯歌皟鐢? );

10.寰楀嚭緇撴灉濡備笅錛?br />
嫻嬭瘯鑴氭湰鏄惁琚皟鐢?/div>
hello
hello, tpf
鐪嬪埌hello鐨勫瓧鏍?琛ㄧず鑴氭湰琚皟鐢?/div>
-----------------------------
涓嬮潰嫻嬭瘯鍑芥暟
3
鐪嬪埌鏁板瓧琛ㄧず鍑芥暟姝e父琚皟鐢?/div>
-----------------------------
涓嬮潰嫻嬭瘯綾昏皟鐢?/div>
-----------------------------
鎴愬憳鍙橀噺>>>     10
鎴愬憳鍙橀噺>>>     20
涓嬮潰嫻嬭瘯鎴愬憳鍑芥暟
10 20
鐪嬪埌鏁板瓧琛ㄧず鎴愬憳鍑芥暟琚甯歌皟鐢?/div>

]]>c++澶氱嚎紼嬭皟鐢╬ythonhttp://www.shnenglu.com/API/archive/2013/12/06/204618.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Fri, 06 Dec 2013 02:34:00 GMThttp://www.shnenglu.com/API/archive/2013/12/06/204618.htmlhttp://www.shnenglu.com/API/comments/204618.htmlhttp://www.shnenglu.com/API/archive/2013/12/06/204618.html#Feedback2http://www.shnenglu.com/API/comments/commentRss/204618.htmlhttp://www.shnenglu.com/API/services/trackbacks/204618.html闃呰鍏ㄦ枃

]]>
c++璋冪敤python鍑芥暟http://www.shnenglu.com/API/archive/2013/12/06/204616.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Fri, 06 Dec 2013 02:02:00 GMThttp://www.shnenglu.com/API/archive/2013/12/06/204616.htmlhttp://www.shnenglu.com/API/comments/204616.htmlhttp://www.shnenglu.com/API/archive/2013/12/06/204616.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/204616.htmlhttp://www.shnenglu.com/API/services/trackbacks/204616.html1.褰撳彇澶氫釜榪斿洖鍊兼椂,濡備笅錛?br />
def mix(a, b) :  
    r1 
= a + b  
    r2 
= a - b  
    
return (r1, r2) # (7,3)

c++浠g爜濡備笅錛?br />
#include "python.h"
int _tmain(int argc, _TCHAR* argv[])
{
string filename = "cal"; // cal.py
string methodname_mix = "mix"; // function name

Py_Initialize();

// load the module
PyObject * pyFileName = PyString_FromString(filename.c_str());
PyObject
* pyMod = PyImport_Import(pyFileName);

// load the function
PyObject * pyFunc_mix = PyObject_GetAttrString(pyMod, methodname_mix.c_str());

// test the function is callable
if (pyFunc_mix && PyCallable_Check(pyFunc_mix))
{
PyObject
* pyParams = PyTuple_New(2);
PyTuple_SetItem(pyParams,
0, Py_BuildValue("i", 5));
PyTuple_SetItem(pyParams,
1, Py_BuildValue("i", 2));

// ok, call the function
int r1 = 0, r2 = 0;
PyObject
* pyValue = PyObject_CallObject(pyFunc_mix, pyParams);
PyArg_ParseTuple(pyValue,
"i|i", &r1, &r2);
if (pyValue)
{
printf(
"%d,%d\n", r1, r2); //output is 7,3
}

}

 
Py_Finalize();

return 0;
}

2.濡傛灉榪斿洖涓涓兼椂錛?br />
import string

def AddMult(a, b):
c
= a + b
print c
return c


c++浠g爜濡備笅錛?nbsp;
PyObject* pModule =NULL;
PyObject
* pFunc = NULL;
PyObject
* pArgs = NULL;
PyObject
* pRet = NULL;

Py_Initialize();

PyRun_SimpleString(
"import sys");
PyRun_SimpleString(
"sys.path.append('./')");

pModule
= PyImport_ImportModule("httpsend");
pFunc
= PyObject_GetAttrString(pModule, "AddMult");

//pArgs = Py_BuildValue("s, s", "This is ", "a python code");

pArgs
= Py_BuildValue("ii", 12,34);

pRet
= PyObject_CallObject(pFunc,pArgs);
int pyResult=0,pyResult2 = 0;
char *str;
int argRet = PyArg_Parse(pRet,"i", &pyResult);
if (argRet)
{
printf(
"yes!\n");
}

else
{
//閿欒
printf("error!\n");
}


if(pModule)
Py_DECREF(pModule);
if(pFunc)
Py_DECREF(pFunc);
if(pArgs)
Py_DECREF(pArgs);
if(pRet)
Py_DECREF(pRet);


//PyGILState_Ensure();
Py_Finalize();




]]>python 鍙戦乭ttp post璇鋒眰http://www.shnenglu.com/API/archive/2013/12/03/204566.htmlC++鎶鏈腑蹇?/dc:creator>C++鎶鏈腑蹇?/author>Tue, 03 Dec 2013 06:08:00 GMThttp://www.shnenglu.com/API/archive/2013/12/03/204566.htmlhttp://www.shnenglu.com/API/comments/204566.htmlhttp://www.shnenglu.com/API/archive/2013/12/03/204566.html#Feedback0http://www.shnenglu.com/API/comments/commentRss/204566.htmlhttp://www.shnenglu.com/API/services/trackbacks/204566.html1.鏂板緩http.py濡備笅錛?
import urllib
import urllib2
url 
= 'http://push.hao123.com/apis/test_send_msg.php'
values 
= {'g_id':'1027019902',
          
'm_time_to_send':'1386049369',
          
'm_display':'1',
          
'm_push_type':'2'
          ,
'm_by_timezone':'0'
          ,
'm_msg':'涓崕浜烘皯鍏卞拰鍥戒竾宀?/span>'
          ,
'mt_id':'0',
          
'm_iggid_file':'33600458'
         }
data 
= urllib.urlencode(values)
print data
req 
= urllib2.Request(url, data)
response 
= urllib2.urlopen(req)
the_page 
= response.read()
print the_page

娉ㄦ剰浠ヤ笅鍖呭惈涓枃錛岄渶鎶婃枃浠跺彟瀛樹負utf-8鏍煎紡銆?br />鐒跺悗鎵ц錛歱ython http.py


]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美一区二区大片| 久久影视三级福利片| 亚洲午夜性刺激影院| 一本色道久久88精品综合| 一本色道久久综合亚洲精品按摩| 亚洲精品自在久久| 一本久久精品一区二区| 亚洲一区二区精品在线| 亚洲欧美在线观看| 久久精品亚洲乱码伦伦中文| 久久天堂av综合合色| 免播放器亚洲| 亚洲第一毛片| 亚洲美女毛片| 亚洲图片你懂的| 性欧美办公室18xxxxhd| 久久久久一区二区三区四区| 欧美成人一品| 国产精品久久久久久久久久免费 | 欧美专区福利在线| 久久久久久精| 亚洲国产激情| 亚洲视屏在线播放| 欧美自拍偷拍| 欧美精品一线| 国产欧美精品久久| 亚洲国产经典视频| 亚洲视频一区二区在线观看| 久久国产精品久久精品国产| 久久综合99re88久久爱| 亚洲精品一区二区三| 午夜国产精品视频| 老司机午夜精品视频在线观看| 欧美精品粉嫩高潮一区二区| 国产麻豆91精品| 亚洲二区在线| 亚洲欧美日韩网| 免费观看久久久4p| 亚洲视频第一页| 久久夜色精品亚洲噜噜国产mv | 亚洲第一色在线| 亚洲色诱最新| 六十路精品视频| 国产精品视频免费观看| 亚洲国产毛片完整版 | 亚洲永久在线观看| 久色婷婷小香蕉久久| 国产精品成av人在线视午夜片| 激情久久影院| 亚洲欧美另类中文字幕| 你懂的亚洲视频| 亚洲宅男天堂在线观看无病毒| 久久午夜激情| 国产欧美一区二区白浆黑人| 日韩视频二区| 久热精品视频在线观看| 在线中文字幕不卡| 蜜臀av一级做a爰片久久| 国产精品午夜国产小视频| 亚洲日本在线视频观看| 久久久国产精品亚洲一区| 亚洲精品影视| 麻豆免费精品视频| 国产在线高清精品| 国产精品99久久久久久久vr | 欧美日韩亚洲91| 亚洲高清资源综合久久精品| 欧美一区二区三区在线免费观看 | 免费成人黄色片| 午夜免费日韩视频| 国产精品国产自产拍高清av王其| 亚洲精品欧美| 牛牛影视久久网| 久久精品国产免费| 国产热re99久久6国产精品| 亚洲一级二级| 亚洲精品影视在线观看| 欧美chengren| 亚洲黄一区二区三区| 久久久久久久网站| 新67194成人永久网站| 国产精品久久91| 亚洲一级电影| 夜夜爽av福利精品导航| 欧美日韩免费精品| 99精品福利视频| 亚洲国产精品成人精品| 久久这里只精品最新地址| 狠狠88综合久久久久综合网| 欧美在线播放高清精品| 亚洲欧美日韩在线高清直播| 国产精品男女猛烈高潮激情 | 欧美一区二区三区免费看| 国产精品一区二区a| 午夜视频精品| 亚洲一区二区三区四区在线观看 | 亚洲丰满在线| 欧美激情一区二区| 欧美成人午夜激情| 亚洲美女少妇无套啪啪呻吟| 亚洲电影在线观看| 欧美精品入口| 亚洲一区二区三区精品视频| 一区二区三区成人| 国产精品日韩在线| 欧美在线观看www| 久久福利精品| 亚洲国产成人在线视频| 亚洲第一狼人社区| 欧美理论电影在线播放| 亚洲一区二区免费视频| 亚洲综合精品一区二区| 国产午夜亚洲精品羞羞网站| 久久手机精品视频| 欧美xart系列在线观看| 一区二区三区黄色| 亚洲一区二区三区影院| 国内成+人亚洲| 欧美夫妇交换俱乐部在线观看| 欧美精品一区二| 午夜亚洲性色视频| 久久国产精品99久久久久久老狼| 在线免费高清一区二区三区| 91久久国产综合久久蜜月精品| 欧美日韩日本网| 欧美一区二区三区婷婷月色 | 99成人在线| 亚洲一区在线播放| 一区视频在线看| 亚洲人人精品| 国产欧美一级| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美不卡高清| 欧美日本国产精品| 久久爱www久久做| 免费久久99精品国产| 亚洲一区二区三区免费视频| 久久精品国产91精品亚洲| 99视频热这里只有精品免费| 亚洲综合精品自拍| 亚洲国产日韩欧美在线图片 | 亚洲国产欧美久久| 国产精品一区二区在线| 欧美护士18xxxxhd| 国产精品久久久久影院色老大| 免费影视亚洲| 国产精品久久综合| 欧美承认网站| 国产欧美日韩激情| 亚洲全部视频| 国内精品久久久久影院色| 亚洲精品久久久久久下一站| 国产一区二区三区不卡在线观看| 亚洲欧洲日产国产综合网| 国产一区日韩一区| 99精品免费| 亚洲国产精品www| 亚洲欧美日本精品| av成人老司机| 老司机67194精品线观看| 午夜在线播放视频欧美| 欧美精品一区二区三区蜜臀| 开心色5月久久精品| 国产精品毛片| 亚洲靠逼com| 91久久在线| 久久久av毛片精品| 性亚洲最疯狂xxxx高清| 欧美啪啪一区| 欧美激情一区二区三区全黄| 国产一区二区日韩| 中文在线不卡| 在线视频精品| 欧美精品观看| 亚洲国产精品成人综合色在线婷婷| 国产一区二区久久| 亚洲女性裸体视频| 亚洲尤物在线视频观看| 欧美激情精品久久久久久变态| 久久综合九色综合久99| 国产视频一区二区三区在线观看| 一区二区日韩免费看| 日韩午夜免费| 欧美激情国产精品| 亚洲春色另类小说| 亚洲电影在线看| 久久久久久夜| 久久亚洲私人国产精品va| 国产日韩欧美中文在线播放| 亚洲午夜国产一区99re久久| 亚洲一区二区三区在线看| 欧美日韩免费在线| 亚洲乱码国产乱码精品精天堂 | 久久青草福利网站| 久久亚洲欧美| 亚洲第一页在线| 老巨人导航500精品| 欧美xart系列高清| 亚洲国产精品999| 欧美成人在线免费视频|