天天看點

.net DataExcel通信元件使用 搭建簡單檔案伺服器

.net dataexcel通信元件使用 搭建簡單檔案伺服器

使用.net dataexcel通信搭建一個簡單的檔案伺服器。

通信簡單介紹

1,通信使用tcp協定。

2,采用session機制,控制簡單通信安全與連接配接限制防攻擊。

3,采用開放協定包格。(32位元組資料包)

4,采用網絡斷開,自動連接配接機制保證連接配接。

5,采用壓縮機械壓縮大資料(比如.net 裡面datatable,dataset的傳輸)。

6,采用事件機制,更容易,更符合.net開發習慣。

7,采用異步傳輸,較大的連接配接與并發。

8,采用資料標頭,解決粘包。

9,采用指令方式,更容易擴充。

10,采用允許事件加密,解密保證通信資料絕對安全。(隻針對通信)。

11,允許可擴充通信,保證程式各版通信的版本管理。

12,采用無符号以及unicode編碼,保證各平台的相容性。(此通信的java版本)

主要類及使用方法介紹:

伺服器端

伺服器端 使用  socketlistener 類進行監聽。

socketlistener listener = new socketlistener();

       private void btnstart_click(object sender, eventargs e)

        {

            //this.listener.dbhelper.connectionstring = frm.txtdatabase.text;

            listener.port = int.parse(this.txtport.text);                                                                                                                                            //這個是必須的,設定監聽的端口

            //listener.beforedatareceive += new socketlistener.beforedatareceiveeventhandler(listener_beforedatareceive);

            listener.datareceive += new socketlistener.datareceiveeventhandler(server_datareceive);                                          //這個是必須的,用于接收自定義的指令。

            //listener.clientchanged += new clientchangedhandler(listener_clientchanged);

            listener.regeditsession += new feng.net.tcp.socketlistener.regeditsessioneventhandler(listener_regeditsession);  //這個是必須的,注冊session事件,指定連接配接是被允許。

            //listener.loged += new socketlistener.logeventhandler(listener_loged);                                                                              

            //listener.connectioned += new socketlistener.connectedeventhandler(listener_connectioned);

            //listener.versionchecked += new socketlistener.versioncheckedeventhandler(listener_versionchecked);

            listener.path = this.txtpath.text;                                                                                                                                                               //這個不是必須的,設定伺服器檔案路徑,用于做檔案服務根目錄。

            listener.startlistening();                                                                                                                                                                            //這個是必須的,開啟監聽。

        }

        void listener_regeditsession(object sender, regeditsessioneventargs e)

            if (e.password == "1001" && e.user == "1001") //可以在這裡用資料庫對比。

            {

                e.session = new random(datetime.now.millisecond).next(100, short.maxvalue - 10); //傳回随意一個session。

                return;

            }

用戶端

用戶端 使用socketclient類

        private static socketclient _client = null;

        public static socketclient client

            get

                if (_client == null)

                {

                    _client = new socketclient();

                    _client.port = port;                                                              //這個是必須的設定遠端服務監聽的端口。

                    //_client.host = "yufb12.eicp.net";//花生殼

                    _client.ipadress = system.net.ipaddress.parse(ip); //這個是必須的設定遠端伺服器的ip。

                    _client.startclient();

                }

                return _client;

注意:如果這樣使用,因為是屬性,是以第一次調連接配接可能沒有完成,是以你需要提示調用一次這個靜态屬性。

winform視窗類注冊用戶端的連接配接事件。在連接配接事件注冊session。

        client.connected += new socketclient.connectedeventhandler(client_connected);  //這裡是必須的。

        void client_connected(object sender, socketclient sh)                                                     //這裡是必須的。

            sh.regeditsession("1001", "1001");                                                                                  //使用者名與密碼,配合伺服器資料庫使用。保證連接配接是有效且被允許的。

檔案伺服器所使用的内置函數

string[] paths = client.getpaths(path);                               //傳回伺服器路徑中的所有檔案夾。

string[] files = client.getfiles(path);                                   //傳回伺服器路徑中的所有檔案。

tcpfileinfo fti = client.getfileinfo(file);                              //傳回伺服器路檔案的檔案屬性。

byte[] data = client.downfile(path);                                   //下載下傳伺服器路檔案資料流。

client.sendfiletoserver(path, dlg.filename);                //上傳檔案到伺服器目錄。

下面是自定義指令示例:

用戶端發送自定包示例:

        public const int yourprojectname= 0x0251;

        public const int yourprojectname _sqlitequery0 = 0x0234;

        private void querysqlite(string sql)

            feng.net.packethelper ph = new feng.net.packethelper();

            ph.packetmaincommand = yourprojectname;

            ph.packetsubcommand = yourprojectname_sqlitequery0  ;

            using (feng.io.bufferwriter bw = new feng.io.bufferwriter())

                bw.write(sql);

                bw.write(new byte[]{});

                ph.packetcontents = bw.getdata();

            byte [] data=new byte [0];

            if (client.send(ph, out data))

                ph = feng.net.packethelper.get(data);

                 using (feng.io.bufferreader reader = new feng.io.bufferreader(ph.packetcontents))

                    datatable table = reader.readdatatable();

類packethelper  為開放資料包。

   ph.packetmaincommand = yourprojectname; //packetmaincommand 為主指令,一般為你的項目名稱。

   ph.packetsubcommand = sqlitequery;                //sqlitequery              為子指令,定義具體函數操作。

   bufferwriter 類 為轉化為二進制資料流。

     bw.write(sql);               //write有40多個函數的重載。此處為要送的sql語句。

     bw.write(new byte[]{}); //此處保證資料向下個版本的相容性。

   ph.packetcontents = bw.getdata();                             //packetcontents            這裡為要發送的内容。bw.getdata()擷取二進制數組。

   if (client.send(ph, out data))                                          //這裡為阻塞發送,将阻塞目前線程。符合windows開發人員的習慣。超過逾時時間傳回false.

   ph = feng.net.packethelper.get(data);                      //通過傳回二制流,反回資料包。 packethelper.get 這個靜态函數為得到一個執行個體。

   bufferreader 類 為從二進制轉化某類對象                                                   

   datatable table = reader.readdatatable();             //讀取傳回的datatable對象。                                  

伺服器端示例:

        public const int sqlitequery = 0x0251;

        public const int yourprojectname = 0x0234;

        void server_datareceive(object sender, reciveeventargs e, packethelper ph)

            if (ph.packetmaincommand == yourprojectname)

                switch (ph.packetsubcommand)

                    case sqlitequery:

                        using (feng.io.bufferreader reader = new feng.io.bufferreader(ph.packetcontents))

                        {

                            string sql = reader.readstring();

                            datatable dt = query(sql);

                            using (feng.io.bufferwriter bw = new feng.io.bufferwriter())

                            {

                                bw.write(dt);

                                ph.packetcontents = bw.getdata();

                                e.sockethelper.send(ph);

                            }

                        }

                        break;

                    default:

     if (ph.packetmaincommand == yourprojectname)   //判斷主指令

     switch (ph.packetsubcommand)                                           //确定執行的子指令

     string sql = reader.readstring();                                            //讀取參數 這裡發送的sql語句。

     datatable dt = query(sql);                                                       //調用函數 擷取datatable.

     bw.write(dt);                                                                                 //寫資料流 把查詢的datatable發送出雲。

     e.sockethelper.send(ph);                                                        //直接發送目前資料包。

socketclient預置的函數:

feng.net.tcp.socketclient.application_applicationexit(object, system.eventargs) feng.net.tcp.socketclient.beginpost(feng.net.packethelper, system.asynccallback) feng.net.tcp.socketclient.beginpost(feng.net.packethelper, system.asynccallback,

object) feng.net.tcp.socketclient.close() feng.net.tcp.socketclient.connectcallback(system.iasyncresult) feng.net.tcp.socketclient.createserverpath(string) feng.net.tcp.socketclient.deleteserverfile(string) feng.net.tcp.socketclient.deleteserverpath(string)

feng.net.tcp.socketclient.docallback(feng.net.tcp.asyncresultpost) feng.net.tcp.socketclient.dochanged(feng.net.packethelper) feng.net.tcp.socketclient.dorecvfile(feng.net.packethelper) feng.net.tcp.socketclient.dorecvtext(feng.net.packethelper) feng.net.tcp.socketclient.downfile(string)

feng.net.tcp.socketclient.downloadfilefromserver(string, string) feng.net.tcp.socketclient.endpost(system.iasyncresult) feng.net.tcp.socketclient.getfileinfo(string) feng.net.tcp.socketclient.getfiles(string) feng.net.tcp.socketclient.getonlineuser() feng.net.tcp.socketclient.getpaths(string)

feng.net.tcp.socketclient.getreceivedata(byte[]) feng.net.tcp.socketclient.getsenddata(byte[]) feng.net.tcp.socketclient.onclientchanged(feng.net.packethelper) feng.net.tcp.socketclient.onclose(feng.net.packethelper) feng.net.tcp.socketclient.ondatareceive(feng.net.reciveclienteventargs)

feng.net.tcp.socketclient.ondownloadfile(feng.net.packethelper) feng.net.tcp.socketclient.ongetreceivedata(object) feng.net.tcp.socketclient.onlinechecked(out int, byte[]) feng.net.tcp.socketclient.onotherlogin(feng.net.packethelper) feng.net.tcp.socketclient.onrecviceuserdata(feng.net.packethelper)

feng.net.tcp.socketclient.onsessionchanged(int) feng.net.tcp.socketclient.onsystemmessagerecv(feng.net.packethelper) feng.net.tcp.socketclient.ontoalluser(feng.net.packethelper) feng.net.tcp.socketclient.ontootheruser(feng.net.packethelper) feng.net.tcp.socketclient.post(feng.net.packethelper)

feng.net.tcp.socketclient.postcallback(object) feng.net.tcp.socketclient.read() feng.net.tcp.socketclient.receivecallback(system.iasyncresult) feng.net.tcp.socketclient.regeditsession(string, string) feng.net.tcp.socketclient.regeditsession(string, string,

byte[]) feng.net.tcp.socketclient.send(string) feng.net.tcp.socketclient.send(feng.net.packethelper) feng.net.tcp.socketclient.send(feng.net.packethelper, out byte[]) feng.net.tcp.socketclient.send(int, byte[], out byte[]) feng.net.tcp.socketclient.sendandwaitingvalue(feng.net.packethelper,

out byte[]) feng.net.tcp.socketclient.sendcallback(system.iasyncresult) feng.net.tcp.socketclient.sendclosed() feng.net.tcp.socketclient.sendfiletootheruser(string, string) feng.net.tcp.socketclient.sendfiletootheruser(system.collections.generic.list<string>,

string) feng.net.tcp.socketclient.sendfiletoserver(string, string) feng.net.tcp.socketclient.sendtoallclientfile(string) feng.net.tcp.socketclient.sendtoalluser(string) feng.net.tcp.socketclient.sendtoalluser(byte[]) feng.net.tcp.socketclient.sendtoalluser(feng.net.packethelper)

feng.net.tcp.socketclient.sendtootheruser(string, string) feng.net.tcp.socketclient.sendtootheruser(string, byte[]) feng.net.tcp.socketclient.sendtootheruser(system.collections.generic.list<string>, string) feng.net.tcp.socketclient.sendtootheruser(system.collections.generic.list<string>,

byte[]) feng.net.tcp.socketclient.sendtootheruser(system.collections.generic.list<string>, feng.net.packethelper) feng.net.tcp.socketclient.socketclient(system.net.ipaddress, int) feng.net.tcp.socketclient.socketclient() feng.net.tcp.socketclient.socketclient(system.net.ipaddress)

feng.net.tcp.socketclient.socketclient(string) feng.net.tcp.socketclient.startclient() feng.net.tcp.socketclient.startconnection() feng.net.tcp.socketclient.tostring() feng.net.tcp.socketclient.updatechecked(out int, byte[]) feng.net.tcp.socketclient.versionchecked(string,

int, out int, out string, byte[]) feng.net.tcp.socketclient.autoconnected feng.net.tcp.socketclient.defaultwaitconnectiontime feng.net.tcp.socketclient.filetemppath feng.net.tcp.socketclient.hasconnected feng.net.tcp.socketclient.host feng.net.tcp.socketclient.index

feng.net.tcp.socketclient.ipadress feng.net.tcp.socketclient.lastrecvdatatime feng.net.tcp.socketclient.name feng.net.tcp.socketclient.path feng.net.tcp.socketclient.port feng.net.tcp.socketclient.session feng.net.tcp.socketclient._autoconnected feng.net.tcp.socketclient.autoconnectedevent

feng.net.tcp.socketclient.autonconnectthread feng.net.tcp.socketclient._client feng.net.tcp.socketclient._defaultwaitconnectiontime feng.net.tcp.socketclient._filetemppath feng.net.tcp.socketclient._hasconnected feng.net.tcp.socketclient._host feng.net.tcp.socketclient._index

feng.net.tcp.socketclient._ipaddress feng.net.tcp.socketclient._lastrecvdatatime feng.net.tcp.socketclient._name feng.net.tcp.socketclient.newclientobj feng.net.tcp.socketclient.objnewstarting feng.net.tcp.socketclient._path feng.net.tcp.socketclient._port

feng.net.tcp.socketclient.readonlyindex feng.net.tcp.socketclient.readonlyobject feng.net.tcp.socketclient.recvbuffer feng.net.tcp.socketclient.sendlist feng.net.tcp.socketclient._session feng.net.tcp.socketclient._userlist feng.net.tcp.socketclient.beforedatareceive

feng.net.tcp.socketclient.beforesenddata feng.net.tcp.socketclient.clientchanged feng.net.tcp.socketclient.closedconnected feng.net.tcp.socketclient.connected feng.net.tcp.socketclient.datareceived feng.net.tcp.socketclient.downloadfile feng.net.tcp.socketclient.filerecvcompleted

feng.net.tcp.socketclient.filerecving feng.net.tcp.socketclient.initonlineusers feng.net.tcp.socketclient.otherlogin feng.net.tcp.socketclient.recviceuserdata feng.net.tcp.socketclient.sessionchanged feng.net.tcp.socketclient.systemmessagerecv feng.net.tcp.socketclient.textrecv

msqlclient預置函數:

feng.net.tcp.sqlclient.beginquerytable(string, feng.net.netcallbacks.querytablecallback) feng.net.tcp.sqlclient.columnexists(string, string) feng.net.tcp.sqlclient.columnexists(string, string, int) feng.net.tcp.sqlclient.executesql(string) feng.net.tcp.sqlclient.executesql(string,

params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.executesql(string, int) feng.net.tcp.sqlclient.executesql(string, int, params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.executesqltran(system.collections.generic.list<string>)

feng.net.tcp.sqlclient.executesqltran(system.collections.generic.list<feng.data.sqlclient.modleinfo>) feng.net.tcp.sqlclient.executesqltran(system.collections.generic.list<string>, int) feng.net.tcp.sqlclient.executesqltran(system.collections.generic.list<feng.data.sqlclient.modleinfo>,

int) feng.net.tcp.sqlclient.exists(string) feng.net.tcp.sqlclient.exists(string, params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.exists(string, int) feng.net.tcp.sqlclient.exists(string, int, params system.data.sqlclient.sqlparameter[])

feng.net.tcp.sqlclient.getmaxid(string, string) feng.net.tcp.sqlclient.getmaxid(string, string, int) feng.net.tcp.sqlclient.getsingle(string) feng.net.tcp.sqlclient.getsingle(string, params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.getsingle(string,

int) feng.net.tcp.sqlclient.getsingle(string, int, params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.postcallbac(system.iasyncresult) feng.net.tcp.sqlclient.query(string) feng.net.tcp.sqlclient.query(string, params system.data.sqlclient.sqlparameter[])

feng.net.tcp.sqlclient.query(string, int) feng.net.tcp.sqlclient.query(string, int, params system.data.sqlclient.sqlparameter[]) feng.net.tcp.sqlclient.querytable(string) feng.net.tcp.sqlclient.sqlclient(system.net.ipaddress, int) feng.net.tcp.sqlclient.sqlclient()

feng.net.tcp.sqlclient.sqlclient(system.net.ipaddress) feng.net.tcp.sqlclient.sqlclient(string) feng.net.tcp.sqlclient.tabexists(string) feng.net.tcp.sqlclient.tabexists(string, int)