日期:2014-05-18  浏览次数:21124 次

用C#编写可以广播的SOCKET服务器端
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;

namespace SocketServer
{
    public class SocketHost
    {
        private IDictionary<Socket, byte[]> socketClientSesson = new Dictionary<Socket, byte[]>();

        private List<string> message = new List<string>();
        private Boolean isClear = true;

        public int Port { get; set; }

        public void Start()
        {
            Boardcast();

            var socketThread = new Thread(() =>
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, this.Port);

                //绑定到通道上
                socket.Bind(iep);

                //侦听
                socket.Listen(6);

                //通过异步来处理
                socket.BeginAccept(new AsyncCallback(Accept), socket);
            });

            socketThread.Start();

            Console.WriteLine("Server Started");
        }

        private void Accept(IAsyncResult ia)
        {
            Socket socket = ia.AsyncState as Socket;
            var client = socket.EndAccept(ia);

            socket.BeginAccept(new AsyncCallback(Accept), socket);

            byte[] buf = new byte[1024];
            this.socketClientSesson.Add(client, buf);

            try
            {
                client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
                string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
                Console.WriteLine("Client ({0}) Connected", sessionId);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error:\r\n" + ex.ToString());
            }
        }

        private void Receive(IAsyncResult ia)
        {
            var client = ia.AsyncState as Socket;

            if (client == null || !this.socketClientSesson.ContainsKey(client))
            {
                return;
            }

            int count = client.EndReceive(ia);

            byte[] buf = this.socketClientSesson[client];

            if (count > 0)
            {
                try
                {
                    client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
                    string context = Encoding.UTF8.GetString(buf, 0, count);
                    PushMessage(context);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Receive Error :\r\n{0}", ex.ToString());
                }
            }
            else
            {
                try
                {
                    string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
                    client.Disconnect(true);
                    this.socketClientSesson.Remove(client);
                    Console.WriteLine("Client ({0}) Disconnet", sessionId);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: \r\n" + ex.ToString());
                }
            }
        }

        private void PushMessage(string context)
        {
            while (context.EndsWith("\n") || context.EndsWith("\0"))
            {
                context = context.Remove(context.Length - 1);
            }

            Console.WriteLine("Get : {0}", context); 
            message.Add(context);
            isClear = false;
        }

        private void Boardcast()
        {
            var boardcaseThread = new Thread(() =>
            {
                while (true)
                {
                    if (!isClear)
                    {
                        byte