本帖最后由 kotiry 于 2014-04-21 20:46:56 编辑

解决方案 »

  1.   

    这个是等待数据 
    // 开始等待客户发送数据
            private void WaitForData(System.Net.Sockets.Socket socket, int clientNumber)
            {
                try
                {                SocketPacket socketPacket = new SocketPacket(socket, clientNumber);                if (pfnWorkerCallBack == null)
                    {
                        // 当连接上的客户有写的操作的时候,调用回调函数 
                        pfnWorkerCallBack = new AsyncCallback(OnDataReceived);                    socket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, socketPacket);
                    }
                    else
                    {
                        if (doit == null)
                        {
                            pfnWorkerCallBack = new AsyncCallback(OnDataReceived);                        socket.BeginReceive(socketPacket.dataBuffer, 0, socketPacket.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, socketPacket);
                        }
                    }
                }
                catch (SocketException)
                {
                    //MessageBox.Show(se.Message, "提示00");
                }
            }这个是 接受数据
     // 接收数据
            private void OnDataReceived(IAsyncResult asyn)
            {
                try
                { //object dd= theSockId.thisSocket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendBuffer);
                    
                    // EndReceive完成BeginReceive异步调用,返回服务器写入流的字节数
                    SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                    int iRx = theSockId.thisSocket.EndReceive(asyn);
                  
                    // 用UTF8格式来将string信息转化成byte数组形式
                    theSockId.sb.Append(System.Text.Encoding.UTF8.GetString(theSockId.buffer, 0, iRx));                //获取消息
                    string szData = theSockId.sb.ToString();                //清空已读消息
                    theSockId.sb.Remove(0, szData.Length);                // 等待数据                if (szData.Length > 0)
                    {
                        //处理获得的信息
                        
                        ByteCollectToFile(szData);
                       
                       
                    }                //清空缓冲区
                    Null = new byte[iRx];                theSockId.buffer = Null;                // 等待数据
                    WaitForData();            }            catch (ObjectDisposedException)
                {                //Socket已经关闭!
                    string msg = "-ConnError_1";                //传回信息
                    onServerMsg(msg);            }
                catch (SocketException se)
                {                if (se.ErrorCode == 10054)
                    {                    //服务器停止服务!
                        string msg = "-ConnError_0";                    //传回信息
                        onServerMsg(msg);                    clientSocket.Close();                    clientSocket = null;                }
                }
            }这个是我自定义的对象
      public class SocketPacket
        {        public System.Net.Sockets.Socket currentSocket;  // 当前的Socket
            public int clientNumber; // 客户号
            public const int BufferSize = 4096;
            public byte[] dataBuffer = new byte[BufferSize];  // 发给服务器的数据
            public StringBuilder sb = new StringBuilder();
            // 构造函数
            public SocketPacket(System.Net.Sockets.Socket socket, int clientNumber)
            {
                currentSocket = socket;
                this.clientNumber = clientNumber;
            }    }
      

  2.   

    这个是我自定义的对象  public class SocketPacket
        {        public System.Net.Sockets.Socket thisSocket;        public const int BufferSize = 1024*100;// 发给服务器的数据        public byte[] buffer = new byte[BufferSize];        public StringBuilder sb = new StringBuilder();
        }
      

  3.   

    确实是有大小限制的。循环去多获取不就行了。pfnWorkerCallBack扫了下代码,看到实例化了这个委托但没有去调用呢???
    如果循环去BeginReceive,虽然接收缓存是受限制了,但循环获取不会影响太多效率。