C# Socket编程 服务端与客户端(二)

来源:互联网 发布:淘宝恒源祥是正品吗 编辑:程序博客网 时间:2024/05/29 09:17

在(一)中已经有了客户端,这里就不再介绍,这一篇中我们在服务端中加上多线程,结果会与(一)中有很大的不同,仔细比较,体会。与(一)不同的是每接收到一个socket连接,服务端就将处理的操作抛到一个新的线程里去执行,这样就不会产生(一)中的排队现象。

本篇客户端结果:


本篇服务端结果:


改变后的服务端代码:

        static void Main(string[] args)        {            Socket m_svrSock = null;            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 3800);            m_svrSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            m_svrSock.Bind(endPoint);            m_svrSock.Listen(100);            Console.WriteLine("Listen Up...");            while (true)            {                Socket client;                client = m_svrSock.Accept();                if (!client.Poll(-1, SelectMode.SelectRead))                {                    continue;                }                new Thread(new ParameterizedThreadStart(serverThread)).Start(client);            }        }        volatile static int customerCount = 1;        [ThreadStatic]        private static string threadId;        static void serverThread(object client)        {            threadId = Thread.CurrentThread.GetHashCode() + "";            Socket clientSocket = (Socket)client;            Console.WriteLine(threadId + "Customer:" + customerCount);            customerCount++;            int lineCount = 0;            byte[] receive = new byte[7];            while (true)            {                Thread.Sleep(500);                Console.WriteLine(threadId + "line:" + lineCount);                if (!clientSocket.Poll(-1, SelectMode.SelectRead))                {                    lineCount++;                    continue;                }                if (clientSocket.Receive(receive, 7, SocketFlags.None) == 0)                {                    Console.WriteLine(threadId + "no data here!The customer has closed his client!");                    break;                }                Console.WriteLine(threadId + "socket here...");                string lengthStr = Encoding.UTF8.GetString(receive, 4, 3);                int length = int.Parse(lengthStr);                byte[] receiveBody = new byte[length];                clientSocket.Receive(receiveBody, length, SocketFlags.None);                Console.WriteLine(threadId + "line:" + lineCount + Encoding.UTF8.GetString(receiveBody));                lineCount++;            }        }


0 0
原创粉丝点击