以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  .NET TCP异步操作的类  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=125331)


--  作者:卷积内核
--  发布时间:7/24/2012 10:14:00 AM

--  .NET TCP异步操作的类

分成两部分 一部分是服务 一部分是客户

全部代码using System;   
using System.Threading;   
using System.Net;   
using System.Net.Sockets;   
using System.Collections;   
  
  
namespace Zgke.Net   
{   
    /// <summary>   
    /// Tcp的异步操作   
    /// zgke@sina.com   
    /// </summary>   
    public class Tcp   
    {   
        public class TcpClient   
        {  
            #region 变量   
            /// <summary>   
            /// 端口号   
            /// </summary>   
            private int port = 8000;   
            /// <summary>   
            /// IP地址   
            /// </summary>   
            private IPAddress ip;  


            #endregion  

            #region 委托   
            /// <summary>   
            /// 接受数据   
            /// </summary>   
            public delegate void ReadByte(byte[] ReadByte);   
            public event ReadByte ReadBytes;  
            #endregion   
  
            public TcpClient(string IP, int Port)   
            {   
                if (Port != 0) port = Port;   
                if (IP != "") ip = IPAddress.Parse(IP);   
            }   
  
            /// <summary>   
            /// 反送消息   
            /// </summary>   
            /// <param name="SendByte">需要发送的数据</param>   
            public void SendByte(byte[] SendByte, bool Close)   
            {   
                Socket socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);  //建立SOCKET   
                IPEndPoint ipendpoint = new IPEndPoint(ip, port);  //建立IP目标和端口   
                socket.Connect(ipendpoint);//连接   
  
                socket.BeginSend(SendByte, 0, SendByte.Length, SocketFlags.None, null, socket); //发送数据   
  
                if (Close == true)   
                {   
                    socket.Close();   
                    return;   
                }   
                byte[] temp = new byte[1]; //建立个临时的发送数据   
                socket.BeginReceive(temp, 0, 0, SocketFlags.None, new AsyncCallback(Read), socket);  //建立异步读取                          
            }  

            #region 私有方法   
            private void Read(IAsyncResult iar)   
            {   
                Socket socket = (Socket)iar.AsyncState; //获取Socket对象   
  
                int ReadCount = socket.Available;  //获得包大小   
                if (ReadCount == 0) return;  //如果包是0 就直接返回   
                byte[] Byte = new byte[ReadCount];   //建立要接收的对象信息   
                socket.BeginReceive(Byte, 0, ReadCount, SocketFlags.None, null, socket); //开始读取   
                if (ReadBytes != null) ReadBytes(Byte);  //执行委托   
  
            }  


            #endregion   
        }   
  
        public class TcpServer   
        {   
            /// <summary>   
            /// 保存监听   
            /// </summary>   
            private Socket listener;   
            /// <summary>   
            /// 端口号   
            /// </summary>   
            private int TcpPort = 8000;   
            /// <summary>   
            /// IP地址   
            /// </summary>   
            private string TcpIP = "127.0.0.1";   
  
  
            /// <summary>   
            /// 默认地址池   
            /// </summary>   
            private int Bocklog = 10;   
  
  
            /// <summary>   
            /// 关闭标志   
            /// </summary>   
            private bool ServerRunTCP = false;   
  
            /// <summary>   
            /// 服务器运行状态   
            /// </summary>   
            public bool ServerRun   
            {   
                get { return ServerRunTCP; }   
            }   
  
  
            /// <summary>   
            /// 执行消息   
            /// </summary>   
            public delegate void MessageText(string MessageText);   
            public event MessageText Message;   
  
            /// <summary>   
            /// 读写数据   
            /// </summary>   
            public delegate void ReadByte(byte[] ReadByte, ref byte[] SendByte, ref bool Close);   
            public event ReadByte ReadBytes;   
  
  
  
  
            public TcpServer(string IP, int Port)   
            {   
                if (Port > 1) TcpPort = Port;   
                if (IP != "") TcpIP = IP;   
            }   
  
            public void Star()   
            {   
                if (ServerRun == true)   
                {   
                    Message("Server Runling....");   
                    return;   
                }   
  
                listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);   
  
                listener.Bind(new IPEndPoint(IPAddress.Parse(TcpIP), TcpPort));   
  
                listener.Listen(Bocklog);   
  
                listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);   
                ServerRunTCP = true;   
            }   
  
            public void Close()   
            {   
                if (ServerRun == false)   
                {   
                    Message("Server Not Run");   
                    return;   
                }   
                ServerRunTCP = false;   
                listener.Close();   
            }  


            #region 私有方法   
            private void OnConnectRequest(IAsyncResult ar)   
            {   
                if (ServerRunTCP == false) return;   
                Socket listener = (Socket)ar.AsyncState;   
                Socket sock = listener.EndAccept(ar);   
  
  
                listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);   
  
  
  
  
                if (Message != null) Message(sock.RemoteEndPoint.ToString() + " Join");   
  
  
                byte[] temp = new byte[0];   
                sock.BeginReceive(temp, 0, 0, SocketFlags.None, new AsyncCallback(OnRecievedData), sock);   
  
            }   
            private void OnRecievedData(IAsyncResult ar)   
            {   
  
                Socket sock = (Socket)ar.AsyncState;   
  
                if (ServerRunTCP == false)   
                {   
                    sock.Close();   
                    return;   
                }   
  
  
                int RecievedSize = sock.Available;   
  
  
  
                if (RecievedSize == 0)   
                {   
                    if (Message != null) Message(sock.RemoteEndPoint.ToString() + " Close");   
                    sock.Close();   
  
                    return;   
                }   
  
                byte[] RecievedData = new byte[RecievedSize];   
  
                sock.Receive(RecievedData);   
  
  
                if (Message != null) Message(sock.RemoteEndPoint.ToString() + " Read " + RecievedSize.ToString());   
  
                byte[] SendData = new byte[0];   
                bool CloseSock = false;   
                if (ReadBytes != null) ReadBytes(RecievedData, ref SendData, ref CloseSock);   
  
                if (SendData.Length != 0) sock.BeginSend(SendData, 0, SendData.Length, SocketFlags.None, null, sock);   
  
  
                if (CloseSock == true)   
                {   
                    sock.Close();   
                    return;   
                }   
                RecievedData = new byte[0];   
  
                sock.BeginReceive(RecievedData, 0, 0, SocketFlags.None, new AsyncCallback(OnRecievedData), sock);   
  
            }  

            #endregion   
  
        }   
  
  
    }   
}  



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
863.281ms