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

 

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

  

    ///<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 与远程服务通信方法

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值