C \ # TcpListener 의 프로 그래 밍 요점

11148 단어 listener
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Net.Sockets;

using System.Threading;

using System.Windows.Forms;



namespace Server

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            listener = new TcpListener(IPAddress.Any, 9009);//         

            listener.Start();



            //     1:    tcp    ,         。          。

            new Thread(() =>

            {

                while (true)

                {

                    Thread.Sleep(100);//           

                    if (!listener.Pending())

                    {

                        continue;

                    }

                    var client = listener.AcceptTcpClient();

                    //             

                    // client.ReceiveBufferSize

                    // client.ReceiveTimeout

                    // client.SendBufferSize

                    // client.SendTimeout

                    if (!client.Connected)

                    {

                        continue;

                    }

                    streams.Add(client.GetStream());

                }

            }) { IsBackground = true }.Start();



            //     2:      ,     。          。

            new Thread(() =>

                {

                    while (true)

                    {

                        Thread.Sleep(100);//           

                        if (streams == null || streams.Count == 0)

                        {

                            continue;

                        }

                        streams = streams.Where(s => s.CanRead && s.CanWrite).ToList();

                        foreach (var stream in streams.Where(stream => stream.CanRead && stream.CanWrite))

                        {

                            AsyncReceiveBytes(stream,

                                s =>

                                {

                                    // todo: result    

                                    // todo:           ,      C#  

                                    AsyncSendBytes(s, new byte[0]); // todo:     C#         ,  new byte[0]。

                                });

                        }

                    }

                }) { IsBackground = true }.Start();

        }



        //           

        public void SendEventAndTarget()

        {

            if (streams == null || streams.Count == 0)

            {

                return;

            }

            streams = streams.Where(s => s.CanRead && s.CanWrite).ToList();

            foreach (var stream in streams.TakeWhile(stream => stream.CanWrite))

            {

                AsyncSendBytes(stream, new byte[0]);// todo:       C#           new byte[0]。

            }

        }



        private static void AsyncReceiveBytes(NetworkStream stream,

            Action<NetworkStream> callback)

        {

            //       :           ,           。

            ////ThreadPool.SetMaxThreads();      。

            ThreadPool.QueueUserWorkItem(delegate

            {

                var buffer = new byte[1024];// 1024:        。

                var result = new byte[0];

                do

                {

                    var a = stream.Read(buffer, 0, buffer.Length);

                    result = result.Concat(buffer.Take(a)).ToArray();

                } while (stream.DataAvailable);

                callback(stream);

            });

        }

        private static void AsyncSendBytes(NetworkStream stream, byte[] bytes)

        {

            //       :           ,           。

            ////ThreadPool.SetMaxThreads();      。

            ThreadPool.QueueUserWorkItem(delegate

                {

                    try

                    {

                        stream.Write(bytes, 0, bytes.Count());

                    }

                    catch (Exception)

                    {

                        MessageBox.Show("");//

                    }

                });

        }



        private readonly TcpListener listener;

        //      

        private List<NetworkStream> streams = new List<NetworkStream>();

    }

}

시간 을 내 서 프로젝트 에 응용 한 후에 다시 총 결 해 보 자.

좋은 웹페이지 즐겨찾기