LINUX.ORG.RU

WebSocketSharp - как достать данные C#, wpf

 


0

2

Добрый день,

Юзаю библиотеку WebSocketSharp для обмена между компами. Объяните, плиз, как достать данные для ViewModel?

Есть класс

 public class WSServModel
 {
        WebSocketServer wssv = new WebSocketServer(8080);

        public class my_data : WebSocketBehavior
        {
            public string Data
            {
                get { return _data; }
                set
                {
                    _data = value;
                }
            }            
            
            bool _isData = false;

            public bool IsData
            {
                get { return _isData; }
                set
                {
                    _isData = value;
                }
            }

            protected override void OnMessage(MessageEventArgs e)
            {
                Data = e.Data;

                IsData = true;                
            }
      }

        public bool Start()
        {
            wssv.AddWebSocketService<my_data>("/my_data");

            wssv.Start();
            

            if (wssv.IsListening)
            {
                return true;
            }

            return false;
        }
}

public class WSServerVM : ViewModel
{
        WSServModel wsServModel = new WSServModel();

        public WSServerVM()
        {            
            if (wsServModel.Start())
            {
            }
        }
}

как дать знать ViewModel, что данные готовы? Снаружи есть только доступ к родительскому wsServModel.

Спасибо.



Последнее исправление: AlexVM22 (всего исправлений: 3)

Юзаю библиотеку WebSocketSharp

не делай так.

С этим к лавсану или на винфак, даже и не знаю что лучше ;-)

---

«обмен между компами» делается специально для того заточенными средствами. а-ля zMQ, redis и прочие-прочие.

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Ты б еще здесь про VisualBasic спросил. Или MFC.

С чего это? Дотнет сейчас относительно кроссплатформенный, а в репе сабжевой библиотеки ещё и MonoDevelop (ныне, правда, заброшенный) упоминается.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

[code]

public class WSServerVM : ViewModel { WSServModel wsServModel = new WSServModel();

    wsServModel.AddWebSocketService<my_data>(); //ы?

    public WSServerVM()
    {            
        if (wsServModel.Start())
        {
        }
    }

}

[/code]

Ну и прибей в OnMessage реактивное свойство модели, которым хочешь «дать знать», или по старинке обработчик дергай.

Тут жы есть примеры https://github.com/sta/websocket-sharp

anonymous
()
        public bool Start()
        {
            wssv.AddWebSocketService<my_data>("/my_data");

            wssv.Start();
            

            if (wssv.IsListening)
            {
                return true;
            }

            return false;
        }

Не туда посмотрел, не то скопипастил :) У тебя пристегнуто уже поведение. Ну так сделай в модели свойство да и дергай в OnMessage.

anonymous
()
Ответ на: комментарий от anonymous

Ну так сделай в модели свойство да и дергай в OnMessage.

Это то и проблема.

Если свойство внутри public class my_data : WebSocketBehavior, то до него из VM не достучаться.

Если свойство уровнем выше (у парента my_data) - то до него не достучаться в методах my_data.

AlexVM22
() автор топика
Ответ на: комментарий от AlexVM22

Это то и проблема.

Да не, не проблема. Все способы сводятся к тому что ты либо метод экземпляра дергаешь из OnMessage(экземпляр модели можно в локатор зарегать и дергать из любого места вообще), какой-то статический колбэк напрямую дергаешь, не стесняясь что не модно (а он знает где лежит экземпляр модели… Например, в статической переменной или вообще коллекции «подписок на месаги», это визитор, вид со стороны «кишок», которые обычно не показывают в доках), либо дергаешь его же через третьи руки: прибиваешь на OnMessage обработчик, делегат или лямбду как в примере на гитхабе есть. Разница лишь в том что ты так или иначе дернешь обработчик – прямо, «силовым способом» (зато наглядным и понятным), или через третьи руки (через диспетчер событий там, или замыкание). А флажок ты из него поставишь, или «реактивненько» сделаешь через Rx – это дело десятое.

anonymous
()
Ответ на: комментарий от anonymous

лямбду как в примере на гитхабе есть В примерах OnMessage заканчивается либо консолью либо отправкой месаги. Нигде не нашел, как данные выше отправить.

Сделал так:

    public class WSServModel
    {        
        static bool gIsData;

        static void SetFlag() 
        {
            gIsData = true;  
        }

        public bool GetFlag()
        {
            return gIsData;
        }

        public class my_data : WebSocketBehavior
        {
            protected override void OnMessage(MessageEventArgs e)
            {
                Data = e.Data;                

                SetFlag();                
            }
        }
    }

    public class WSServerVM : ViewModel
    {        
        WSServModel wsServModel = new WSServModel();

        protected bool WSServIsReady()
        {
            bool flag = wsServModel.GetFlag();

            return flag;
        }    
     }  

Правильно идею понял?

AlexVM22
() автор топика

,,, public class WSServModel //можно реализовать INotifyPropertyChanged, можно отнаследовться от ReactiveObject { //можно [Reactive], можно тупо поллить из потока, зависит от цели))) public bool IsDataReady { get; set; } }

public class WSServViewModel { public WSServViewModel() { //тут забинди любым способом обработчик model.IsDataReady_OnChange +=, из дата-контекста или «оформи пописку» на model.IsDataReady, как уж у тебя VM узнает где модель } }

//Прибей лямбду, на, как в примере, на: OnMessage += (sender, e) => { //где-то тут захватывай экземпляр модели из локатора или тупо из переменной (просто чтоб постичь дзен), и ставь флажог или дергай метод модели, красоту и чистоту потом наведешь, просто пойми что никаких технических препятствий нет } ,,,

anonymous
()
public class WSServModel //можно реализовать INotifyPropertyChanged, можно отнаследовться от ReactiveObject
{
   //можно [Reactive], можно тупо поллить из потока, зависит от цели)))
   public bool IsDataReady { get; set; }
}

public class WSServViewModel
{
  public WSServViewModel()
  { 
  //тут забинди любым способом обработчик model.IsDataReady_OnChange +=, из дата-контекста или "оформи пописку" на model.IsDataReady, как уж у тебя VM узнает где модель
  } 
}

//Прибей лямбду, на, как в примере, на: 
OnMessage += (sender, e) => {
  //где-то тут захватывай экземпляр модели из локатора или тупо из переменной (просто чтоб постичь дзен), и ставь флажог или дергай метод модели, красоту и чистоту потом наведешь, просто пойми что никаких технических препятствий нет
}
anonymous
()
Ответ на: комментарий от AlexVM22

Правильно идею понял?

В общих чертах, ага. Всякие локаторы-визиторы-диспетчеры-DI просто прячут от тебя сермяжную правду, которой тщательно избегают и стесняются поборники «чистоты» и архитектурной акробатики. А на деле там все банально и скушшшно, если залезть в кишки библиотек :)

anonymous
()