networkComms.net2.3.1开源版本,基于gpl V3协议。因为不能公开3.x版本的源码,所以基于此版本进行学习。3.X版本进行了诸多改进和Bug修复,使用方法上两者相差不大。
/*请注意使用以下代码,需遵循GplV3协议*/
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Threading;
namespace DPSBase
{
public class AsyncStreamCopier
{
/// <summary>
/// 拷贝数据完成 触发的事件
/// </summary>
public event EventHandler Completed;
private byte[] buffer = new byte[4096];
public AsyncStreamCopier()
{
}
/// <summary>
///开始一个异步的数据拷贝
/// </summary>
public void Start(Stream input, Stream output)
{
GetNextChunk(new Stream[] { input, output });
}
private void GetNextChunk(Stream[] streams)
{
var input = streams[0];
//把Stream[0] 中的输入数据流中的数据读取到buffer中,当buffer中的数据读取完成后,触发InputReadComplete方法
input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, streams);
}
private void InputReadComplete(IAsyncResult ar)
{
var streams = ar.AsyncState as Stream[];
var input = streams[0];
var output = streams[1];
//等待挂起的异步读取完成。
int bytesRead = input.EndRead(ar);
if (bytesRead == 0)
{
RaiseCompleted();
return;
}
// 同步写入
output.Write(buffer, 0, bytesRead);
// 读取下一数据块
GetNextChunk(streams);
}
private void RaiseCompleted()
{
if (Completed != null)
{
Completed(this, EventArgs.Empty);
}
}
public static void CopyStreamTo(Stream source, Stream destination)
{
//信号灯-默认无信号 来进程不得通行
var completedEvent = new ManualResetEvent(false);
// copy as usual but listen for completion
var copier = new AsyncStreamCopier();
//一旦完成,给信号
copier.Completed += (s, e) => completedEvent.Set();
//开始拷贝数据,如果拷贝数据完成,触发信号灯
copier.Start(source, destination);
//有交警 需要信号 否则等待
completedEvent.WaitOne();
}
}
}
http://www.cnblogs.com/networkcomms
http://www.networkcoms.cn 编辑
来自英国剑桥的c#网络通讯框架 开源版本: networkcomms2.3.1 可以进入此页面下载 networkcomms网络通讯框架学习
【开源下载】基于TCP网络通信的即时聊天系统(IM系统)(c#源码)
[源码下载]Demo2.模拟简单登陆-效果图 基于networkcomms2.3.1
[源码下载]Demo1 客户端从服务器获取信息(基于networkcomms2.3.1)
【开源下载】基于TCP网络通信的自动升级程序c#源码