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