private void button1_Click(object sender, System.EventArgs e)
        {
            IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
            int port = Convert.ToInt32("8080");
            MyTcpListener = new TcpListener(ipAddress, port);
            MyTcpListener.Start();
        //    while (true)//没有while循环就可以运行单个客户端的,怎样使一个服务器对应多个客户端??这样不行??
         //   {
                try
                {
                    Socket s = MyTcpListener.AcceptSocket();
                    SocketForClient = s;
                    listenThread = new Thread(new ThreadStart(Listen));
                    listenThread.Start();
                }
                catch (Exception ee)
                {
                    textBox2.Text = ee.Message;
                }        //   }           
        }
        private void Listen()
        {           
            if (SocketForClient.Connected)
            {
                textBox3.Text = "Client Connects Success !\r\n";
                MyNetworkStream = new NetworkStream(SocketForClient);
                MyStreamReader = new StreamReader(MyNetworkStream);
                MyStreamWriter = new StreamWriter(MyNetworkStream);
                recvThread = new Thread(new ThreadStart(RecvData));
                recvThread.Start();
            }

解决方案 »

  1.   

    聊天的话我感觉udp比较好 侦听一个端口 然后判断网络地址
      

  2.   

    接受任意端口和地址的消息(ipAddress.any, 0)
      

  3.   

    你要问的是什么用TCP就得这样啊
      

  4.   

    是这样,可以上面的程序代码没有while循环时只能够正确运行一个服务器和一个客户端的发送和接收信息。
    我希望,能够在哪里加上while循环,创建多个Socket来运行一个服务器和多个客户端
    服务器和每个客户端都能够独立的发送和接收信息,而不受其他的干扰
      

  5.   


    using System;
    using System.Collections.Generic;
    using System.Linq;using System.Threading;
    using System.Net;
    using System.Net.Sockets;
    namespace ConsoleApplication20
    {
        class CSocket
        {
          List<User> userList = new List<User>();
         
           
            IPAddress localAddress;
            private int port = 51888;
            private Socket myListener;
            private Service service;
            public CSocket()
            {
                Console.WriteLine("--------------------------------------"); 
                service = new Service();
            }
            public void  StartCSocket()
            {  
               
                myListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
                localAddress = addrIP[0];
                myListener.Bind(new IPEndPoint(localAddress,port));
                myListener.Listen(0);
                Console.WriteLine("开始监听{0}:{1}",localAddress.ToString(),port.ToString());
                ThreadStart ts = new ThreadStart(ListenClientConnect);
                Thread myThread = new Thread(ts);
                myThread.Start();
            }        private void ListenClientConnect()
            {
                while (true)
                {
                    Socket newClient;
                    try
                    {
                         newClient = myListener.Accept();
                         
                    }
                    catch
                    {
                        break;
                    }
                    ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);
                    Thread threadReceive = new Thread(pts);
                    User user = new User(newClient);
                    threadReceive.Start(user);
                    userList.Add(user);
                    Console.WriteLine("{0}进入",newClient.RemoteEndPoint.ToString());
                    Console.WriteLine("当前连接用户数:{0}",userList.Count.ToString());            }
            }
            private void ReceiveData(object obj)
            {
                User user = (User)obj;
                Socket client = user.client;
                bool normalExit = false;
                bool exitWhile = true;
                while (exitWhile == true)
                {
                    string receiveString = null;
                    try
                    {
                        receiveString = user.sr.ReadLine();
                    }
                    catch
                    {
                        Console.WriteLine("接收数据失败");
                    }
                    if (receiveString == null)
                    {
                        if (normalExit == false)
                        {
                            if (client.Connected == true)
                            {
                                Console.WriteLine(string.Format("与{0}失去联系,",client.RemoteEndPoint));
                            }
                        }
                        break;
                    }
                    string[] splitString = receiveString.Split(',');
                    string sendString = "";
                    switch (splitString[0])
                    {
                        case "Login":
                            user.userName = splitString[1].ToString();
                   sendString="OnlineUser,"+this.GetOnlineString();
                   service.SendToAll(userList,sendString); //把在线用户信息传送给在线用户                        break;
                        case "Logout": //退出
                           // service.SendToAll(userList,user.userName);
                            normalExit = true;
                            exitWhile = true;
                            break;
                         //Talk,发送人名称,收件人名称,信息
                        case "Talk":
                            sendString = string.Format("Talk,{0},{1},{2},{3}", user.userName, splitString[1], splitString[2],splitString[3]);                            
                            service.SendToMsg(userList,sendString);
                            break;
                    }
                   
                }            userList.Remove(user);
                client.Close();
           Console.WriteLine(string.Format("有一个退出,剩余连接用户数:{0}", userList.Count));
          
            }
            private string  GetOnlineString()
            {
                string str =string.Empty;
                for (int i = 0; i < userList.Count; i++)
                {
                    str += userList[i].userName+",";
                }
                return str.Trim();
              
            }
        }
    }using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Net.Sockets;
    namespace ConsoleApplication20
    {
        class User
        {
            public Socket client;
            public StreamReader sr;
            public StreamWriter sw;
            public string userName;
            public User(Socket client)
            {
                this.client = client;
                this.userName = "";
                NetworkStream netSream = new NetworkStream(client);
                sr = new StreamReader(netSream);
                sw = new StreamWriter(netSream);        }
        }
    }using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication20
    {
        class Service
        {           public void SendToOne(User user, string str)
            {
                try
                {
                    user.sw.WriteLine(str);
                    user.sw.Flush();
                    Console.WriteLine(string.Format("向{0}发送{1}",user.userName,str));
                }
                catch
                {
                    Console.WriteLine(string.Format("向{0}发送信息失败", user.userName));
                }
            } //向某个人发信息
            public void SendToAll(List<User> userList,string str)
            {            for (int i = 0; i < userList.Count; i++)
                {
                    SendToOne(userList[i],str);            }
            } //向所有人发送信息
            public void SendToMsg(List<User> userList,string str)
            {
                string [] msg = str.Split(',');
                for (int i = 0; i < userList.Count; i++)
                {
                    if (userList[i].userName == msg[2].ToString())
                    {
                        SendToOne(userList[i],str);                }
                   
                }
              
            }    }
    }
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
    namespace WindowsApplication3
    {
        public partial class Form1 : Form
        {
            private TcpListener MyTcpListener;
            private Socket  SocketForClient;
            private Thread listenThread;
            private Thread recvThread;
            private NetworkStream MyNetworkStream;
            private StreamReader MyStreamReader;
            private StreamWriter MyStreamWriter;
            
            public Form1()
            {
                    InitializeComponent();
                    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
                    textBox1.Text = "Tracy";
            }        private void button1_Click(object sender, System.EventArgs e)//启动服务器
            {
                
                IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
                int port = Convert.ToInt32("8080");
                MyTcpListener = new TcpListener(ipAddress, port);
                MyTcpListener.Start();
                try
                {
                //    while(true)
                //    {
                        Socket s = MyTcpListener.AcceptSocket();
                        SocketForClient = s;
                       
                 //   }
                        listenThread = new Thread(new ThreadStart(Listen));
                        listenThread.Start();
                }
                catch (Exception ee)
                {
                    textBox3.Text += ee.Message + "\r\n";
                }
                                   
            }
            private void Listen()
            {           
            
                if (SocketForClient.Connected)
                {
                    textBox3.Text = "Client Connects Success !\r\n";
                    MyNetworkStream = new NetworkStream(SocketForClient);
                    MyStreamReader = new StreamReader(MyNetworkStream);
                    MyStreamWriter = new StreamWriter(MyNetworkStream);
                    recvThread = new Thread(new ThreadStart(RecvData));
                    recvThread.Start();
                }
            }
            private void RecvData()//接收数据
            {
                string msg = MyStreamReader.ReadLine();
                while (!msg.Equals("exit"))
                {
                    textBox3.Text +=  msg + "\r\n";
                    msg = MyStreamReader.ReadLine();
                }
                textBox3.Text += msg + "\r\n";
                ReleaseResource();
            }        private void button2_Click(object sender, EventArgs e)//发送数据
            {
                MyStreamWriter.WriteLine(textBox1.Text +"::"+ textBox2.Text);
                MyStreamWriter.Flush();
                textBox3.Text += textBox1.Text+"::" +textBox2.Text + "\r\n";
                textBox2.Text = "";        }        private void button3_Click(object sender, EventArgs e)//断开服务器
            {
                string exitMsg = "exit";
               MyStreamWriter.WriteLine(exitMsg);
               MyStreamWriter.Flush();
                textBox3.Text = "Client Close!";
                ReleaseResource();     
            }
            private void ReleaseResource() //释放资源
            {            
                MyTcpListener.Stop();
               SocketForClient.Shutdown(SocketShutdown.Both);
                MyNetworkStream.Close();
                MyStreamReader.Close();
               MyStreamWriter.Close();
                listenThread.Abort();                 
                recvThread.Abort();            
            }   }
    }
    这个是有界面的,一对一是没有问题的,问题是现在要一个服务器能够独立对应多个客户端,不知道要改哪里
      

  7.   


    Socket s = MyTcpListener.AcceptSocket(); 
    //客户端连接时,都会生一个s,那么你用一个集合来存这个s
    //服务器向多个客户端发送信息事,就是遍历这些s然后发送信息就行了
    //我上面的代码写得很清楚了,还是控制台的,你直接Copy就可以学习一下了