大多數(shù)的通信架構(gòu)只保證里基本數(shù)據(jù)的傳輸,在大家編寫的過程中還要自己自己編碼或解碼等內(nèi)容。然后把數(shù)據(jù)用一大推的判斷來分割起來,保證運(yùn)行到想要的代碼段。那么使用weaving-socket架構(gòu)的朋友們,你們有福了,現(xiàn)在你只需要定義好方法名稱增加一個(gè)修飾就可以直接像調(diào)用方法類似的手段運(yùn)行到你只定的方法中。這很簡單愉快。
首先把項(xiàng)目下載下來: http://git.oschina.net/dreamsfly900/universal-Data-Communication-System-for-windows
還有一個(gè)同胞項(xiàng)目
.NET Core的weaving-socket項(xiàng)目
http://git.oschina.net/dreamsfly900/weaving-socket-core
第一步服務(wù)端編寫:
新版本更新后MyInterface 變更命名WeaveBase。TCPCommand變更命名,WeaveTCPCommand請務(wù)必注意。
首先我們需要新建一個(gè)類庫項(xiàng)目,注意是類庫。起個(gè)名字content_manage,然后引用項(xiàng)目 MyInterface。
將你新建的類,繼承MyInterface.TCPCommand ,實(shí)現(xiàn)MyInterface.TCPCommand中的必須要實(shí)現(xiàn)的方法。
public class content_manage : MyInterface.TCPCommand { public override void Bm_errorMessageEvent(Socket soc, _baseModel _0x01, string message) { //錯(cuò)誤異常事件,message為錯(cuò)誤信息,soc為產(chǎn)生異常的連接 }
public override byte Getcommand() { //此CLASS的實(shí)例,代表的指令,指令從0-254,0x9c與0xff為內(nèi)部指令不能使用。 //0x01的意思是,只要是0x01的指令,都會(huì)進(jìn)入本實(shí)例進(jìn)行處理 return 0x01; }
public override bool Run(string data, Socket soc) { //此事件是接收事件,data 是String類型的數(shù)據(jù),soc是發(fā)送人。 return true; }
public override void TCPCommand_EventDeleteConnSoc(Socket soc) { //此事件是當(dāng)有人中斷了連接,此事件會(huì)被調(diào)用 }
public override void TCPCommand_EventUpdataConnSoc(Socket soc) { //此事件是當(dāng)有人新加入了連接,此事件會(huì)被調(diào)用 } } 里面有一個(gè) public override bool Run(string data, Socket soc)的接收事件,發(fā)送的數(shù)據(jù)都會(huì)經(jīng)過這里方法。題目說了,要自己可以定義方法的,那要怎么辦呢?
比如我想在客戶端看到當(dāng)前有多少人在線。那么我們一般定義一個(gè)方法名:getnum。
那么在這里怎么辦呢?看代碼
[InstallFun("forever")] public void getnum(Socket soc, _baseModel _0x01) { int num = 9987;//假設(shè)我人數(shù)為9987 SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token); //發(fā)送人數(shù)給客戶端 //參數(shù)1,發(fā)送給客戶端對象,參數(shù)2,發(fā)送給客戶端對應(yīng)的方法,參數(shù)3,人數(shù)的實(shí)例,參數(shù)4,此處無作用,參數(shù)5,客戶端此次token } 只需要這樣定義就可以了,[InstallFun("forever")] 代表了,此方法永久有效。
當(dāng)然還有對應(yīng)的 [InstallFun("once")]代表了,此方法只能被調(diào)用一次,立刻銷毀。
public void getnum(Socket soc, _baseModel _0x01),方法名可以隨意更改,參數(shù)和返回值為固定的。
那么我們怎么告訴客戶端我們有多少人呢?
SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token);就是這個(gè)方法了。
參數(shù)1,發(fā)送給客戶端對象,參數(shù)2,發(fā)送給客戶端對應(yīng)的方法,參數(shù)3,人數(shù)的實(shí)例,參數(shù)4,此處無作用,參數(shù)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) {
}
}
然后對著你的項(xiàng)目右鍵-》屬性-》生成事件-》后期生成事件命令行
填寫copy $(TargetFileName) $(SolutionDir)\智信構(gòu)建結(jié)構(gòu)\bin\Debug\command
然后編譯此代碼,后會(huì)生成content_manage.dll的文件會(huì)自動(dòng)進(jìn)入
架構(gòu)中通信服務(wù)端運(yùn)行器項(xiàng)目的 command 目錄中,可以先生成一邊通信服務(wù)端運(yùn)行器項(xiàng)目,
在Debug目錄中看一看有沒有command 目錄,沒有的話,手動(dòng)建一個(gè)。
然后運(yùn)行 通信服務(wù)端運(yùn)行器項(xiàng)目 ,
選擇TCPSOKET,填寫好端口號,點(diǎn)擊添加監(jiān)聽,然后點(diǎn)擊加載服務(wù)器插件,就開始運(yùn)行了。
第二步客戶端:
新建一個(gè)winform項(xiàng)目,引用MyInterface與TCPclient項(xiàng)目。
在界面上加一個(gè)按鈕:
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;//接收數(shù)據(jù)事件 p2pc.timeoutevent += P2pc_timeoutevent;//超時(shí)(掉線)事件 p2pc.start("127.0.0.1", 8989, false);//11002 是網(wǎng)關(guān)的端口號,剛才WEB網(wǎng)關(guān)占用了11001,我改成11002了 p2pc.AddListenClass(this);//這是表示 [InstallFun("forever")]的方法,在哪個(gè)類中,全部加載出來。
}
[InstallFun("forever")]//客戶端也支持像服務(wù)端那樣寫,剛才看懂返回的內(nèi)容也是getnum,所以客戶端也要把方法命名getnum
public void getnum(System.Net.Sockets.Socket soc, _baseModel _0x01)//服務(wù)端返回內(nèi)容調(diào)用的方法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)
{
//在加個(gè)發(fā)送
p2pc.Tokan = "隨便寫一個(gè)";
p2pc.SendRoot<int>(0x01, "getnum", 0,0);//調(diào)用服務(wù)端方法getnum,是服務(wù)端的方法。
//這樣就可以了,我們試試
}
}
寫代碼
更多建議: