大多數的通訊架構只保證裏基本數據的傳輸,在你們編寫的過程當中還要本身本身編碼或解碼等內容。而後把數據用一大推的判斷來分割起來,保證運行到想要的代碼段。那麼使用weaving-socket架構的朋友們,大家有福了,如今你只須要定義好方法名稱增長一個修飾就能夠直接像調用方法相似的手段運行到你只定的方法中。這很簡單愉快。git
首先把項目下載下來: http://git.oschina.net/dreamsfly900/universal-Data-Communication-System-for-windowswindows
還有一個同胞項目服務器
.NET Core的weaving-socket項目架構
http://git.oschina.net/dreamsfly900/weaving-socket-core socket
第一步服務端編寫:ide
新版本更新後MyInterface 變動命名WeaveBase。TCPCommand變動命名,WeaveTCPCommand請務必注意。this
首先咱們須要新建一個類庫項目,注意是類庫。起個名字content_manage,而後引用項目 MyInterface。編碼
將你新建的類,繼承MyInterface.TCPCommand ,實現MyInterface.TCPCommand中的必需要實現的方法。spa
public class content_manage : MyInterface.TCPCommand { public override void Bm_errorMessageEvent(Socket soc, _baseModel _0x01, string message) { //錯誤異常事件,message爲錯誤信息,soc爲產生異常的鏈接 } public override byte Getcommand() { //此CLASS的實例,表明的指令,指令從0-254,0x9c與0xff爲內部指令不能使用。 //0x01的意思是,只要是0x01的指令,都會進入本實例進行處理 return 0x01; } public override bool Run(string data, Socket soc) { //此事件是接收事件,data 是String類型的數據,soc是發送人。 return true; } public override void TCPCommand_EventDeleteConnSoc(Socket soc) { //此事件是當有人中斷了鏈接,此事件會被調用 } public override void TCPCommand_EventUpdataConnSoc(Socket soc) { //此事件是當有人新加入了鏈接,此事件會被調用 } }
裏面有一個 public override bool Run(string data, Socket soc)的接收事件,發送的數據都會通過這裏方法。題目說了,要本身能夠定義方法的,那要怎麼辦呢?.net
好比我想在客戶端看到當前有多少人在線。那麼咱們通常定義一個方法名:getnum。
那麼在這裏怎麼辦呢?看代碼
[InstallFun("forever")] public void getnum(Socket soc, _baseModel _0x01) { int num = 9987;//假設我人數爲9987 SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token); //發送人數給客戶端 //參數1,發送給客戶端對象,參數2,發送給客戶端對應的方法,參數3,人數的實例,參數4,此處無做用,參數5,客戶端這次token }
只須要這樣定義就能夠了,[InstallFun("forever")] 表明了,此方法永久有效。
固然還有對應的 [InstallFun("once")]表明了,此方法只能被調用一次,馬上銷燬。
public void getnum(Socket soc, _baseModel _0x01),方法名能夠隨意更改,參數和返回值爲固定的。
那麼咱們怎麼告訴客戶端咱們有多少人呢?
SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token);就是這個方法了。
參數1,發送給客戶端對象,參數2,發送給客戶端對應的方法,參數3,人數的實例,參數4,此處無做用,參數5,客戶端這次token
這樣就完成了。完整代碼:
public class content_manage : MyInterface.TCPCommand { public override void Bm_errorMessageEvent(Socket soc, _baseModel _0x01, string message) { } [InstallFun("forever")] public void getnum(Socket soc, _baseModel _0x01) { int num = 9987; SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token); } public override byte Getcommand() { return 0x01; } public override bool Run(string data, Socket soc) { return true; } public override void TCPCommand_EventDeleteConnSoc(Socket soc) { } public override void TCPCommand_EventUpdataConnSoc(Socket soc) { } }
而後對着你的項目右鍵-》屬性-》生成事件-》後期生成事件命令行
填寫copy $(TargetFileName) $(SolutionDir)\智信構建結構\bin\Debug\command
而後編譯此代碼,後會生成content_manage.dll的文件會自動進入
架構中通訊服務端運行器項目的 command 目錄中,能夠先生成一邊通訊服務端運行器項目,
在Debug目錄中看一看有沒有command 目錄,沒有的話,手動建一個。
而後運行 通訊服務端運行器項目 ,
選擇TCPSOKET,填寫好端口號,點擊添加監聽,而後點擊加載服務器插件,就開始運行了。
第二步客戶端:
新建一個winform項目,引用MyInterface與TCPclient項目。
在界面上加一個按鈕:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } P2Pclient p2pc = new P2Pclient(false);//初始化 private void Form1_Load(object sender, EventArgs e) { p2pc.receiveServerEvent += P2pc_receiveServerEvent;//接收數據事件 p2pc.timeoutevent += P2pc_timeoutevent;//超時(掉線)事件 p2pc.start("127.0.0.1", 8989, false);//11002 是網關的端口號,剛纔WEB網關佔用了11001,我改爲11002了 p2pc.AddListenClass(this);//這是表示 [InstallFun("forever")]的方法,在哪一個類中,所有加載出來。 } [InstallFun("forever")]//客戶端也支持像服務端那樣寫,剛纔看懂返回的內容也是getnum,因此客戶端也要把方法命名getnum public void getnum(System.Net.Sockets.Socket soc, _baseModel _0x01)//服務端返回內容調用的方法getnum,因此命名爲getnum。 { MessageBox.Show(_0x01.GetRoot<int>().ToString());//彈出返回值 } private void P2pc_timeoutevent() { if (!p2pc.Isline) { p2pc.Restart(true);//斷線重連 } } private void P2pc_receiveServerEvent(byte command, string text) { } private void button1_Click(object sender, EventArgs e) { //在加個發送 p2pc.Tokan = "隨便寫一個"; p2pc.SendRoot<int>(0x01, "getnum", 0,0);//調用服務端方法getnum,是服務端的方法。 //這樣就能夠了,咱們試試 } }
寫代碼