public string Listen()
        {
            tcpl = new TcpListener(Dns.GetHostAddresses(Environment.MachineName)[0], port);
            tcpl.Start();
            string strMsg = "";
            {
                byte[] packetBuff = new byte[4 * 1024];  
                newClient = tcpl.AcceptSocket();     
                newClient.Receive(packetBuff);
               
                strMsg = Encoding.Default.GetString(packetBuff);
            }
            return strMsg.Trim();
        }这里是sendpublic void Send(string msg)
        {
            byte[] bytesSendStr = new byte[1024];
            bytesSendStr = Encoding.Default.GetBytes(msg);
            try
            {
                 s.Send(bytesSendStr, bytesSendStr.Length,0);
            }
            catch (ArgumentNullException ae)
                { MessageBox.Show("ArgumentNullException:" + ae.Message.ToString()); }
        }第一次点发送时消息可以正确发送,客户端可以收到。第二次再点执行执行到 newClient = tcpl.AcceptSocket();  后面就不执行了(Send执行了),大家帮忙啊,是不是监听的端口没有数据到达?为什么第一次点就有数据到达呢?我把代码传到附件里了,哪位帮我看下或者帮我改下发上来,发到我邮箱里也行: [email protected]  谢谢啊!

解决方案 »

  1.   

    因为Receive(packetBuff);只执行一次啊
    这句代码应该要放在死循环当中才会不断的接受数据
    另外,死循环会导致界面失去响应,所以Listen方法应该用一个新线程去执行
      

  2.   

    不对啊,我界面调用的时候是这样写的:
    void TCPListen()
            {
                while (Thread.CurrentThread.ThreadState.Equals(System.Threading.ThreadState.Background))
                {
                    lock (this)
                    {
                        string strMsg = se.Listen(); //se.Listen()就是那个Listen方法
                        SetText(strMsg);
                    }
                }
            }//是个死循环
    Listen方法是在新线程里.是不是newClient = tcpl.AcceptSocket()这句第二次执行时没接收到数据啊?为什么第一次接收到了呢?
      

  3.   

    tcpl.AcceptSocket()执行一次即可,不要放入循环
      

  4.   

    搞定了,确实是把tcpl.AcceptSocket()放在循环体外,谢谢!!
      

  5.   


    搞错了
    tcpl.AcceptSocket()要循环执行,每次开一个新线程处理