SocketAsyncEventArgs Socket Echo Server


namespace Microshaoft
{
    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.ServiceModel.Channels;
    class EchoServer
    {
        Socket server;
        public EchoServer(IPEndPoint localPoint)
        {
            server = new Socket
                            (
                                localPoint.AddressFamily
                                , SocketType.Stream
                                , ProtocolType.Tcp
                            );
            server.Bind(localPoint);
            server.Listen(5);
            accept_async();
        }
        private void accept_async()
        {
            var accept = new SocketAsyncEventArgs();
            accept.Completed += accept_Completed;
            server.AcceptAsync(accept);
        }
        int i = 0;
        void accept_Completed(object sender, SocketAsyncEventArgs e)
        {
            accept_async();
            var client = e.AcceptSocket;
            e.UserToken = i ++;
            e.Completed -= accept_Completed;
            e.Completed += receive_Completed;
            var buffer = new byte[1024];
            e.SetBuffer(buffer, 0, buffer.Length);
            client.ReceiveAsync(e);
        }
        void receive_Completed(object sender, SocketAsyncEventArgs e)
        {
            var client = sender as Socket;
            if (e.BytesTransferred == 0)
            {
                Console.WriteLine("socket is closed");
                client.Close();
            }
            else
            {
                //client.Send(e.Buffer, e.BytesTransferred, SocketFlags.None);
                byte[] buffer = new byte[e.BytesTransferred];
                Buffer.BlockCopy(e.Buffer, 0, buffer, 0, buffer.Length);
                string s = BitConverter.ToString(buffer);
                //s = Encoding.ASCII.GetString(buffer);
                Console.WriteLine("===={0}UserToken: [{1}]{0}Bytes Transferred:[{2}]{0}Data:[{3}]{0}====", "\r\n", e.UserToken, e.BytesTransferred, s);
                //Console.WriteLine(s);
                client.ReceiveAsync(e);
            }
        }
    }
}
namespace ConsoleApplication
{
    using System;
    using System.Net;
    using Microshaoft;
        /// <summary>
        /// Class1 的摘要说明。
        /// </summary>
    public class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        //[STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            IPAddress ipa;
            IPAddress.TryParse("127.0.0.1", out ipa);
            EchoServer x = new EchoServer(new IPEndPoint(ipa, 8180));
            Console.WriteLine("Hello World");
            Console.WriteLine(Environment.Version.ToString());
            Console.ReadLine();
        }
    }
}

posted @ 2009-03-14 02:27  于斯人也  阅读(5971)  评论(0编辑  收藏  举报