P2P服务端模型配合 Tool.net P2pServerAsync 类使用

news2024/11/26 2:44:58

Tool.Net 支持的 P2P 服务器模型实例

  • 说明
    • 服务器部分相关代码
    • 相关调用实例
      • Tcp版本
      • Udp版本
    • 最后附一张思维图

说明

  • 当前文章,仅是Tool.Net 开源库的一个缩影。
  • 本次更新V5.0版本以上提供支持。
  • 可以提供简单实现P2P功能用于业务开发。

服务器部分相关代码

完整代码(适用于自定义的场景).

using Tool.Sockets.Kernels;
using Tool.Sockets.P2PHelpr;
using Tool.Sockets.TcpHelper;
using Tool.Sockets.UdpHelper;

await Console.Out.WriteLineAsync("P2P服务器·支持“TCP” OR “UDP”");

static async ValueTask Completed(UserKey a1, EnServer b1, DateTime c1, string name)
{
    await Console.Out.WriteLineAsync($"[{name}]IP:{a1} \t{b1} \t{c1:yyyy/MM/dd HH:mm:ss:fffffff}");
}

EnumEventQueue.OnInterceptor(EnServer.SendMsg, false);
EnumEventQueue.OnInterceptor(EnServer.Receive, false);
EnumEventQueue.OnInterceptor(EnServer.HeartBeat, false);

TcpServerAsync tcpServerAsync = new(NetBufferSize.Size8K, true);
UdpServerAsync udpClientAsync = new(NetBufferSize.Size8K, true);

string ip = "0.0.0.0";
int port = 11111;

tcpServerAsync.SetCompleted((a1, b1, c1) => Completed(a1, b1, c1, "TCP"));
udpClientAsync.SetCompleted((a1, b1, c1) => Completed(a1, b1, c1, "UDP"));

tcpServerAsync.SetReceived(async (receive) =>
{
    using (receive)
    {
        if (P2pServerAsync.IsP2pAuth(receive.Span, out var ipnum))
        {
            string ok = $"[TCP]{ipnum}->{receive.Key} \t{DateTime.Now:yyyy/MM/dd HH:mm:ss:fffffff}";
            using var sendBytes = tcpServerAsync.CreateSendBytes(receive.Client, 16);
            sendBytes.SetMemory(P2pServerAsync.TcpTop);
            sendBytes.SetMemory(ipnum.Span, 4);
            sendBytes.SetMemory(receive.Key.Span, 10);
            await tcpServerAsync.SendAsync(sendBytes);
            await Console.Out.WriteLineAsync(ok);
        }
    }
});

udpClientAsync.SetReceived(async (receive) =>
{
    using (receive)
    {
        if (P2pServerAsync.IsP2pAuth(receive.Span, out var ipnum))
        {
            string ok = $"[UDP]{ipnum}->{receive.Key} \t{DateTime.Now:yyyy/MM/dd HH:mm:ss:fffffff}";
            using var sendBytes = udpClientAsync.CreateSendBytes(receive.Client, 16);
            sendBytes.SetMemory(P2pServerAsync.UdpTop);
            sendBytes.SetMemory(ipnum.Span, 4);
            sendBytes.SetMemory(receive.Key.Span, 10);
            await udpClientAsync.SendAsync(sendBytes);
            await Console.Out.WriteLineAsync(ok);
        }
    }
});

await tcpServerAsync.StartAsync(ip, port);
await udpClientAsync.StartAsync(ip, port);

while (Console.ReadKey(true).Key != ConsoleKey.Escape) ;

相关调用实例

Tcp版本

P2pServerAsync p2PServerAsync0 = await P2pServerAsync.GetFreeTcp();
P2pServerAsync p2PServerAsync1 = await P2pServerAsync.GetFreeTcp();

TcpClientAsync p2PClientAsync0 = new(NetBufferSize.Default, true);
var task0 = p2PClientAsync0.P2PConnectAsync(p2PServerAsync0.LocalEP, p2PServerAsync1.RemoteEP);

TcpClientAsync p2PClientAsync1 = new(NetBufferSize.Default, true);
var task1 = p2PClientAsync1.P2PConnectAsync(p2PServerAsync1.LocalEP, p2PServerAsync0.RemoteEP);

Task.WaitAll(task0, task1);

Udp版本

P2pServerAsync p2PServerAsync0 = await P2pServerAsync.GetFreeUdp();
P2pServerAsync p2PServerAsync1 = await P2pServerAsync.GetFreeUdp();

UdpClientAsync p2PClientAsync0 = new(NetBufferSize.Default, true);
var task0 = p2PClientAsync0.P2PConnectAsync(p2PServerAsync0.LocalEP, p2PServerAsync1.RemoteEP);

UdpClientAsync p2PClientAsync1 = new(NetBufferSize.Default, true);
var task1 = p2PClientAsync1.P2PConnectAsync(p2PServerAsync1.LocalEP, p2PServerAsync0.RemoteEP);

Task.WaitAll(task0, task1);

最后附一张思维图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Docker部署GitLab环境搭建

文件在D:\E\学习文档子目录压缩\专项进阶,如ngnix,webservice,linux,redis等\docker 建议虚拟机内存2G以上 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 注意:一定要配置阿里云的加速镜像 创建GitLab 的配置 (etc) 、 日志 (log) 、数…

MQTT 异常断开(一)

分析问题总结: 前提:MQTT是基于TCP层再次封装,MQTT是不关心TCP层的实现与传输,但是如果TCP链路出现异常(丢失TCP ACK,网络延时TCP ACK等)一定会导致MQTT断开连接。 MQTT代理服务器存在如下问题&…

服务器没有图形界面没有显示器怎么办

可以用vnc。 vnc是开元的。什么是vnc? 使用vnc 下载vnc和vncserver命令。 每生成一个图形界面就叫做开启session会话。 vnc相关命令: start a new session: vncserver。 如果没有会话,一般从:1开始 端口5901 vncserver :2 #指定会话为:2 端…

如何让社区版IDEA变得好用

如何让社区版IDEA变得好用 背景 收费版的idea功能非常强大,但是费用高。社区版的免费,但是功能被阉割了。如何才能让社区版Idea变得好用,就需要各种插件支持了。经过全局配置编码,maven,jdk版本,在加上各…

MSI U盘重装系统

MSI U盘重装系统 1. 准备一块U盘 首先需要将U盘格式化,这个格式化并不是在文件管理中将U盘里面的所有东西都删干净就可以了,需要在磁盘管理中,将这块U盘格式化,如果这块U盘有分区的话,那将所有的分区都格式化并且删除…

大模型最新黑书:大模型应用解决方案: 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理 PDF

今天给大家推荐一本丹尼斯罗斯曼(Denis Rothman)编写的关于大语言模型&#xff08;LLM&#xff09;权威教程<<大模型应用解决方案> 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理>&#xff01;Google工程总监Antonio Gulli作序&#xff0c;这含金量不…

开源软件 | 一文彻底搞懂许可证的定义、起源、分类及八大主流许可证,让你选型不再头疼

为什么开源软件会存在许可证&#xff0c;许可证的起源与产生目的是为了解决什么问题&#xff1f;许可证的定义又是怎样的&#xff1f;什么是Copyleft&#xff0c;与Copyright有何区别&#xff1f;开源软件常见的许可证有哪些&#xff1f;这些许可证都有什么特点&#xff1f;接下…

RAC11G删除节点

删除节点步骤&#xff1a;删除实例、删除 DB 软件、删除 GI 软件 删除节点发生的场景 1、被删除节点一切保留&#xff0c;需要从RAC中剔除&#xff0c;例如因为要更换服务器。 2、被删除节点关于RAC的部分文件丢失&#xff0c;如GI、库软件误删除&#xff0c;需要重新安装GI…

英语学习笔记21+23——Which book?/Which glasses?

Which book?/Which glasses? 哪本书&#xff1f;/哪些杯子&#xff1f; 词汇 Vocabulary give v. 给 搭配&#xff1a;Give me five! 击掌庆祝 用法&#xff1a;give 人 东西     give 东西 to 人    把……东西给某人 例句&#xff1a;把这些苹果给 Bobby.   …

【高频】从输入URL到页面展示到底发生了什么?

一、相关衍生面试问题&#xff1a; 浏览器输入美团网站&#xff0c;从回车到浏览器展示经历了哪些过程 &#xff1f; http输入网页之后的流程&#xff1f; 百度搜索页面&#xff0c;从点开搜索框&#xff0c;到显示搜索页面经历了什么&#xff1f; 二、探究各个过程&#x…

起底震网病毒的来龙去脉

2010年&#xff0c;震网病毒被发现&#xff0c;引起世界哗然&#xff0c;在后续的10年间&#xff0c;陆陆续续有更多关于该病毒的背景和细节曝光。今年&#xff0c;《以色列时报》和《荷兰日报》又披露了关于此事件的更多信息&#xff0c;基于这些信息&#xff0c;我们重新梳理…

【数据结构】第七节:堆

个人主页&#xff1a; 深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数据结构与算法 源码获取&#xff1a;数据结构: 上传我写的关于数据结构的代码 (gitee.com) ​ 目录 一、堆 1.堆的概念 2.堆的定义 二、堆的实现 1.初始化和销毁 2.插入 向上调整算法 3.删除 向下调整算法…

短剧系统源码解析与应用

在数字化时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;因其内容紧凑、节奏快速而受到广大年轻群体的喜爱。短剧系统源码的开发和应用&#xff0c;不仅为创作者提供了一个展示才华的平台&#xff0c;也为观众带来了全新的观看体验。本文将对短剧系统源码进行解析&…

get和post的区别,二者是幂等的吗?

一、什么是幂等 所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同的副作用。 维基百科定义&#xff1a;幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执…

win32-鼠标消息、键盘消息、计时器消息、菜单资源

承接前文&#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列 本文目录 键盘消息键盘消息的分类WM_CHAR 字符消息 鼠标消息鼠标消息附带信息 定时器消息 WM_TIMER创建销毁定时器 菜单资源资源相关菜单资源使用命令消息的…

人类交互2 听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号&#xff0c;从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一&#xff0c;对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉&#xff0c;我们能够听到他人的语言…

jwtcracker下载安装出现错误

1.jwtcracker 用于爆破jwt秘钥 2.下载 ubuntu/kali安装c-jwt-cracker及使用方法-CSDN博客 参考这个大佬写的 但是我在这里出现了这个问题 显示Cannot initialize the default message digest sha256, aborting 我实在找不出来哪里有问题&#xff0c;所以直接换成docker …

Java并发面试题,多线程通关秘籍

【知识点记录】- 不能不知道的知识点 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xf…

Go语言(Golang)的开发框架

在Go语言&#xff08;Golang&#xff09;的开发中&#xff0c;有多种开发框架可供选择&#xff0c;它们各自具有不同的特点和优势。以下是一些流行的Go语言开发框架&#xff0c;选择Go语言的开发框架时&#xff0c;需要考虑项目需求、团队熟悉度、社区支持、框架性能和可维护性…

Android 共享内存

Parcelable 和 Serializable 区别 Serializable IO完成&#xff08;通过磁盘文件读写&#xff09; Parcelable C 对象指针 来实现共享内存 import android.os.Parcel; import androidx.annotation.NonNull;public class ApiResponseBean extends Throwable implements Parce…