首先服务端,设置了发给客户端的标题和内容,点击发送按钮,让连接上的客户端进行接收//服务端发送按钮
 private void btnsendClient_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < workerSocketList.Count; i++)
            {
                if (workerSocket != null)
            {
            if (workerSocket.Connected)
                {
                string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
                        string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
                        string clientAll = clientTitle + clientInfo;
                        Net.SendData(workerSocket, clientAll, 10000);
                }
            }
                
            }
            
        }
客户端接收信息,并把信息的标题和内容分别存放于lblCLientTitle和lblClientInfo中。最后把这两个label的内容放在一个窗体中进行显示。else if (szData.IndexOf("-a",0,szData.Length)==0)       //服务端发送过来的用于显示的标题
            {
                //去掉命令头"-a"
                szData = szData.Remove(0,2);
                lblClientTitle.Invoke((EventHandler)delegate
                {
                    lblClientTitle.Text = "";
                    int tempb = szData.IndexOf("-b", 0, szData.Length);
                    lblClientTitle.Text = szData.Substring(0, tempb);
                    szData = szData.Remove(0,tempb);
                });
                if (szData.IndexOf("-b", 0, szData.Length) == 0)   //服务端发送过来的用于显示的内容
                {
                    //去掉命令头"-b"
                    szData = szData.Remove(0, 2);
                    lblClientInfo.Invoke((EventHandler)delegate
                    {
                        lblClientInfo.Text = "";
                        lblClientInfo.Text = szData;
                    });
                    
                }
               
 private void BrownForm()
        {
            if ((lblClientTitle.Text.Trim() != "") && (lblClientInfo.Text.Trim() != ""))
            {
                ShowForm showForm = new ShowForm();
                ShowForm.clientTitle = lblClientTitle.Text.Trim();
                ShowForm.clientInfo = lblClientInfo.Text.Trim();
                showForm.Show();
                lblClientTitle.Text = "";
                lblClientInfo.Text = "";
            }
        }问题是,我同时打开多个客户端,所有发送过来的信息都显示在最后一个客户端上。
例如:
服务端发送的标题是777,内容是888如果有三个客户端接入的话,发送过来的内容就成了
标题777
内容888-a777-b888-a777-b888 我想让它们分别显示在不同客户端的相应窗体上!
这个问题已经困扰我两天了,应该不是太难的问题,我就是理不清头绪,请高手赐教!感谢,感谢!

解决方案 »

  1.   

    说明workerSocketList里保存的Socket对象是同一个(最后连接的)
    一定是客户端请求连接时建立的socket对象没有区分,把建立连接代码贴出来看看就明了了
      

  2.   

    建议用连个TcpClient对象,一个接,一个记录保存每个连接上来的用户。
      

  3.   

    服务端的连接代码#region 连接使用Tcp协议的服务端
            public static Socket ConnectServer(string ip, int port)
            {
                Socket s = null;
                try
                {
                    IPAddress ipAddress = IPAddress.Parse(ip);
                    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,port);
                    s = new Socket(ipEndPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
                    s.Connect(ipEndPoint);
                    if (s.Connected == false)
                        s = null;
                }
                catch (Exception e)
                {
                    Log.WriteLog(e);
                }
                return s;
            }
            #endregion客户端的连接代码 #region 连接使用 tcp 协议的服务端  
            /// <param name="ip">服务端的ip地址</param>                                                                                      
            /// <param name="port">服务端的端口号</param>                                                                                    
            /// <returns></returns>    static                                                                                                      
            public static Socket ConnectServer(string ip, int port)
            {
                Socket s = null;            try
                {
                    IPAddress ipAddress = IPAddress.Parse(ip);
                    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
                    s = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    s.Connect(ipEndPoint);
                    if (s.Connected == false)
                    {
                        s = null;
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                    Log.WriteLog(e);
                }
                return s;
            }
            #endregion对于线程分区,请高手举个例子,给个代码参考也好!
      

  4.   

    这个workerSocketList的赋值肯定有问题
      

  5.   

    private void btnsendClient_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < workerSocketList.Count; i++)
                {
                    if (workerSocket != null)
                    {
                        if (workerSocket.Connected)
                        {
                            string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
                            string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
                            string clientAll = clientTitle + clientInfo;
                            Net.SendData(workerSocket, clientAll, 10000);
                        }
                    }
                    
                }
                
            }你在for (int i = 0; i < workerSocketList.Count; i++)这个地方下断点,看看你发送的目标,当客户端接收到服务端的信息时,每个客户端是同时接受到的是3条回复,他没有区分哪个回复是针对自己的。(你的3个客户端应该是在同一台机器上)。
    说明白点就是你克隆3个自己,邮递员有3封信件要给你,可是来到你家,发现有3个一模一样的人,只好每人给
    3封同样的信件!
      

  6.   

    我自己的解决办法是:
    #region "发送至客户端"的信息
            private void btnsendClient_Click(object sender, EventArgs e)
            {
                string clientTitle = "-a" + txtClientTitle.Text.Trim(); //"-a"是标识发送标题
                string clientInfo = "-b" + rtboxClientInfo.Text.Trim();//"-b"是标识发送内容
                string clientAll = clientTitle + clientInfo;
                Socket sock = null;
                for (int i = 0; i < workerSocketList.Count; i++)
                {
                    sock = (Socket)workerSocketList[i];
                    if (sock != null)
                {
                if (sock.Connected)
                    {
                    
                            Net.SendData(sock, clientAll, 10000);
                    }
                }
                    
                }
                
            }
    #endregion问题的原因是:所有客户端共用一个socket,导致把消息只发给了最后一个接入的客户端。应该为每个客户端都建立一个socket,就可以了!
      

  7.   

    哇,所有客户端共用一个Socket...LZ有没有在不同的机子上测试过啊?
    还有,LZ有没有订立协议啊,订立协议是个好办法哦