RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-196800

Serginio's questions

Martin Hope
Serginio
Asked: 2020-02-21 15:37:15 +0000 UTC

TCP/IP 波特率

  • 1

我正在做某种 RPC。对 TCP / IP 上的汇率感兴趣

现在20字节左右的交换速率是每秒2000次调用。但是我觉得速度还可以。客户是

 private BinaryReader SendMessage(MemoryStream stream)
        {

            using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            { client.Connect(IpEndpoint);
                using (var ns = new NetworkStream(client))
                {
                    stream.Position = 0;
                    ns.Write(BitConverter.GetBytes((Int32)stream.Length), 0, 4);
                    stream.CopyTo(ns);

                    using (var br = new BinaryReader(ns))
                    {
                        var streamSize = br.ReadInt32();

                        var res = br.ReadBytes(streamSize);

                        var ms = new MemoryStream(res);
                        ms.Position = 0;
                        return new BinaryReader(ms);
                    }

            }
            }

和服务器

 public void Open(int НомерПорта = 6891, int КоличествоСлушателей = 1)
        {
            IsClosed = false;

            IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, НомерПорта);
            Server = new TcpListener(ipEndpoint);
            Server.Start();

            // Создадим задачи для прослушивания порта
            //При подключении клиента запустим метод ОбработкаСоединения
            // Подсмотрено здесь https://github.com/imatitya/netcorersi/blob/master/src/NETCoreRemoveServices.Core/Hosting/TcpServerListener.cs
            for (int i = 0; i < КоличествоСлушателей; i++)
                Server.AcceptTcpClientAsync().ContinueWith(OnConnect);

        }


        // Метод для обработки сообщения от клиента
        private void OnConnect(Task<TcpClient> task)
        {

            if (task.IsFaulted || task.IsCanceled)
            {
                // Скорее всего вызвано  Server.Stop();
                return;
            }

            // Получим клиента
            TcpClient client = task.Result;

            // И вызовем метод для обработки данных
            // 
            ExecuteMethod(client);

            // Если Server не закрыт то запускаем нового слушателя
            if (!IsClosed)
                Server.AcceptTcpClientAsync().ContinueWith(OnConnect);

        }


          static void SetResult(MemoryStream ms, NetworkStream ns)
        {
            ms.Position = 0;
            ns.Write(BitConverter.GetBytes((Int32)ms.Length), 0, 4);
            ms.CopyTo(ns);
            ns.Flush();


        }

        private void RunMethod(NetworkStream ns, MemoryStream ms)
        {
            using (BinaryReader br = new BinaryReader(ms))
            {
                var msRes = new MemoryStream();
                using(BinaryWriter bw= new BinaryWriter(msRes))
                { 
                    var cm = (CallMethod)br.ReadByte();

                    if (cm == CallMethod.CallFunc)
                    {

                        CallAsFunc(br, bw);




                    }

                    bw.Flush();
                    SetResult(msRes, ns);
                }

            }
        }
        private void ExecuteMethod(TcpClient client)
        {

            using (NetworkStream ns = client.GetStream())
            {

                // Получим данные с клиента и на основании этих данных
                //Создадим ДанныеДляКлиета1 котрый кроме данных содержит 
                //TcpClient для отправки ответа
                using (var br = new BinaryReader(ns))
                {
                    var streamSize = br.ReadInt32();

                    var res = br.ReadBytes(streamSize);

                    var ms = new MemoryStream(res);
                    ms.Position = 0;
                    RunMethod(ns, ms);
                }



            }

        }

通过 DinamicObject 调用

var wrap = Client.AutoWrapClient.GetProxy("127.0.0.1", 6891);

        int res = wrap.ReturnParam(3);
        Console.WriteLine(res);

        string str = wrap.ReturnParam("Hello");
        Console.WriteLine(str);

 var Тестовый = wrap.Тип("TestDllForCoreClr.Тестовый", "TestDll");
        var TO = wrap.New(Тестовый,"Свойство из Конструктора");
        int rs = TO.ПолучитьЧисло(89);
        count = 0;
        stopWatch.Restart();
        for (int i = 0; i < 10000; i++)
        {
            count += TO.ПолучитьЧисло(i);

        }

        stopWatch.Stop();
c#
  • 1 个回答
  • 10 Views
Martin Hope
Serginio
Asked: 2020-02-07 17:59:41 +0000 UTC

Angular 2 EventEmitter 事件被调用但数据未更新

  • 0

EventEmitter 是动态创建的

 public AddEventHandler(EventName: string, EventHandler: (value: any) => void):any {

        let ei: EventItem;
        let isFirst = false;

        if (!this.EventsList.has(EventName)) {
            let EventKey = window.CallNetMethod(0, "GetUniqueString");

            let Event = new EventEmitter<any>(true);
            ei = new EventItem(EventKey, Event);
            this.EventEmittersList.set(EventKey, Event);
            NetObject.EventCallers.set(EventKey, this.RaiseEvent.bind(this));

并称

 public RaiseEvent(EventKey: string, value: any)
    {
      // Если есть подписчики, то вызываем их
        if (this.EventEmittersList.has(EventKey))
        {
            this.EventEmittersList.get(EventKey).emit(value);
        }

    }

但问题是表单不响应接收到的数据的变化。

如果我从同一个对象使用 Timer

public SetTimer(func:(value: any)=>void)
        {
            let timer = Observable.timer(2000, 1000);
            timer.subscribe((value: any) => { func(value) });
        }

然后它甚至通过调用一个空委托来更新表单

this.AddEventHandlerResult = this.WOWE.AddEventHandler("TestEvent3", (value: any) => { this.EventsRes.push(new EventRes("TestEvent3", value)); });

this.WOWE.SetTimer((value: any) => {});

当然,我可以将其更改为 Observable.create 但问题是是否可以使用 EventEmitter 以及如何使用?

更改为可观察

class EventEmitter
{

    public data: Observable<any>;
    public dataObserver: Observer<any>;

    constructor() {
        this.data = Observable.create((observer: any) => this.dataObserver = <Observer<any>>observer);

        alert("this.data"+this.data);
    }

    public subscribe(EventHandler: (value: any) => void)
    {

      return  this.data.subscribe(EventHandler);

    }

    public emit(value: any)
    {
        this.dataObserver.next(value);
    }

    public Complete()
    {
        this.dataObserver.complete();

    }
}

效果是一样的。是不是上下文不一样。告诉我谁知道。

angular2
  • 1 个回答
  • 10 Views
Martin Hope
Serginio
Asked: 2020-01-12 17:17:02 +0000 UTC

Es6 TypeScript Proxy 获取如何确定链接是否指向函数?”

  • 0

我想为 .Net 类制作一个通用代理,包括使用 Proxy 类。但是难点是我无法理解什么时候作为方法调用,什么时候通过属性调用

例如,您需要联系,例如通过 http 到服务。传递密钥、方法名称、参数并获取响应作为密钥和结果

但它看起来像这样

let res = await this.counter.proxy.AllHello1("Всем Привет");

所有的序列化都发生在Proxy get中,反序列化发生在传递key和result的事件中

对于属性,您需要返回一个 Promise
对于方法,您需要返回创建 Promise 的函数

class CounterComponent {
    public currentCount: any;
    public dictionary = {};
    public proxy: any;
    constructor() { this.SetProxy(); }

    private GetPromise(name: PropertyKey,args)
    {

        let key = Guid.newGuid();
        let promise = new Promise((resolve, reject) => {
            let item = new Item(resolve, args, name);
            this.dictionary[key] = item;

        });


        return promise;
    }
    private SetProxy(): void {

        let self=this;
        this.proxy = new Proxy({}, {

            get: function(rcvr: any, name: PropertyKey)
            {
                // Для свойства нужно вернуть Promise
                if (name == "AllHello3")
                    return self.GetPromise(name, []);
                // А для Метода нужно вернуть функцию создающую Promise
                return (...args) => {
                   return self.GetPromise(name,args)
                };    
            }
        });
    }

    public async CallMethodAsync() {
        this.currentCount = await this.proxy.AllHello("Всем Привет");
    }

    public setResult(): void {

        let key: string;
        for (let name in this.dictionary) {
            key = name;
        }

        let item = <Item>this.dictionary[key];
        delete this.dictionary[key];
        item.resolve(item.value);
    }
}

相应地调用

console.log('before async result ');
let res = await this.counter.proxy.AllHello1("Всем Привет");
console.log('Всем привет ' + res);
res = await this.counter.proxy.AllHello2();
console.log('func ' + res);
res = await this.counter.proxy.AllHello3;
console.log('property ' + res);
javascript
  • 1 个回答
  • 10 Views
Martin Hope
Serginio
Asked: 2020-01-11 21:01:38 +0000 UTC

Es6 TypeScript 参数

  • 3

我决定沉迷于 TypeScript 和 es6,尤其是 Proxy。

问题是在调试器 (Edge) 中显示了参数的内容和长度,但在代码中,所有转换为数组的方法都返回 [] 或访问长度返回 0。

  class Item {
    constructor(public resolve: any, public value: any) { };
}


class CounterComponent {
    public currentCount: any;
    private dictionary = {};
    private proxy: any;
     constructor() { this.SetProxy(); }
    private SetProxy(): void {

        this.proxy = new Proxy({}, {

            get: (rcvr, name) => {

                return () => {

                    let args: Array<any> = [];
                    let length = arguments.length; //length==0
                    let args1 = [...arguments];    //args1==[]
                    for (let i = 0; i < arguments.length; i++) {
                        args.push(arguments[i]);

                    }

                    let promise = new Promise((resolve, reject) => {
                        //  resolve(123);
                        let item = new Item(resolve, args);
                        this.dictionary[name] = item;

                    });


                    return promise;

                };

            }


        });
    }
    public async CallMethodAsync() {


        this.currentCount = await this.proxy.AllHello("Всем Привет");
    }

    public setResult(): void {

        let key: string;
        for (let name in this.dictionary) {
            key = name;

        }

        let item = <Item>this.dictionary[key];
        item.resolve(item.value);

    }
}

同时等待fulfills。是否有一个 C# 模拟终结器来了解对象何时被垃圾收集。

javascript
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5