秋 叶
      程序书写人生,代码编织未来! 
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

自已C#写的一个通信网络服务端的类

Posted on 2006-05-18 22:48  秋叶  阅读(976)  评论(5)    收藏  举报

此类还有不足的地方.请大家多意见便于改正!!      做好的类库在些下载:  CSockets.rar 
SocketStart.cs 的代码:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections;

namespace CSockets
{
    public delegate void getClientID(object sender, ClientID e);
    public class SocketStart
    {       

        public event getClientID mOnConnected = null;
        public ArrayList ClinetList = ArrayList.Synchronized(new ArrayList());
        public AsyncCallback ClientCallBack;
        public Socket MaiSocket;
        public int ClientNum = 0;
        public void Start()   //启动服务
        {
            try
            {
                MaiSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint LocIP = new IPEndPoint(IPAddress.Any, 1680);
                MaiSocket.Bind(LocIP);
                MaiSocket.Listen(100);
                MaiSocket.BeginAccept(new AsyncCallback(ClinetConnection), null);
            }
            catch (Exception E)
            {
            }
        }

        private void ClinetConnection(IAsyncResult asyn)  //实现多客户连接
        {
            try
            {
                Socket ClientSocket = MaiSocket.EndAccept(asyn);
                Interlocked.Increment(ref ClientNum);
                ClinetList.Add(ClientSocket);
                mOnConnected(this,new ClientID(this));
                WaiData(ClientSocket, ClientNum);
                MaiSocket.BeginAccept(new AsyncCallback(ClinetConnection), null);
            }
            catch (Exception E)
            {
            }
        }

        public class SocketPack
        {
            public Socket cSocketName;
            public byte[] dataBuffer = new byte[64];
            public int CID;
            public SocketPack(Socket socket, int ID)
            {
                cSocketName = socket;
                CID = ID;
            }
        }

        private void WaiData(Socket socketData, int Num)   //等待数据
        {
            try
            {
                if (ClientCallBack == null)
                {
                    ClientCallBack = new AsyncCallback(onData);
                }
                SocketPack Sp = new SocketPack(socketData, Num);
                socketData.BeginReceive(Sp.dataBuffer, 0, Sp.dataBuffer.Length, SocketFlags.None, ClientCallBack, Sp);
            }
            catch (Exception E)
            {

            }
        }

        private void onData(IAsyncResult asny)    //接受数据
        {
            SocketPack Sp = (SocketPack)asny.AsyncState;
            try
            {               
                int iRx = Sp.cSocketName.EndReceive(asny);
                char[] chars = new char[iRx + 1];
                string IDData = new string(chars);
                string[] str = IDData.Split(new char[] { '|' });
                if (str[0] == "Mes")
                {

                }
                WaiData(Sp.cSocketName, Sp.CID);
            }
            catch (ObjectDisposedException SE)
            {
            }
            catch (SocketException E)
            {
                if (E.ErrorCode == 10054)
                {
                    ClinetList[Sp.CID - 1] = null;
                    mOnConnected(this, new ClientID(this));
                }
            }
        }

        public void SendMess(string SendText,int SendID)    //发送数据
        {
            try
            {
                byte[] sendData = System.Text.Encoding.UTF8.GetBytes(SendText);
                Socket SendSocket = (Socket)ClinetList[SendID];
                SendSocket.Send(sendData);
            }
            catch (Exception E)
            {
            }
        }
    }
}

第二个ClientID.cs代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections;

namespace CSockets
{
    public class ClientID
    {
        public ClientID(SocketStart ss)
            {
             
            }

    }
}