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 intCMDLEN = 50 ;
/// <summary>
/// 命令注释部分的长度
/// </summary>
private static readonly intDESCLEN = 100 ;
/// <summary>
///可变长度的长度信息部分所占的字节数
/// </summary>
private static readonly intDYNAMICLENGTHLEN = 10 ;
/// <summary>
///每次处理可变信息部分的长度
/// </summary>
private static readonly intDEALLEN = 1024 ;
/// <summary>
/// /应答的最大长度
/// </summary>
private static readonly intRESPONLEN = 20 ;
/// <summary>
///用于填充命令或注释不足长度部分的字符
/// </summary>
private static readonly charFILLCHAR = ’^’ ;
/// <summary>
///成功发送一部分数据后的回调方法(也可以认为是触发的事件,但严格来说还不是)
/// </summary>
public delegate voidOnSend(int iTotal,int iSending) ;
/// <summary>
///根据给定的服务器和端口号建立连接
/// </summary>
/// <param>服务器名</param>
/// <param>端口号</param>
///<returns></returns>
public static SocketConnectToServer(string strHost,int iPort)
{
try
{
IPAddressipAddress = Dns.Resolve(strHost).AddressList[0];
IPEndPointipPoint = new IPEndPoint(ipAddress,iPort) ;
Sockets = newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
s.Connect(ipPoint);
returns ;
}
catch(Exception e)
{
throw(new Exception("建立到服务器的连接出错" + e.Message)) ;
}
}
/// <summary>
/// 将文本写到Socket中
/// </summary>
/// <param>要发送信息的Socket</param>
/// <param>要发送的信息</param>
///<returns>是否成功</returns>
public static boolWriteTextToSocket(Socket s,string strInfo)
{
byte []buf = Encoding.UTF8.GetBytes(strInfo) ;
try
{
s.Send(buf,0,buf.Length,SocketFlags.None);
returntrue ;
}
catch(Exceptionerr)
{
MessageBox.Show("发送文本失败!"+err.Message);
returnfalse ;
}
}
/// <summary>
///将命令文本写到Socket中
/// </summary>
/// <param>要发送命令文本的Socket</param>
/// <param>要发送的命令文本</param>
///<returns>是否成功</returns>
public static boolWriteCommandToSocket(Socket s,string strCmd)
{
if (strCmd== "")
strCmd= "NOP" ;
strCmd =strCmd.PadRight(CMDLEN,FILLCHAR) ;
returnWriteTextToSocket(s,strCmd) ;
}
/// <summary>
///将命令注释写到Socket中
/// </summary>
/// <param>要发送命令注释的Socket</param>
/// <param>要发送的命令注释</param>
///<returns>是否成功</returns>
public static boolWriteCommandDescToSocket(Socket s,string strDesc)
{
if(strDesc == "")
strDesc= "0" ;
strDesc =strDesc.PadRight(DESCLEN,FILLCHAR) ;
returnWriteTextToSocket(s,strDesc) ;
}
/// <summary>
/// 发送可变信息的字节数
/// </summary>
/// <param>要发送字节数的Socket</param>
/// <param>字节数</param>
///<returns>是否成功</returns>
public static boolWriteDynamicLenToSocket(Socket s,int iLen)
{
stringstrLen = iLen.ToString().PadRight(DYNAMICLENGTHLEN,FILLCHAR) ;
returnWriteTextToSocket(s,strLen) ;
}
/// <summary>
///将缓存的指定部分发送到Socket
/// </summary>
/// <param>要发送缓存的Socket</param>
/// <param>要发送的缓存</param>
/// <param>要发送缓存的起始位置</param>
/// <param>要发送缓存的字节数</param>
/// <param>每次发送的字节说</param>
/// <param>每次发送成功后的回调函数</param>
///<returns>是否发送成功</returns>
public static boolWriteBufToSocket(Socket s,byte [] buf,int iStart,int iCount,intiBlock,OnSend SendSuccess)
{
intiSended = 0 ;
intiSending = 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
returnfalse;
}
returntrue ;
}
/// <summary>
///将长度不固定文本发送到socket
/// </summary>
/// <param>要发送文本的Socket</param>
/// <param>要发送的文本</param>
/// <param>成功发送一部分文本后的回调函数</param>
/// <param>得到文本长度的回调函数</param>
///<returns></returns>
public static boolWriteDynamicTextToSocket(Socket s,string strText,
OnSendOnSendText)
{
byte []buf = Encoding.UTF8.GetBytes(strText) ;
int iLen =buf.Length ;
try
{
WriteDynamicLenToSocket(s,iLen);
returnWriteBufToSocket(s,buf,0,iLen,DEALLEN,OnSendText) ;
}
catch(Exceptionerr)
{
MessageBox.Show("发送文本失败!"+err.Message);
returnfalse ;
}
}
/// <summary>
/// 将文件写到Socket
/// </summary>
/// <param>要发送文件的Socket</param>
/// <param>要发送的文件</param>
///<returns>是否成功</returns>
public static boolWriteFileToSocket(Socket s,string strFile,
OnSendOnSendFile)
{
FileStreamfs = newFileStream(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);
returnWriteBufToSocket(s,buf,0,iLen,DEALLEN,OnSendFile) ;
}
catch(Exceptionerr)
{
MessageBox.Show("发送文件失败!"+err.Message);
returnfalse ;
}
finally
{
fs.Close();
}
}
/// <summary>
///对方对自己消息的简单回应
/// </summary>
/// <param></param>
///<returns></returns>
public static stringReadResponsionFromSocket( Socket s)
{
byte []bufCmd = new byte[RESPONLEN] ;
int iCount= s.Receive(bufCmd) ;
stringstrRespon = Encoding.UTF8.GetString(bufCmd,0,iCount) ;
returnstrRespon ;
}
/// <summary>
/// 从Socket读取命令
/// </summary>
/// <param>要读取命令的Socket</param>
///<returns>读取的命令</returns>
public static stringReadCommandFromSocket( Socket s)
{
byte []bufCmd = new byte[CMDLEN] ;
int iCount= s.Receive(bufCmd,0,CMDLEN,SocketFlags.Partial) ;
stringstrCommand = Encoding.UTF8.GetString(bufCmd,0,CMDLEN) ;
returnstrCommand = strCommand.TrimEnd(FILLCHAR) ;
}
/// <summary>
/// 读取命令注释
/// </summary>
/// <param>要读取命令注释的Socket</param>
///<returns>读取的命令注释</returns>
public static stringReadCommandDescFromSocket( Socket s)
{
byte []bufCmd = new byte[DESCLEN] ;
int iCount= s.Receive(bufCmd,0,DESCLEN,SocketFlags.Partial) ;
stringstrCommand = Encoding.UTF8.GetString(bufCmd,0,DESCLEN) ;
returnstrCommand = strCommand.TrimEnd(FILLCHAR) ;
}
/// <summary>
/// 读取可变部分的长度
/// </summary>
/// <param>要读取可变部分长度的Socket</param>
///<returns>读取的可变部分的长度</returns>
public static intReadDynamicLenFromSocket( Socket s)
{
byte []bufCmd = new byte[DYNAMICLENGTHLEN] ;
int iCount= s.Receive(bufCmd,0,DYNAMICLENGTHLEN,SocketFlags.Partial) ;
stringstrCommand = Encoding.UTF8.GetString(bufCmd,0,DYNAMICLENGTHLEN);
returnint.Parse(strCommand.TrimEnd(FILLCHAR)) ;
评论1
最新资源