idea's P2P SDK, P2P 开发库

关于 idea's P2P SDK

idea's P2P SDK 使用 C#.Net 进行开发, 为用户提供一套开发和定制 P2P 应用的 P2P 开发库, 包括即时通讯(IM, 文本, 视频, 音频), 文件共享, 流媒体, 网络游戏等.

idea's P2P SDK 包括两个部分:

  1. 客户端 API
  2. 服务器端 API 及解决方案

idea's P2P SDK 提供以下功能:

  1. 账号管理
  2. NAT 穿透
  3. 可靠传输

idea's P2P SDK 的特点:

  1. 结构清晰
  2. 高可扩展性
  3. 传输速度快
  4. 功能强大且简单易用的 API

使用 Ideawu.P2P.Core.UdpLink 进行 NAT 穿透

使用 UdpLink 进行 NAT 穿透之后, 将与对方建立一条 UDP 连接. 该 UdpLink 可以用来生成提供可靠传输服务的 Channel, 也可以直接使用其 UDP Socket.

IPEndPoint remoteEP = new IPEndPoint(IPAdress.Parse("2.2.2.2"), 12345);
UdpLink link = new UdpLink();
link.Udp = new UdpClient();
link.RemoteEndPoint = remoteEP; // 设置对方节点的公网地址.
link.ReadKey = "my key +"; // 建立连接时期望从对方接收到的口令.
link.SendKey = "his key -"; // 建立连接时对方期望的口令.
link.Start(); // 进行 NAT 穿透.

当 Start() 方法成功返回时, NAT 穿透已经完成, 否则会抛出一个异常. UdpLink 可以应用在以下网络结构: No-NAT -- Any, Cone NAT -- Any, Loose Symmetric NAT -- Any.

使用 Channel 进行可靠传输

Channel 是一个通信线路, 建立在 UdpLink, TcpLink, HttpLink 或者更多类型的 Link 之上. 当建立在不提供可靠传输服务的 Link(如 UdpLink)之上时, Channel 能保证可靠传输.

Channel 的另一个功能是对一条 TCP/IP 层次上的网络连接(如 TCP, UDP, IP, HTTP 等)多路复用, 使得可以在一条网络连接上同时传输文本, 图像, 音频, 视频等. 这表示, 你在等待给对方发送一张大图片过程中, 可以继续进行文本和视频聊天, 而不必盯着静止的屏幕等待图片传输完成. 你需要做的工作只是建立多条 Channel, 而 Channel 的建立是立即完成的, 不会像建立网络连接那样有非常大的网络延时.

ILink link = ...; // 例如将一个 UdpLink 赋值给 link.
IChannel ch1 = link.Bind(1); // 建立编号为 1 的 Channel.
ch1.Connect(1001); // 连接对方的 1001 号 Channel.

byte[] dataToSend = Encoding.UTF8.GetBytes("Hello from 1.");
ch1.Send(dataToSend); // 发送数据给对方

byte[] buffer = new byte[1024];
int n = channel.Read(buffer); // 从 Channel 中读取数据到缓冲区中.
// 打印接收到的数据.
Console.WriteLine("Read {0} bytes from remote: {1}", n, Encoding.UTF8.GetString(buffer, 0, n));

IChannel ch2 = link.Bind(2); // 建立编号为 2 的 Channel.
ch1.Connect(1002); // 连接对方的 1002 号 Channel.

... // 操作 ch2.

Channel 的表现类似 TCP socket, 提供流式的字节传输服务. 有了 Channel, 你便可以开发你自己的应用.

直接使用 Socket

Link 表示一条网络连接. idea's P2P SDK 在 Link 之上提供了进行可靠传输的 Channel, 但是当你不想使用 Channel 的时候, 你仍然可以直接使用网络连接.

ILink link = ...; // 例如将一个 UdpLink 赋值给 link.
Socket socket = link.Socket;
... // 操作 socket.

直接使用 Socket 的情况主要是你需要直接操作网络连接.

使用 Ideawu.P2P.Core.AccountManager 登录服务中心

节点必须先登录服务中心, 才能读取好友列表, 查询用户, 请求服务中心的帮助以便进行 NAT 穿透等.

// AccountManager 需要一个网络代理(IAgent)与服务中心进行通信,
// IAgent 可以基于 TCP, UDP, HTTP 等协议.
HttpAgent agent = new HttpAgent(); // 基于 HTTP 协议的网络代理.
agent.ServerUrl = "http://www.ideawu.net/?mediator";

// 创建一个用户判断本机是否在 NAT 之后, 以及帮助获取 Socket 的公网地址(IP:port).
NatHelper natHelper = new NatHelper();
natHelper.ServerEndPoint = new IPEndPoint(IPAddress.Parse("22.2.2.2"), 10215);
natHelper.Start();

// SessionListener 监听其它节点的会话请求, 决定是否接受某个请求.
// 你可以实现你自己的 SessionListener, 使 AccountManager 只接受
// 好友的连接请求, 拒绝黑名单中的用户的请求.
// 标准的 SessionListener 接受所有节点的会话请求.
StandardSessionListener sessionListener = new StandardSessionListener();
sessionListener.Start();

AccountManager am = new AccountManager();

am.Agent = agent;
am.NatHelper = natHelper;
am.SessionListener = sessionListener;

// 使用用户名和密码进行登录.
am.Login("user01", "my password ***", null);
am.Start();

使用 Ideawu.P2P.Core.AccountManager 与节点进行连接

当已经启动 AccountManager, 便可以使用其与其它节点进行网络直连.

AccountManager am = ...
am.Connect("user02"); // 连接 user02

连接的建立是异步完成的, 当网络直连建立完成后, AccountManager 会通知其它组件.