老师要我们小组编写一个类似qq的简单聊天程序,我们组遇到好几个问题无法解决如下:1.用多线程的话,是不是如果一个线程运行到函数的末尾就会自动释放掉这个线程占用的内存空间?还是运行完了只是终止了但是还是占用着一定的内存而一定要用abort终止掉它?终止之后还占内存吗?2.如果运行完了还是占内存的话,是否要用线程数组来手动终止每个线程?(不然一直新建线程都不知道放到哪里去了内存会不会爆掉?)3.作为客户端,如果有100个好友同时给你发消息,怎么用多线程处理这些消息?我是用TspListener来监听,每听到一个消息就new一个线程去处理它,但是由于线程的函数不能传参数,那么只能用全局变量来保存当前间听到的socket,但是如果new完一个线程并start之后,操作系统把它挂起,然后又监听到另外一条消息,这时全局的socket已经改变,当操作系统把第一个线程恢复之后不是已经出错了?4.如果按照第3点来做,第一个线程调用receive函数接收buffer之前被挂起,那监听到的第二条消息,是不是第一条的buffer就被淹没了?怎么办?5.线程执行的函数是不是要锁起来?暂时想到就这么多,作业下周交,十万火急啊!劳烦大家帮忙了!

解决方案 »

  1.   

    源代码:
            private Socket clientSocket;
            private TcpListener listener;
            private Thread mainThread;
            private int listenport = 3000;
            private IPAddress ipAddr;        public ServerForm()
            {
                InitializeComponent();
                ipAddr = new IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
                listener = new TcpListener(ipAddr, listenport);
                listener.Start();            mainThread = new Thread(new ThreadStart(StartListening));
                mainThread.IsBackground = true;
                mainThread.Start();
                mainThread.Suspend();
            }        private void StartListening()
            {
                while (true)
                {
                    try
                    {
                        Socket s = listener.AcceptSocket();
                        clientSocket = s;
                        Thread clientServiceThread = new Thread(new ThreadStart(ServiceClient));
                        clientServiceThread.Start();
                    }
                    catch (Exception e) { }
                }
            }        private void ServiceClient()
            {
                try
                {
                    Socket client = clientSocket;
                    Byte[] buffer = new Byte[16384];
                    client.Receive(buffer);
                    string clientCommand = System.Text.Encoding.ASCII.GetString(buffer);
                    string[] tokens = clientCommand.Split(new Char[] { '|' });
                }
                catch (Exception e) { }
            }
      

  2.   

    在线程运行的代码里面加上一句
    Thread.CurrentThread.Abort();
      

  3.   

    socket 好象内部有消息队列吧.
    你可以测试有下,同时有多人发消息,好象能自己排队,不会出现你那种情况.sockListen.Listen(100);
    while (true)
    {
      socket socketTemp = sockListen.Accept();
      /*
       *
       * 对socketTemp  进行处理。好象不会出现你说的那种情况.
       */
       sockTemp.Close(); // 关闭连接
    }