天天看点

.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)