想通过tcpclient来发送信息到服务端,但必须每发送一次,就关闭链接重新发送(因为同一个客户端端口服务端不接受第二次信息) TcpClient tcpClient;
        BackgroundWorker bgWorkder = new BackgroundWorker();
 /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSend_Click(object sender, EventArgs e)
        {
          if (tcpClient != null)
            {
                tcpClient.Close();                //信息发送部分,没有使用异步
             IPAddress ip = IPAddress.Parse(txtIp.Text);
            IPEndPoint ipPoint = new IPEndPoint(ip, Convert.ToInt16(txtPort.Text));
            tcpClient = new TcpClient();
            tcpClient.Connect(ipPoint);            
            NetworkStream nStream = tcpClient.GetStream();
            nStream.Write(bytTotal, 0, bytTotal.Length);
                  //接收部分,使用异步等待接收
            if(bgWorkder.IsBusy)
{
return;
}
  // bgWorkder.CancelAsync();
           // bgWorkder.Dispose();
     bgWorkder.DoWork += new DoWorkEventHandler(bgWorkder_DoWork);
            bgWorkder.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorkder_RunWorkerCompleted);
            bgWorkder.RunWorkerAsync();
            }
  void bgWorkder_DoWork(object sender, DoWorkEventArgs e)
        {
            while (tcpClient.Connected)
            {
             if(bgWorkder.CancellationPending)
             {
             e.Cancel=true;
             break;
             }
            
                NetworkStream nStream = tcpClient.GetStream();
                byte[] buffer = new byte[8192];
                int received = nStream.Read(buffer, 0, buffer.Length);
                string recMsg = Encoding.GetEncoding("GB2312").GetString(buffer).Substring(0, received);
                if (recMsg.Length > 0)
                {
                    //待处理
                    string logStr = DateTime.Now.ToString() + "\t来自服务端\r\n" + recMsg;
                    logStr += "\r\n\r\n";
                    txtLog.AppendText(logStr);
                }
                Thread.Sleep(10);
            }
        }问题是,发送完一次后,能收到服务端返回的信息,第二次就不行了.

解决方案 »

  1.   

    每次发送后销毁backgroundworker重新发送也不行.
        bgWorkder.CancelAsync();
                bgWorkder.Dispose();
                bgWorkder = new BackgroundWorker();
                bgWorkder.WorkerSupportsCancellation = true;
      

  2.   

    好像是return造成的.
    取消判断isbusy直接销毁就可以了
      

  3.   

    你send在多次调用connect啊
    每调用一次。服务端给你发送数据的socket都是不一样的。
    能不能吧connect放出去。
    send的时候判断是否connect了。其他的代码可以不用改。