socket.Send();//发送的方法,内容,发送时成功的
      byte[] byData=null;
     int iCount=0;
     while(true)
     {
        iCount=socket.Available;
        if(iCount)
        {
            byData=new byte[iCount];
            socket.Receive(byData);
        }
     }
    socket发送完毕后,调试程序一直在接收数据,iCount有相同的字节的长度,如何知道数据接收完毕啊?

解决方案 »

  1.   

    比如quit,解析出这个指令就停止
      

  2.   

      socket编码我是新手,能否提供代码啊,谢谢
      

  3.   

    发送结束字符串,你接受完把byte[]数组转成字符串看看是不是这个结束字符串就行
      

  4.   

    你能发送信息了   那就发送一个“QUIT”标示结束
      

  5.   

    马马虎虎
    int num = socket.Receive(byData);
    string a = Encoding.Unicode.GetString(byData, 0, num);
    if(a == "quit")
    {
    结束了语句,你的程序应该是break
    }
      

  6.   

      谢谢,也就是发信息后 接着再发送一个quit 是吗?
       接收的时候再判断, 这里是不是设计到合包的问题啊?
      

  7.   

    if (_s.Available > 0)
                    {
                        byte[] bytes = new byte[szBuffer];
                        int c = _s.Receive(bytes, 0, szBuffer, SocketFlags.None);
                        bRead = true;
                        allbytes = DynamicBytes(bytes, c, allbytes);
                        if (c == 0) break; //结束
                        unRead = 0;
                    }
                    else
                    {
                        unRead++;
                        if (bRead) break;
                    }
      

  8.   

         楼上这个 allbytes = DynamicBytes(bytes, c, allbytes);
         有问题吧    
      

  9.   

    你要是用的tcp的话是有粘包现象的。你可以在每次发送数据的前n位设定此包的长度。接受的时候先读这前n位,然后循环接受。达到长度后跳出循环。这样包与包之间就分开了。
      

  10.   

    do
    {
    Thread.Sleep(1);
    if (_s.Available > 0)
      {
      byte[] bytes = new byte[szBuffer];//szBuffer 定义接收的长度
      int c = _s.Receive(bytes, 0, szBuffer, SocketFlags.None);//c为实际接收的长度,其实就是_s.Available
      bRead = true;//在接收
      allbytes = DynamicBytes(bytes, c, allbytes);//
      if (c == 0) break; //结束
      unRead = 0;//定义的超时量
      }
      else
      {
      unRead++;
      if (bRead) break;//结束
      }
    }while(unRead<3000);DynamicBytes(bytes, c, allbytes);
    合并接收的byte到allbytes上
    public byte[] DynamicBytes(byte[] n, int c, byte[] o)
            {
                byte[] a = new byte[o.Length + c];
                Array.Copy(o, a, o.Length);
                Array.Copy(n, 0, a, o.Length, c);
                n = null;
                o = null;
                return a;
            }
      

  11.   

    c为实际接收的长度,其实就是_s.Available
    这句注释错了,不一定是是_s.Available
      

  12.   

    建议你在While(ture)循环第一句加个sleep(1);要不你现在这个监听会占50%CPU时间
      

  13.   

    int num = socket.Receive(byData);
    string a = Encoding.Unicode.GetString(byData, 0, num);
    if(a == "quit")
    {
    结束了语句,你的程序应该是break
    }
      

  14.   

    源码楼上好像有人给了,那么从理论上给你点帮助吧.
    socket接收数据有3种方法可以获知 数据发送完毕.1,关闭socket.  如果对方关闭了socket,那么你循环接收会收到-1 这个时候就表示数据已经发送完毕,对方已经放弃并关闭这个通道.
    这个方式适用于短连接模式,典型的如HTTP. 如果你的使用场景里没有非要使用长连接使用一个通道发送多次数据的话 用模式1是很好的选择.2,半关闭socket, 对方关闭了输出流.3,订立协议,比如楼上几位描述的定义结束 符,比如'quit' 或者读取到指定的字节数.
      

  15.   

       allbytes是从哪里定义的啊?   我是做GPS的CORS系统数据接收的,发送的是GPGGA语句,返回的二进制数据 解码为“□”,一直在接收数据,接收的数据解码都为“□”,测试弹出MessageBox有相同的字节长度,请问我这里该如何处理?
      

  16.   

    int szBuffer = 10240;//10240
                byte[] allbytes = new byte[0];
                int unRead = 0;
                bool bRead = false;
                do
                {
                    Thread.Sleep(1);
                    if (_s.Available > 0)
                    {
                        byte[] bytes = new byte[szBuffer];
                        int c = _s.Receive(bytes, 0, szBuffer, SocketFlags.None);
                        bRead = true;
                        allbytes = DynamicBytes(bytes, c, allbytes);
                        if (c == 0) break;
                        unRead = 0;
                    }
                    else
                    {
                        unRead++;
                        if (bRead) break;
                    }
                }
                while (unRead < 3000);
      

  17.   

      谢谢sprc_lcl
     
        这样子会不会一直在接收数据呢?如何处理已经接收完毕,停止接收
      

  18.   

    不会一直在接收数据while (unRead < 3000);//解析 allbyte 就是接收的数据_s.Close();
      

  19.   

           if(iCount)这种代码可以编译通过?你确实是用c#编码吗?退出,就为if增加一个else break;就行了。
      

  20.   

    写一个 if(iCount),而且还写一个死循环,lz这程序自己看着难受吧!
      

  21.   

    我有个socket是这么写的
            public void recvMsg()
            {
                string date = string.Empty;
                Byte[] bytes = new Byte[1024];            while (true)    // #1为断开连接标识
                {
                    int recv_int = client.Receive(bytes);
                    date = Encoding.UTF8.GetString(bytes, 0, recv_int);
                    if (date == "#1")
                    {
                        form_main.BeginInvoke(showText_del, form_main.tbx_state, "客户端关闭了连接。");
                        break; 
                    }
                    if (date == "@2")
                    {
                        Shakingform shakingform = new Shakingform();
                        shakingform.Shakingform_start(form_main);
                    }
                    //输出接收的消息
                    form_main.BeginInvoke(showText_del, form_main.tbx_recv, date);
                }
            }
    #1   @2  就是用来标识的,比如发送#1就是断开连接的意思
      

  22.   

    socket的Available属性表示缓冲区中还有多少字节的数据需要receive。看看msdn或者google。
      

  23.   

      不是的,是少写了 if(iCount>0)
          我是用记事本写的代码,理解万岁,公司没网,只能到上网区
           
      

  24.   


    Array.Copy(n, 0, a, o.Length, c);
    不能编译通过啊
      

  25.   


    应该是(bytes, 0, allbytes); 
    int类型的
      

  26.   

    服务器端
     static void Main(string[] args)
            {
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点
                s.Bind(ipep);
                s.Listen(0);            
                Socket ls = s.Accept();
                byte[] recv = new byte[1024];
                int bytes = ls.Receive(recv, recv.Length, SocketFlags.None);
                string receive = Encoding.ASCII.GetString(recv, 0, bytes);
                Console.WriteLine(receive);
                string send = "Hello ,I am Server!";
                byte[] sd = Encoding.ASCII.GetBytes(send);
                ls.Send(sd, sd.Length, SocketFlags.None);
                ls.Close();
               
                s.Close();
                Console.ReadLine();
            }
    客户端
     static void Main(string[] args)
            {
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);//定义一网络端点
                s.Connect(ipep);
                string send = "Hello,I am Client!";
                byte[] sd = Encoding.ASCII.GetBytes(send);
                s.Send(sd,sd.Length,SocketFlags.None);            string receive = "";
                byte[] recv = new byte[1024];
                int bytes;
                bytes = s.Receive(recv,recv.Length,SocketFlags.None);            receive = Encoding.ASCII.GetString(recv, 0, bytes);
                Console.WriteLine(receive);
                
                Console.ReadKey();            s.Close();
            }
    你可以试试这个最简单的通信
    你那个if 太麻烦
      

  27.   

    如果是TCP的话只能根据协议,因为TCP是流,两次接收的数据没有明显的界限。可以在信息前边加一个header结构,header结构中包括消息的长度。接收指定的长度就是一个完整的数据包。
    如果是UDP,每次发送的信息量不是很大的话(最好小于1500byte),每次接收的消息包就是一条完整的数据。
      

  28.   


      如何在信息前加一个header啊,能否给个源码例子啊?