idea's P2P SDK 使用 C#.Net 进行开发, 为用户提供一套开发和定制 P2P 应用的 P2P 开发库, 包括即时通讯(IM, 文本, 视频, 音频), 文件共享, 流媒体, 网络游戏等.
idea's P2P SDK 包括两个部分:
idea's P2P SDK 提供以下功能:
idea's P2P SDK 的特点:
使用 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 是一个通信线路, 建立在 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, 你便可以开发你自己的应用.
Link 表示一条网络连接. idea's P2P SDK 在 Link 之上提供了进行可靠传输的 Channel, 但是当你不想使用 Channel 的时候, 你仍然可以直接使用网络连接.
ILink link = ...; // 例如将一个 UdpLink 赋值给 link. Socket socket = link.Socket; ... // 操作 socket.
直接使用 Socket 的情况主要是你需要直接操作网络连接.
节点必须先登录服务中心, 才能读取好友列表, 查询用户, 请求服务中心的帮助以便进行 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();
当已经启动 AccountManager, 便可以使用其与其它节点进行网络直连.
AccountManager am = ... am.Connect("user02"); // 连接 user02
连接的建立是异步完成的, 当网络直连建立完成后, AccountManager 会通知其它组件.