C# socket服務器

public class SocSever
    {
        private int port = 102;
        private IPAddress ip;
        private TcpListener tlsocket;
        private TcpClient tcsocket;
        private NetworkStream tcStream;
        private Thread listenTh;
        private System.Timers.Timer tickHart;

        public SocSever(string strIp,int nPort)
        {
            if (!IPAddress.TryParse(strIp, out ip))
            {
                ip = Dns.GetHostAddresses(Dns.GetHostName())[0];
            }

            if (nPort != 0)
            {
                port = nPort;
            }

            tickHart = new System.Timers.Timer(1000f);
            tickHart.AutoReset = true;
            tickHart.Enabled = false;
            tickHart.Elapsed += new System.Timers.ElapsedEventHandler(tickHart_Elapsed);

            tlsocket = new TcpListener(ip, port);
            listenTh = new Thread(new ThreadStart(StartListen));
            listenTh.Start();
        }

        private void StartListen()
        {
            tlsocket.Start();

            while (true)
            {
                tcsocket = this.tlsocket.AcceptTcpClient();
                tcStream = tcsocket.GetStream();

                Thread clientThread = new Thread(new ThreadStart(HandleClient));
                clientThread.Start();
            }
        }

        private void HandleClient()
        {
            byte[] message = new byte[2048];
            tickHart.Enabled = true;

            while (true)
            {
                int bytesRead = 0;

                try
                {
                    bytesRead = tcStream.Read(message, 0, 2048);
                }
                catch (SystemException ex)
                {
                    break;
                }

                if (bytesRead == 0)
                {
                    break;
                }
                
                ASCIIEncoding encoder = new ASCIIEncoding();
                Console.WriteLine(encoder.GetString(message, 0, bytesRead));
            }
            tickHart.Enabled = false;
            tcsocket.Close();
            tcsocket = null;
        }

        private void tickHart_Elapsed(object obj, System.Timers.ElapsedEventArgs ea)
        {
            try
            {
                byte[] byteArray = new byte[] { (byte)6 };
                tcStream.Write(byteArray, 0, 1);
                tcStream.Flush();
            }
            catch (System.Net.Sockets.SocketException ex)
            {
                tcsocket.Close();
            }
        }

        public void WriteMsgToClient(string strxml)
        {
            try
            {
                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] btStream = encoder.GetBytes(strxml);
                tcStream.Write(btStream, 0, btStream.Length);
                tcStream.Flush();
            }
            catch(SocketException ex)
            {
                tcsocket.Close();
            }
        }
    }


服務器:

SocSever ss = new SocSever("192.168.1.2",9999);

控制檯客戶端:

class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();

            IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.102"), 102);

            Console.WriteLine("輸入字符C開始...");

            while (Console.ReadKey().Key == System.ConsoleKey.C)
            {
                Console.WriteLine();
                client.Connect(serverEndPoint);

                NetworkStream clientStream = client.GetStream();
                Thread clientThread = new Thread(new ParameterizedThreadStart(ReadSomething));
                clientThread.Start(clientStream);
                while (true)
                {
                    Console.WriteLine("輸入要發送的信息");
                    ASCIIEncoding encoder = new ASCIIEncoding();
                    byte[] buffer = encoder.GetBytes(Console.ReadLine());

                    clientStream.Write(buffer, 0, buffer.Length);
                    clientStream.Flush();
                }
            }
        }

        static void ReadSomething(object clientstream)
        {
            NetworkStream nws = (NetworkStream)clientstream;
            byte[] message = new byte[2048];

            while (true)
            {
                int bytesRead = 0;

                try
                {
                    bytesRead = nws.Read(message, 0, 2048);
                }
                catch (SystemException ex)
                {
                    break;
                }

                if (bytesRead == 0)
                {
                    break;
                }

                ASCIIEncoding encoder = new ASCIIEncoding();
                Console.WriteLine("服務器消息:"+encoder.GetString(message, 0, bytesRead));
            }
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章