TCP通信无法接收数据,代码如下: /// <summary>
       /// 声明获取事件的委托
       /// </summary>
       private delegate void SynReceive();
       /// <summary>
       /// 线程接收函数
       /// </summary>
        
       public void Receive()
       {
           
           try
           {
               string strRcv = "";
              // 声明字节数组,一次接收数据的长度为1024字节 
               byte[] RcvBuffer = new byte[1024];
               //循环读取,直到接收完所有数据 
               while (true)
               {
                   int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
                   //读取完成后退出循环 
                   if (bytes <= 0)
                       break;
                   //将读取的字节数转换为字符串 
                   strRcv += Encoding.ASCII.GetString(RcvBuffer,bytes,0);
                  
                   if (!txtRcv.InvokeRequired)
                   {
                       txtRcv.AppendText(strRcv);                   }
                   else
                   {
                       txtRcv.Invoke(new SynReceive(Receive));
                   }               }
               
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }       }

解决方案 »

  1.   

    你的Receive方法是只调用一次还是反复被调用,如果只调用一次应该收不到数据,因为被你“  if (bytes <= 0) break;”这个判断条件给干掉了。
    如果反复调用的话,你可以在While循环里面打断点看下具体的执行情况。
      

  2.   

    不一定是接收方的事,发送方也可能有问题。TCP的通讯我以前写过一个列子,你看一下。http://download.csdn.net/source/1095100
      

  3.   

    while语句是反复调用,打断点也执行,但是就是不能接收
      

  4.   

    while(true)
    {
      if(socket 有可读数据)
      {
         读取数据  
         // TCP 网络延迟状态下,发送数据过后,不一定会马上收到消息回复,所以外层先判断 是否有可读数据
      }
      else
      {
        System.Threading.Thread.Sleep(1);
      }
    }
      

  5.   

    利用TCP/IP协议收发数据之前要先建立连接,上面的代码中没有,不知道在其他地方有吗
      

  6.   


    既然你的接收函数一直被调用,那么你就得看看你的电脑是否收到这个报文,先确定是哪个层面上没接收到:
    1.报文没有送到你的电脑,通过ethereal等抓包软件查看有没有抓到这些应该接收得报文。
    2.如果第1步是接收到得,且端口地址都正确,一般情况下都会正常上送tcp层的,这个时候不用接收,直接查看socket上的接收到字节数的数据,如果字节数>0的话,说明tcp层也是传给你了的。
    ps:需要注意的,如果你用ethereal抓包看到在你建立tcp链接的端口上有“校验和”错误的报文,这个时候你要更改一下网卡的校验和模式(一般都是取消)。
      

  7.   

    1.断点查询你的bytes值是否为0
    2.应该是strRcv += Encoding.ASCII.GetString(RcvBuffer,0,bytes);
      

  8.   

    这是我全部的代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;namespace ClientTCP
    {
        public partial class ClientForm : Form
        {
            //声明端口号变量;
            private int port;
            //声明IP地址字符串变量
            private String strIP;
            //声明IP地址和端口信息
            private IPEndPoint ServerEP;
            //声明IP地址变量
            private IPAddress ip;
            //声明Socket变量
            private Socket socket;
            //声明线程
            private Thread thread;
            public ClientForm()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 打开连接
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpen_Click(object sender, EventArgs e)
            {
                if (!(socket == null) && socket.Connected)
                {
                    MessageBox.Show("连接已建立");
                    return;
                }
                try
                {
                    strIP = txtIP.Text.Trim();
                    //将IP地址字符串转化为IPAddress实例
                    ip = IPAddress.Parse(strIP);
                    port = Int32.Parse(txtPort.Text.Trim());
                    ServerEP = new IPEndPoint(ip, port);
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.Connect(ServerEP);
                    thread = new Thread(new ThreadStart(Receive));            }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            /// <summary>
            /// 关闭连接
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnClose_Click(object sender, EventArgs e)
            {
                if (!(socket == null) && socket.Connected)
                {
                    socket.Close();
                    socket = null;
                }
            }        private void btnSend_Click(object sender, EventArgs e)
            {
                if (socket == null && !(socket.Connected))
                {
                    MessageBox.Show("没有建立连接!");
                    return;
                }
                else
                {
                   if(!(txtSend==null))
                   {
                       BeginSend();
                   }
                }
            }
            /// <summary>
            /// 数据发送函数
            /// </summary>        private void BeginSend()
            {            try
                {
                    byte[] byteMessage;
                    if (socket.Connected)
                    {                    byteMessage = Encoding.ASCII.GetBytes(txtSend.Text+"\r\n");
                        socket.Send(byteMessage);
                        txtSend.Clear();                }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }               
                       }
           /// <summary>
           /// 声明获取事件的委托
           /// </summary>
           private delegate void SynReceive();
           /// <summary>
           /// 线程接收函数
           /// </summary>
            
           public void Receive()
           {
               
               try
               {
                   string strRcv = "";
                  // 声明字节数组,一次接收数据的长度为1024字节 
                   byte[] RcvBuffer = new byte[1024];
                   //循环读取,直到接收完所有数据 
                   while (true)
                   {
                       int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
                       ////读取完成后退出循环 
                       //if (bytes <= 0)
                       //    break;
                       //将读取的字节数转换为字符串 
                       strRcv= Encoding.ASCII.GetString(RcvBuffer);
                      
                       if (!txtRcv.InvokeRequired)
                       {
                           txtRcv.AppendText(strRcv);                   }
                       else
                       {
                           txtRcv.Invoke(new SynReceive(Receive));
                       }               }
                   
               }
               catch (Exception ex)
               {
                   MessageBox.Show(ex.Message);
               }       }
    帮忙解决一下
      

  9.   

    没绑定端口...而且你的SOCK是CONNECT到服务期的而不是监听
      

  10.   

    我做的是客户端的程序,在TextBox里输入IP还有端口
      

  11.   

    服务器端要监听,我在TextBox里输入IP还有端口,建立连接,再接收和发送数据
      

  12.   


    这哥们......唉......客户端没有显示绑定,就是系统自己选择一个不冲突的端口作为源端口来处理的,虽然tcp是双向链接,但是也要分客户端服务端。
      

  13.   

    、告诉我怎么解决问题就可以了,我自己是用NetworkStream写的接收,最近在学这方面的东西,
      

  14.   

    你的代码的问题出在下面,如果你是调试模式的话那么else语句100%会执行,也就是
    txtRcv.Invoke(new SynReceive(Receive))会执行。那请问你在这个语句前接收的数据,你放到哪了。if (!txtRcv.InvokeRequired)
      {
      txtRcv.AppendText(strRcv);  }
      else
      {
      txtRcv.Invoke(new SynReceive(Receive));
      }
      

  15.   

    private delegate void SynReceive(string str);
            /// <summary>
            /// 线程接收函数
            /// </summary>        public void RealRec(string str)
            {
                this.txtRcv.AppendText(str);
            }        private void Receive()
            {
                try
                {
                    string strRcv = "";                byte[] RcvBuffer = new byte[1024];                while (true)
                    {
                        int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);                    strRcv = Encoding.ASCII.GetString(RcvBuffer,0,bytes);                    if (!this.txtRcv.InvokeRequired)
                            this.txtRcv.AppendText(strRcv);
                        else
                            this.txtRcv.Invoke(new SynReceive(this.RealRec), new object[] { strRcv });
                        if (bytes <= 0)
                            break;
                    }            }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
      

  16.   

    我给你个数据你看能不能收到数据,如果能就是你的服务器的问题,如果不能就是接收端有错误。
    IP:119.75.217.56
    port:80
    request:GET / HTTP/1.1(这里加个回车)
    会返回百度的首页
      

  17.   

    帮我看看这个问题  纠结  楼主也可以看看里面的代码  类似
    http://topic.csdn.net/u/20110616/16/e1e83e95-1e82-4068-ba01-fa84be1a061b.html?42870
      

  18.   


    不能接收,是弹出错误提示,还是收不到数据?另外程序中的两个问题先说一下:1. 不要用socket.Connected来判断连接是否建立,即使在双方正在进行通信时它都可能是false,网上的解释很多,自己查一下。
        所以你的几个按钮都会出现判断错误的情况发生。2. int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
      如果RcvBuffer.Length不等于0,且未收到数据时,这条语句会报错,是吗,前两天帮人调试时,是这样
      

  19.   

    补充一下在接收时先做一下判断:  if(socket.Available!=0)
          int bytes = socket.Receive(RcvBuffer, RcvBuffer.Length, 0);
      

  20.   

    我做的是客户端的程序,在TextBox里输入IP还有端口
      

  21.   

    还真有早的啊,我还以为是你忘写了哪,如果是这样那就是你的线程没有启动,你只是创建了线程,应该用线程对象的Start()函数启动线程。
      

  22.   

    呵呵,Start()的问题我早就发现了,只是委托的方法我一直没用过,早上到现在一直在学习。
    代的代码很好,顺便学习,谢谢!