您的位置:首页 > 理论基础 > 计算机网络

.Net下客户端与远端服务器网络通信与文件传送的实例

2013-04-20 23:20 274 查看


 

以前做的简单实现了一个客户机与远端服务器通信和发送文件功能,封装成服务通信类,方便上层业务逻辑调用,亦增强复用性。

  

  
 ///<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 与远程服务通信方法
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket .NET 通信