Ctaolling 2016-08-12 04:01 采纳率: 0%
浏览 1224

大神看看,我这个是C#的聊天程序,连接多个客户端以后,通讯就会乱掉,只有最后一个连接的正常通讯

代码贴出来
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
using System.IO;

namespace server2
{
public partial class serverMain : Form
{
private NetworkStream nsStream;
private IPAddress ip;
private int port;
private TcpListener server;
Thread acceptThread;
Thread threadCommunicate;
private List clients = new List();
Dictionary dict = new Dictionary();

    public serverMain()
    {
        InitializeComponent();
        ChatContent.AppendText("欢迎\n");
        ip = IPAddress.Parse(IP2.Text);
        port = Convert.ToInt32(port_tb.Text.Trim());
    }



    private void connect(object sender, EventArgs e)//开启服务器
    {
        stop_btn.Enabled = true;
        server = new TcpListener(ip, port);
        server.Start();//开始侦听
        ChatContent.Text = ChatContent.Text.Insert(0, "开始侦听\n");
        start_btn.Enabled = false;
        Thread ListenClient = new Thread(RecClient);
        ListenClient.Start();

    }



    void RecClient()
    {
        while (true)
        {
            TcpClient client = new TcpClient();
            try
            {
                client = server.AcceptTcpClient();
                clients.Add(client);
            }
            catch (Exception ex)
            {
                MessageBox.Show("服务端连接时发生异常:" + ex.Message);
                break;
            }
            //当有新的socket连接到服务端时就将IP添加到在线列表中,作为客户端的唯一标识                
            client_list.BeginInvoke(new Action(() => { client_list.Items.Add(client.Client.RemoteEndPoint.ToString());}));

            //将每个新产生的套接字存起来,装到键值对Dict集合中,以客户端IP:端口作为key
            dict.Add(client.Client.RemoteEndPoint.ToString(), client);

            //为每个服务端通信套接字创建一个单独的通信线程,负责调用通信套接字方法,监听客户端发来的数据
            //创建通信线程
            threadCommunicate = new Thread(acceptClientConnect);
            threadCommunicate.Start(client);//有传入参数的线程


        }
    }


    private void acceptClientConnect(object client)//接收信息
    {
        string msgUsers = "LIST";
        string ipstr = null;
        try
        {
            TcpClient tcpClient = (TcpClient)client;
            nsStream = tcpClient.GetStream();
            //byte[] ppp = new byte[100000];
            //tcpClient.Client.Receive(ppp);

            string str = Convert.ToString(tcpClient.Client.RemoteEndPoint);//发消息的客户端的信息
            ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":已连接\n"); }));


            //listlist();
            msgUsers = "LIST";
            foreach (TcpClient p in clients)
            {
                ipstr = Convert.ToString(p.Client.RemoteEndPoint);//所有客户端信息
                msgUsers = msgUsers + "|" + ipstr;
            }
            foreach (TcpClient p in clients)
            {
                nsStream = p.GetStream();
                Byte[] bytes = System.Text.Encoding.Default.GetBytes(msgUsers.ToCharArray());
                nsStream.Write(bytes, 0, bytes.Length);//发送所有客户端信息到连接的客户端
            }




            while (true)
            {
                try
                {
                    byte[] buff = new byte[4096];
                    int len;
                    string msg;// msg1 = Convert.ToString(client_list.Text);

                    len = nsStream.Read(buff, 0, buff.Length);
                    msg = System.Text.Encoding.Default.GetString(buff, 0, len);
                    string[] accept = msg.Split(new char[] { '|' });


                    if (accept[0] == "msg")//发送到服务器
                        ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":" + accept[1] + "\n"); }));
                    else if (accept[0] == "pmsg")//点对点发送
                    {
                        nsStream = dict[accept[1]].GetStream();
                        Byte[] bytes2 = System.Text.Encoding.Default.GetBytes((str+"——>我:"+accept[accept.Length - 1]).ToCharArray());
                        nsStream.Write(bytes2, 0, bytes2.Length);
                        ChatContent.BeginInvoke(new Action(() => { ChatContent.AppendText(str + "——>" + accept[1] + ":" + accept[accept.Length - 1]); }), null);//显示在服务器列表
                    }//发送到指定客户端



                    else if (accept[0] == "STOP")//断开连接
                    {
                        clients.Remove(tcpClient);
                        //listlist();
                        msgUsers = "LIST";
                        foreach (TcpClient p in clients)
                        {
                            ipstr = Convert.ToString(p.Client.RemoteEndPoint);//所有客户端信息
                            msgUsers = msgUsers + "|" + ipstr;
                        }
                        foreach (TcpClient p in clients)
                        {
                            nsStream = p.GetStream();
                            Byte[] bytes = System.Text.Encoding.Default.GetBytes(msgUsers.ToCharArray());
                            nsStream.Write(bytes, 0, bytes.Length);//发送所有客户端信息到连接的客户端
                        }



                        client_list.BeginInvoke(new Action(() =>
                        {
                            int index = client_list.Items.IndexOf(str); client_list.Items.RemoveAt(index);
                        }
                        ), null);
                        ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, str + ":" + accept[1] + "\n"); }));
                        //tcpClient.Close();//关闭连接
                        return;
                    }
                }
                catch (Exception ex)
                {
                    ChatContent.BeginInvoke(new Action(() => { ChatContent.Text = ChatContent.Text.Insert(0, "错误信息:" + ex.Message + "\n"); }), null);
                    break;
                }
            }

        }
        catch (Exception )
        {
        }

    }






    private void stop_btn_Click(object sender, EventArgs e)//关闭服务器
    {
        start_btn.Enabled = true;
        stop_btn.Enabled = false;
        ChatContent.Text = ChatContent.Text.Insert(0, "服务器已关闭\n");
        server.Stop();
    }

    private void serverMain_Load(object sender, EventArgs e)
    {
        Info.ServerListBox = this.client_list;
    }

    private void stop_btn_Click_1(object sender, EventArgs e)
    {

    }
}

}

    /* Action pAction = new Action(() => {
                   try
                   {
                       while (true)
                       {
                           TcpClient client;
                           client = server.AcceptTcpClient();
                           clients.Add(client);
                           //this.ChatContent.AppendText("用户已连接\n");
                           //Socket s = client.Client;
                           //client_ip = IPAddress.Parse(GetRemoteIP(client));
                           Thread listenthread = new Thread(new ParameterizedThreadStart(listenForClient));
                           listenthread.Start(client);
                       }
                   }
                   catch (Exception ex)
                   {
                       //this.ChatContent.AppendText(ex.Message+"\n");
                   }
               });
               //pAction.BeginInvoke(null, null);

           }
           private void listenForClient(object client)
           {
               TcpClient tcpClient = (TcpClient)client;
               //Socket s = tcpClient.Client;
               //IPAddress client_ip = IPAddress.Parse(GetRemoteIP(tcpClient));
               //int port = Convert.ToInt32(GetRemotePort(tcpClient));//获取IP和端口
               //ChatContent.AppendText("用户:"+client_ip+":"+port+"已连接\n");

               nsStream = tcpClient.GetStream();
               byte[] buff = new byte[4096];
               int len;
               string msg;
               //Invoke(new addHandler(add), ChatContent, msg);  

               while (true)
               {
                   try
                   {
                       len = nsStream.Read(buff, 0, buff.Length);
                       msg = System.Text.Encoding.Default.GetString(buff, 0, len);
                       ChatContent.AppendText(msg);
                   }
                   catch (Exception ex)
                   {
                       ChatContent.AppendText(ex.Message+"\n");
                   }
               }*/
  • 写回答

1条回答 默认 最新

  • Ctaolling 2016-08-12 08:21
    关注

    自己顶一下,没有人来啊

    评论

报告相同问题?

悬赏问题

  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集