以前做的简单实现了一个客户机与远端服务器通信和发送文件功能,封装成服务通信类,方便上层业务逻辑调用,亦增强复用性。
///<summary>
///远端服务实体类
///</summary>
public partial class Service
{
public Service()
{}
private int _serviceid;
private string _servicename;
private string _ipaddr;
private int _portno;
///<summary>
///
///</summary>
public int ServiceId
{
set{ _serviceid=value;}
get{return _serviceid;}
}
///<summary>
///
///</summary>
public string ServiceName
{
set{ _servicename=value;}
get{return _servicename;}
}
///<summary>
///
///</summary>
public string IpAddr
{
set{ _ipaddr=value;}
get{return _ipaddr;}
}
///<summary>
///
///</summary>
public int PortNo
{
set{ _portno=value;}
get{return _portno;}
}
…………
///远端服务器及类成员方法等
}
///<summary>
///通信类
///</summary>
public class ServiceOperation : Service
{
private TcpClient _client;
private int _timeOut = 25;
public ServiceOperation():base()
{
}
public ServiceOperation(int serviceId)
: base(serviceId)
{
}
///<summary>
///超时时间(秒),不设置超时时间时,超时时间为30分钟。
///</summary>
public int TimeOut
{
set
{
_timeOut = value;
if (_timeOut == 0)
_timeOut = 1800; //30分钟
}
}
#region 与远程服务通信方法
///<summary>
///打开连接
///</summary>
public void Connect()
{
try
{
_client = new TcpClient(IpAddr,PortNo);
}
catch (Exception exp)
{
throw new Exception("在建立与服务端" + IpAddr + ":" + PortNo.ToString() + "连接时出错:\n" + exp.Message);
}
}
///<summary>
///关闭连接
///</summary>
public void Close()
{
if (_client != null && _client.Connected)
{
_client.Client.Shutdown(SocketShutdown.Both);
_client.Close();
}
}
///<summary>
///向远端发送信息
///</summary>
///<param name="buffer"></param>
public void transmitBuffer(string buffer)
{
byte[] sendBuffer = Encoding.Default.GetBytes(buffer);
NetworkStream stream;
stream = _client.GetStream();
try
{
stream.WriteTimeout = 10000;
stream.Write(sendBuffer, 0, sendBuffer.Length);
}
catch (Exception exp)
{
throw new Exception("向服务器端发送数据时出错\n" + exp.Message);
}
}
///<summary>
///从远端读取信息
///</summary>
///<returns></returns>
public string receiveBuffer()
{
StringBuilder buffer;
int rcvNums;
int ind;
byte[] recvBuffer = new byte[163840];
NetworkStream stream;
stream = _client.GetStream();
stream.ReadTimeout = (_timeOut + 5) * 1000; //延迟5秒
buffer = new StringBuilder();
do
{
rcvNums = stream.Read(recvBuffer, 0, recvBuffer.Length);
if (rcvNums == 0)
break;
for (ind = 0; ind < rcvNums; ind++)
if (recvBuffer[ind] == (byte)0)
break;
rcvNums = ind;
buffer.AppendFormat("{0}", Encoding.Default.GetString(recvBuffer, 0, rcvNums));
} while (stream.CanRead);
return buffer.ToString();
}
///<summary>
///接收报文,一直到报文结束标签,用于分发程序的握手
///</summary>
///<returns></returns>
public string ReceiveDistributeBuffer()
{
StringBuilder buffer;
int rcvNums;
int ind;
byte[] recvBuffer = new byte[163840];
NetworkStream stream;
stream = _client.GetStream();
stream.ReadTimeout = (_timeOut + 5) * 1000; //延迟5秒
buffer = new StringBuilder();
do
{
rcvNums = stream.Read(recvBuffer, 0, recvBuffer.Length);
if (rcvNums == 0)
break;
for (ind = 0; ind < rcvNums; ind++)
if (recvBuffer[ind] == (byte)0)
break;
rcvNums = ind;
buffer.AppendFormat("{0}", Encoding.Default.GetString(recvBuffer, 0, rcvNums));
if (buffer.ToString().ToLower().Contains("</sqlresult>"))
break;
} while (stream.CanRead);
return buffer.ToString();
}
///<summary>
///分发文件
///</summary>
///<param name="fileName"></param>
public void SendFile(string fileName)
{
//int rcvNums;
byte[] sendBuffer = new byte[1024];
NetworkStream stream;
BinaryReader reader;
try
{
reader = new BinaryReader(File.Open(fileName, FileMode.Open));
}
catch (Exception exp)
{
throw new Exception("打开文件" + fileName + "读时出错:\n" + exp.Message);
}
try
{
stream = _client.GetStream();
stream.WriteTimeout = (_timeOut + 5) * 1000;
long total = reader.BaseStream.Length;
int rdby = 0;
int len = 0;
while (rdby < total && stream.CanWrite)
{
//从要传输的文件读取指定长度的数据
len = reader.Read(sendBuffer, 0, sendBuffer.Length);
//将读取的数据发送到对应的计算机
stream.Write(sendBuffer, 0, len);
//增加已经发送的长度
rdby = rdby + len;
}
}
catch (Exception exp)
{
throw new Exception("发送文件" + fileName + "时出错:\n" + exp.Message);
}
finally
{
reader.Close();
}
}
#endregion 与远程服务通信方法
}
}