日期:2014-05-18 浏览次数:20978 次
private void Write() { // 将二进制数据写入缓冲区bufferManager } private void Packet() { // 将缓冲区bufferManager中的待发数据打包(添加自定义协议) } private void Send()// 将缓冲区bufferManager中已打包数据异步发送 { Socket handler = _session.ClientSocket; //从缓冲区中循环读取 //while(sentSize<fileSize) //{ byte[] data = bufferManager.GetSendBuffer(); int sSize = data.Length;//实际应该取数据有效长度,这里简单使用data.Length只为代码清晰易读 if(sSize>0) { //测试bufferManager类时,这里用Stream类来将数据写盘 handler.BeginSend(data, 0, data.Length, SocketFlags.None, //开始异步发送 new AsyncCallback(sendCallback), handler); } sentSize += sSize; //} //bufferManager.SentDone = true; } /// <summary> /// 异步发送回调函数 /// </summary> /// <param name="ar">包含要发送的数据流及数据包的包头</param> private void sendCallback(IAsyncResult ar) { try { Socket socket = (Socket)ar.AsyncState; //得到包含Socket的对象 int sent = socket.EndSend(ar); if(sentSize<fileSize)//sentSize:已发送文件的字节数;fileSize:发送文件的字节长度 { byte[] data = bufferManager.GetSendBuffer(); int sSize = data.Length;//实际应该取数据有效长度,这里简单使用data.Length只为代码清晰易读 if(sSize>0) { socket.BeginSend(data, 0, data.Length, SocketFlags.None, //开始异步发送 new AsyncCallback(sendCallback), socket); } sentSize += sSize; } else { bufferManager.SentDone = true; } } catch(Exception ex)//NullReferenceException { //NullReferenceException:未将对象引用设置到对象的实例。 } }