private TcpListener _listener;
        public static TcpClient _client;
        private int _listenterPort = 8401;
        private Thread clientservice;
        private DateTime Time;
        public static string str1 = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        public static string tempPath = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString();
        private delegate void AddTest(string message);
        private Thread theadLisener;
        private int n = 1;  
        private int max = 10;
        private object monitor = new object(); 
        public Form1()
        {
            InitializeComponent();
            theadLisener = new Thread(new ThreadStart(Listen));
            theadLisener.Start();
            
        }        static public object LockShare = new object();           
    
        public void Listen()
        {
            AddTest add = new AddTest(AddListBox);
            _listener = new TcpListener(_listenterPort);
            try
            {
                _listener.Start();
            }
            catch(Exception ex)
            {
                SendNotice.SendBoth("监听错误", ex.Message, "启动监听");
            }
             
            this.BeginInvoke(add, new object[] { "开始侦听" });
            while (true)
            {
                try
                {                    _client = _listener.AcceptTcpClient();
                    this.BeginInvoke(add, new object[] { _client.Client.RemoteEndPoint.ToString() + "已经建立好连接" });
                    clientservice = new Thread(new ThreadStart(this.ServiceClient));
                    clientservice.Start();
                  
                    //ManualResetEvent vent = new ManualResetEvent(false);
                    //ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceClient));
                   
                    //vent.WaitOne(Timeout.Infinite, true);                }
                catch (Exception ex)
                {
                    this.BeginInvoke(add, new object[] { ex.Message });
                }
            }
        }
        private void test(object state)
        { }        private void ServiceClient()
        {
            AddTest add = new AddTest(AddListBox);
            bool keepalive = true;
            string md5 = "";
            while (keepalive)
            {
                lock (monitor)
                {
                    for (; n < max; n++)
                    {
                        try
                        {
                            byte[] bytes = new byte[1024];
                            NetworkStream stream = _client.GetStream();
                            int count = stream.Read(bytes, 0, bytes.Length);
                            Time = DateTime.Now;
                            if (File.Exists(tempPath))
                            {
                            }
                            else
                            {
                                Directory.CreateDirectory(str1 + tempPath);                            }                            string fileTime = Time.Year.ToString() + Time.Month.ToString() + Time.Day.ToString() + "-" +
                                            Time.Hour.ToString() + Time.Minute.ToString() + Time.Second.ToString();
                            string fileName = str1 + tempPath + "\\" + fileTime + ".xml";
                            if (count > 0)
                            {
                                FileStream fstream = new FileStream(fileName, FileMode.Create);
                                fstream.Write(bytes, 0, count);
                                fstream.Close();
                                string type = this.Check(fileName).ToLower().Trim();
                                if (type.Equals("request"))
                                {
                                    System.Random rad = new Random();
                                    string radCode = rad.Next(10000000, 99999999).ToString();                                    writeSequence(radCode);
                                    FileStream fs = new FileStream(str1 + "sequence.xml", FileMode.Open);
                                    byte[] buffer = new byte[fs.Length];
                                    fs.Read(buffer, 0, buffer.Length);
                                    stream.Write(buffer, 0, buffer.Length);                                    _client.Client.Send(buffer, buffer.Length, 0);
                                    fs.Dispose();
                                    md5 = MD5Encrypt(radCode, 32);
                                }
                                else if (type.Equals("md5"))
                                {
                                    string md_5 = GetMD5(fileName);
                                    if ((md_5 == md5) && !md5.Equals(""))
                                    {
                                        writeResult(true);
                                        FileStream fs = new FileStream(str1 + "result.xml", FileMode.Open);
                                        byte[] buffer = new byte[fs.Length];
                                        fs.Read(buffer, 0, buffer.Length);
                                        stream.Write(buffer, 0, buffer.Length);
                                        this.BeginInvoke(add, new object[] { "MD5验证通过。" });
                                        fs.Dispose();
                                    }                                    else
                                    {
                                        writeResult(false);
                                        FileStream fs = new FileStream(str1 + "result.xml", FileMode.Open);
                                        byte[] buffer = new byte[fs.Length];
                                        fs.Read(buffer, 0, buffer.Length);
                                        stream.Write(buffer, 0, buffer.Length);
                                        fs.Dispose();                                        //  this.BeginInvoke(add, new object[] { "MD5验证失败,连接关闭。" });
                                        _client.Close();
                                        clientservice.Abort();
                                    }
                                }
                                else
                                {                                    SqlTool st = new SqlTool();
                                    st.createCon();
                                    bool existEnergy = getEnergy(fileName);
                                    if (existEnergy)
                                    {
                                        try
                                        {
                                            insertSql(fileName);
                                            this.BeginInvoke(add, new object[] { DateTime.Now.ToString() + "数据入库。" });
                                        }
                                        catch
                                        { }                                    }
                                    else
                                    {
                                        SendNotice.SendBoth("接收文件", "不是能耗文件", "接收服务");
                                    }                                }
                            }                        }
                        catch (Exception ex)
                        {                            clientservice.Abort();
                            this.BeginInvoke(add, new object[] { ex.Message });
                            SendNotice.SendBoth("接收文件", ex.Message, "接收服务");                        }
                       
                    } 
                    Monitor.Wait(monitor);
                }            }
        }
不知道怎么改了 有两个客户端链接 第一次的时候两个都可以发送过数据 之后就只有后面开启的那个客户端能够发过来数据  急急急!!!!!!!

解决方案 »

  1.   

    应该是服务器端监听端口,如果监听到连接则开线程处理,将接收到的socket传到线程里
      

  2.   

     _client = _listener.AcceptTcpClient(); 
                        this.BeginInvoke(add, new object[] { _client.Client.RemoteEndPoint.ToString() + "已经建立好连接" }); 
                        clientservice = new Thread(new ThreadStart(this.ServiceClient)); 
                        clientservice.Start(); 
    是一直监听状态 这个没问题 来了两个客户端就开两个线程执行  异步调用和这个不是一个概念。
    第一次两个客户端链接的时候正常 一会就会丢失一个客户端??????请高手指教。。
      

  3.   

      
    TcpClient s1 = tl.AcceptTcpClient();
    Thread objthread = new Thread(new ParameterizedThreadStart(aa));
                objthread.Start(s1);线程函数
      void aa(object ss)
            {
                    TcpClient s = (Socket)ss;
                    .....
            }
      

  4.   


    TcpClient s = (Socket)ss;
     这个不能隐式转换   能怎么变通一下
      

  5.   

    不好意思,我打错了
    应该是TcpClient s = (TcpClient)ss; 
    之后s.Client.Send()等同于socket对象的send函数,receive函数一样
    不好意思啊