public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }
        
        TcpClient newclient;
        Thread nth;
        
        Boolean star = false;
        public static  IPAddress localaddr = IPAddress.Parse("127.0.0.1");        TcpListener listener = new TcpListener(localaddr  ,8888);        private void button1_Click(object sender, EventArgs e)
        {   
            listener.Start();
            textBox1.Text = "服务器启动";
            nth = new Thread(new ThreadStart (clientconnect ));
            nth.Start();
            
     
        }       private  void clientconnect() 
        {
            while (true)
            {                try
                {
                    newclient = listener.AcceptTcpClient();
                    textBox1.Text = "有客户连接了!";
                }
                catch { break; }                //  Console.WriteLine("有客户连接了!");                NetworkStream ns = newclient.GetStream();
                BinaryReader nsr = new BinaryReader(ns);
                BinaryWriter nsw = new BinaryWriter(ns);
                star = true;
                while (star)
                {
                    textBox1.Text = nsr.ReadString();
                }
                nsr.Close();
                nsw.Close();
                ns.Close();
            }
        }
       private void Form1_FormClosing(object sender, FormClosingEventArgs e)
       {
           star = false;
           listener.Stop();
           //newclient.Close();
         
       }
          
    }
怎样才能相应多个客户连接! 新手求教!!!!!

解决方案 »

  1.   


     public partial class ServerMain : Form
        {
            public ServerMain()
            {
                InitializeComponent();
            }        private void ServerMain_Load(object sender, EventArgs e)
            {
                this.CmdStar.Enabled = true;
                this.CmdStop.Enabled = false;
            }        private void 配置参数ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                Set TSet = new Set();
                TSet.ShowDialog();
            }        private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                About TAbout = new About();
                TAbout.Show();
            }
            /// <summary>
            /// 获得XML文件中的端口号
            /// </summary>
            /// <returns></returns>
            private int GetPort()
            {
                try
                {
                    XmlDocument TDoc = new XmlDocument();
                    TDoc.Load("Settings.xml");
                    string TPort = TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;
                    return Convert.ToInt32(TPort);            }
                catch { return 6600; }//默认是6600
            }        //声明将要用到的类
            private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
            private Socket ServerSocket;//服务端运行的SOCKET
            private Thread ServerThread;//服务端运行的线程
            private Socket[] ClientSocket;//为客户端建立的SOCKET连接
            private int ClientNumb;//存放客户端数量
            private byte[] MsgBuffer;//存放消息数据        private void CmdStar_Click(object sender, EventArgs e)
            {
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动
                IPAddress ip = IPAddress.Any;
                ServerInfo=new IPEndPoint(ip,this.GetPort());
                ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
                ServerSocket.Listen(10);//开始监听,并且挂起数为10            ClientSocket = new Socket[65535];//为客户端提供连接个数
                MsgBuffer = new byte[65535];//消息数据大小
                ClientNumb = 0;//数量从0开始统计            ServerThread = new Thread(new ThreadStart(RecieveAccept));//将接受客户端连接的方法委托给线程
                ServerThread.Start();//线程开始运行            CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用            this.CmdStar.Enabled = false;
                this.CmdStop.Enabled = true;
                this.StateMsg.Text = "服务正在运行..."+" 运行端口:"+this.GetPort().ToString();
                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
            }
            
            //接受客户端连接的方法
            private void RecieveAccept()
            {
                while (true)
                {
                    //Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。
                    //在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
                    ClientSocket[ClientNumb] = ServerSocket.Accept();
                    ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None,
                        new AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);
                    lock (this.ClientList)
                    {
                        this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 成功连接服务器.");
                    }
                    ClientNumb++;
                }
            }        //回发数据给客户端
            private void RecieveCallBack(IAsyncResult AR)
            {
                try
                {
                    Socket RSocket = (Socket)AR.AsyncState;
                    int REnd = RSocket.EndReceive(AR);
                    //对每一个侦听的客户端端口信息进行接收和回发
                    for (int i = 0; i < ClientNumb; i++)
                    {
                        if (ClientSocket[i].Connected)
                        {
                            //回发数据到客户端
                            ClientSocket[i].Send(MsgBuffer, 0, REnd,SocketFlags.None);
                        }
                        //同时接收客户端回发的数据,用于回发
                        RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);                 
                    }
                }
                catch { }        }        private void CmdStop_Click(object sender, EventArgs e)
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//关闭socket            this.CmdStar.Enabled = true;
                this.CmdStop.Enabled = false;
                this.StateMsg.Text = "等待运行...";
                this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行.");
            }        private void ServerMain_FormClosed(object sender, FormClosedEventArgs e)
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//关闭SOCKET
                Application.Exit();
            }