大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> 使用C#进行点对点通讯和文件传输(通讯基类部分)

使用C#进行点对点通讯和文件传输(通讯基类部分)

时间: 2021-07-31 作者:daque

迩来一个名目要用到点对点文献传输,俺就四处找材料写步调,结果毕竟实行了,为了让旁人少走些弯道,俺确定将俺步调中最要害的局部奉献出来,蓄意对大师有所扶助。俺的步调分三局部,囊括发送局部、接收局部和一个两者共享的通信基类,这个基类才是俺血汗的结晶:)一、通信基类using system;using system.net.sockets;using system.net ;using system.io ;using system.windows.forms;using system.text;namespace baseclass{ /// <summary> /// 传递消息的方法为 给定长度的吩咐局部+给定长度的吩咐解释局部+可变长度的长度消息+可变长度的消息局部 /// </summary> public class communclass { public communclass() { // // todo: 在此处增添结构因变量论理 // } /// <summary> /// 吩咐局部的长度 /// </summary> private static readonly int cmdlen = 50 ; /// <summary> /// 吩咐解释局部的长度 /// </summary> private static readonly int desclen = 100 ; /// <summary> /// 可变长度的长度消息局部所占的字节数 /// </summary> private static readonly int dynamiclengthlen = 10 ; /// <summary> /// 历次处置可变消息局部的长度 /// </summary> private static readonly int deallen = 1024 ; /// <summary> /// /应答的最大长度 /// </summary> private static readonly int responlen = 20 ; /// <summary> /// 用来弥补吩咐或解释不及长度局部的字符 /// </summary> private static readonly char fillchar = '^' ; /// <summary> /// 胜利发送一局部数据后的回调本领(也不妨觉得是触发的事变,但庄重来说还不是) /// </summary> public delegate void onsend(int itotal,int isending) ; /// <summary> /// 按照给定的效劳器和端标语创造贯穿 /// </summary> /// <param name="strhost">效劳器名</param> /// <param name="iport">端标语</param> /// <returns></returns> public static socket connecttoserver(string strhost,int iport) { try { ipaddress ipaddress = dns.resolve(strhost).addresslist[0]; ipendpoint ippoint = new ipendpoint(ipaddress,iport) ; socket s = new socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp) ; s.connect(ippoint) ; return s ; } catch (exception e) { throw (new exception("创造到效劳器的贯穿堕落" + e.message)) ; } } /// <summary> /// 将文本写到socket中 /// </summary> /// <param name="s">要发送消息的socket</param> /// <param name="strinfo">要发送的消息</param> /// <returns>能否胜利</returns> public static bool writetexttosocket(socket s,string strinfo) { byte [] buf = encoding.utf8.getbytes(strinfo) ; try { s.send(buf,0,buf.length,socketflags.none) ; return true ; } catch(exception err) { messagebox.show("发送文本波折!"+err.message) ; return false ; } } /// <summary> /// 将吩咐文本写到socket中 /// </summary> /// <param name="s">要发送吩咐文本的socket</param> /// <param name="strinfo">要发送的吩咐文本</param> /// <returns>能否胜利</returns> public static bool writecommandtosocket(socket s,string strcmd) { if (strcmd == "") strcmd = "nop" ; strcmd = strcmd.padright(cmdlen,fillchar) ; return writetexttosocket(s,strcmd) ; } /// <summary> /// 将吩咐解释写到socket中 /// </summary> /// <param name="s">要发送吩咐解释的socket</param> /// <param name="strinfo">要发送的吩咐解释</param> /// <returns>能否胜利</returns> public static bool writecommanddesctosocket(socket s,string strdesc) { if (strdesc == "") strdesc = "0" ; strdesc = strdesc.padright(desclen,fillchar) ; return writetexttosocket(s,strdesc) ; } /// <summary> /// 发送可变消息的字节数 /// </summary> /// <param name="s">要发送字节数的socket</param> /// <param name="ilen">字节数</param> /// <returns>能否胜利</returns> public static bool writedynamiclentosocket(socket s,int ilen) { string strlen = ilen.tostring().padright(dynamiclengthlen,fillchar) ; return writetexttosocket(s,strlen) ; } /// <summary> /// 将缓存的指定局部发送给socket /// </summary> /// <param name="s">要发送缓存的socket</param> /// <param name="buf">要发送的缓存</param> /// <param name="istart">要发送缓存的开始场所</param> /// <param name="icount">要发送缓存的字节数</param> /// <param name="iblock">历次发送的字节说</param> /// <param name="sendsuccess">历次发送胜利后的回调因变量</param> /// <returns>能否发送胜利</returns> public static bool writebuftosocket(socket s,byte [] buf,int istart,int icount,int iblock,onsend sendsuccess) { int isended = 0 ; int isending = 0 ; while(isended<icount) { if (isended + iblock <= icount) isending = iblock ; else isending = icount - isended ; s.send(buf,istart+isended,isending,socketflags.none) ; isended += isending ; if (readresponsionfromsocket(s)=="ok") if (sendsuccess != null) sendsuccess(icount,isended) ; else return false; } return true ; } /// <summary> /// 将长度不恒定文本发送给socket /// </summary> /// <param name="s">要发送文本的socket</param> /// <param name="strtext">要发送的文本</param> /// <param name="onsendtext">胜利发送一局部文本后的回调因变量</param> /// <param name="settextlen">获得文本长度的回调因变量</param> /// <returns></returns> public static bool writedynamictexttosocket(socket s,string strtext, onsend onsendtext) { byte [] buf = encoding.utf8.getbytes(strtext) ; int ilen = buf.length ; try { writedynamiclentosocket(s,ilen) ; return writebuftosocket(s,buf,0,ilen,deallen,onsendtext) ; } catch(exception err) { messagebox.show("发送文本波折!"+err.message) ; return false ; } } /// <summary> /// 将文献写到socket /// </summary> /// <param name="s">要发送文献的socket</param> /// <param name="strfile">要发送的文献</param> /// <returns>能否胜利</returns> public static bool writefiletosocket(socket s,string strfile, onsend onsendfile) { filestream fs = new filestream(strfile,filemode.open,fileaccess.read,fileshare.read) ; int ilen = (int)fs.length ; writedynamiclentosocket(s,ilen) ; byte [] buf = new byte[ilen] ; try { fs.read(buf,0,ilen) ; return writebuftosocket(s,buf,0,ilen,deallen,onsendfile) ; } catch(exception err) { messagebox.show("发送文献波折!"+err.message) ; return false ; } finally { fs.close() ; } } /// <summary> /// 对方对本人动静的大略回应 /// </summary> /// <param name="s"></param> /// <returns></returns> public static string readresponsionfromsocket( socket s) { byte [] bufcmd = new byte[responlen] ; int icount = s.receive(bufcmd) ; string strrespon = encoding.utf8.getstring(bufcmd,0,icount) ; return strrespon ; } /// <summary> /// 从socket读取吩咐 /// </summary> /// <param name="s">要读取吩咐的socket</param> /// <returns>读取的吩咐</returns> public static string readcommandfromsocket( socket s) { byte [] bufcmd = new byte[cmdlen] ; int icount = s.receive(bufcmd,0,cmdlen,socketflags.partial) ; string strcommand = encoding.utf8.getstring(bufcmd,0,cmdlen) ; return strcommand = strcommand.trimend(fillchar) ; } /// <summary> /// 读取吩咐解释 /// </summary> /// <param name="s">要读取吩咐解释的socket</param> /// <returns>读取的吩咐解释</returns> public static string readcommanddescfromsocket( socket s) { byte [] bufcmd = new byte[desclen] ; int icount = s.receive(bufcmd,0,desclen,socketflags.partial) ; string strcommand = encoding.utf8.getstring(bufcmd,0,desclen) ; return strcommand = strcommand.trimend(fillchar) ; } /// <summary> /// 读取可变局部的长度 /// </summary> /// <param name="s">要读取可变局部长度的socket</param> /// <returns>读取的可变局部的长度</returns> public static int readdynamiclenfromsocket( socket s) { byte [] bufcmd = new byte[dynamiclengthlen] ; int icount = s.receive(bufcmd,0,dynamiclengthlen,socketflags.partial) ; string strcommand = encoding.utf8.getstring(bufcmd,0,dynamiclengthlen) ; return int.parse(strcommand.trimend(fillchar)) ; } /// <summary> /// 读取文本情势的可变消息 /// </summary> /// <param name="s">要读取可变消息的socket</param> /// <returns>读取的可变消息</returns> public static string readdynamictextfromsocket( socket s) { int ilen = readdynamiclenfromsocket(s) ; byte [] buf = new byte[ilen] ; string strinfo = "" ; int ireceiveded = 0 ; int ireceiveing = 0 ; while(ireceiveded<ilen) { if (ireceiveded + deallen <= ilen) ireceiveing = deallen ; else ireceiveing = ilen - ireceiveded ; s.receive(buf,ireceiveded,ireceiveing,socketflags.none) ; communclass.writetexttosocket(s,"ok") ; ireceiveded+= ireceiveing ; } strinfo = encoding.utf8.getstring(buf,0,ilen) ; return strinfo ; } /// <summary> /// 读取文献情势的可变消息 /// </summary> /// <param name="s">要读取可变消息的socket</param> /// <param name="strfile">读出后的文献生存场所</param> /// <returns>能否读取胜利</returns> public static bool readdynamicfilefromsocket( socket s,string strfile) { int ilen = readdynamiclenfromsocket(s) ; byte [] buf = new byte[ilen] ; filestream fs = new filestream(strfile,filemode.create,fileaccess.write) ; try { int ireceiveded = 0 ; int ireceiveing = 0 ; while(ireceiveded<ilen) { if (ireceiveded + deallen <= ilen) ireceiveing = deallen ; else ireceiveing = ilen - ireceiveded ; s.receive(buf,ireceiveded,ireceiveing,socketflags.none) ; communclass.writetexttosocket(s,"ok") ; ireceiveded+= ireceiveing ; } fs.write(buf,0,ilen) ; return true ; } catch(exception err) { messagebox.show("接受文献波折"+err.message) ; return false ; } finally { fs.close() ; } } }//end class}//end namespace上头是俺的通信普通类,有了这个类,再举行发送接收还不是小菜一碟吗?未完待续

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.