Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Асинхронный режим приема данных через сокет. 
:(
    Опции темы
Хоббит
Дата 9.5.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Конектюсь к серверу.
Как отправлят сообщения и как принимать разобрался. Но проблема в другом. При асинхроном принятии данных, фуннкция которая запускается для обработки - работает в другом потоке, нежели остальное приложение и следовательно не может получить прямо доступ к его  свойствам. То есть собщения я получаю, а вывести не могу.
Вот пример

Код

    public partial class IrcForm : Form
    {
        public IrcForm()
        {
            InitializeComponent();
        }

        private Socket socket;
        public Socket Socket
        {
            get
            {
                return socket;
            }
            set
            {
                socket = value;
            }
        }

        
        private void Connect(string Host, int Port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.BeginConnect(Host, Port, ReceiveData, this);                           
        }

        private void SendData(string Text)
        {
            socket.Send(Encoding.UTF8.GetBytes(Text));
        }

        private static void ReceiveData(IAsyncResult ar)
        {
            IrcForm ircForm = ar.AsyncState as IrcForm;
            Socket socet = ircForm.Socket;
            byte[] buffer = new byte[512];
            socet.Receive(buffer);
                        

            string text = Encoding.UTF8.GetString(buffer);
            ircForm.listChat.Items.Add(buffer);                                //Здесь  прога ругается.. типа ircForm.listChat находиться в другом потоке
        }

        private void IrcForm_Load(object sender, EventArgs e)
        {
            Connect("chat.tamboff.ru", 6670);
        }

    }

 
PM MAIL   Вверх
Хоббит
Дата 9.5.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



Проблема с приемом решается через свойство InvokeRequired  тект бокса

А вот как отправить... потому что данный вариант работает... сообщения через сокет на сервер льются.. а вот обратно никак ничего не приходит
 
PM MAIL   Вверх
mr.DUDA
Дата 10.5.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Хоббит @  9.5.2006,  14:21 Найти цитируемый пост)
А вот как отправить... потому что данный вариант работает... сообщения через сокет на сервер льются.. а вот обратно никак ничего не приходит
 

Проблема в том, что ответ вообще не приходит, или что в отдельном потоке ? Если про поток, то ты сам только что ответил: св-во InvokeRequired и метод Invoke в помощь. 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 10.5.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



в том что вообще не приходит .... вот эта функция, кот в отдельном потоке ничего не принимает 
PM MAIL   Вверх
mr.DUDA
Дата 10.5.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



А у меня работает. То бишь данные приходят в буфер. 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 10.5.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



а можно пример кодика? асинхронного.... я сделал синхронный прием.. проверяю наличие инфы каждую секунда и гружу если есть, все работает 
PM MAIL   Вверх
mr.DUDA
Дата 11.5.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Твой пример - рабочий (за исключением записи в листбокс). С сокетами много не работал, а разбираться особо не хочется smile. 


--------------------
user posted image
PM MAIL WWW   Вверх
Хоббит
Дата 11.5.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1263
Регистрация: 6.11.2005

Репутация: нет
Всего: 1



... понял ... а не рабочесь примера в том, что он только  1 раз принимает данные асинхронно.. а потом замолкает 
PM MAIL   Вверх
mr.DUDA
Дата 11.5.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(Хоббит @  11.5.2006,  10:10 Найти цитируемый пост)
... понял ... а не рабочесь примера в том, что он только  1 раз принимает данные асинхронно.. а потом замолкает  

Ну так ты ведь только 1 раз Connect вызываешь, не будет же он без конца ответы принимать smile
Или просто не все данные приходят ? Тогда нужно сделать цикл и вызывать socket.Receive до тех пор пока он не вернёт 0.

З.Ы. ещё не мешало бы в конце ReceiveData добавить вызов socket.EndRecieve(), может в этом проблема. 


--------------------
user posted image
PM MAIL WWW   Вверх
albert21
Дата 13.5.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Цитата

Проблема с приемом решается через свойство InvokeRequired  тект бокса


А можно поподробнее? У меня схожая проблема, не могу добраться до грида 
--------------------
http://www.certifications.ru/publicresults.php?tu_id=45939
PM MAIL   Вверх
mr.DUDA
Дата 14.5.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(albert21 @  13.5.2006,  21:47 Найти цитируемый пост)
А можно поподробнее? У меня схожая проблема, не могу добраться до грида 

объясняю подробнее:

1) работать с визуальными контролами и формами из нескольких потоков нельзя, валится исключение InvalidOperationException при попытке вызвать практически любой метод или свойство
2) поток, желающий что-либо сделать с контролом/формой, должен вызвать у контрола/формы метод Invoke, передав ему делегат на любой метод
3) контрол/форма вызовут метод по делегату, причём этот метод уже будет работать в "родном" потоке контрола/формы, что позволит данному методу безопасно работать со свойствами и методами контрола/формы

В двух словах, всё что нужно - это вызвать метод Invoke контрола (или формы) и передать ему делегат на метод, выполняющий всю работу.
  


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 14.5.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



mr.DUDA, неразу такого не делал, но вопрос все же интересен  smile 
А как передеть значение из потока....
Писал, писал и подумал: "дай гляну на этот метод invoke", а там как раз все и написано:
Цитата
public object Invoke(Delegate method, params object[] args);
.
Только вот что получается. Если метод планируестся вызываться в invoke, то метод заранее должен уметь переконвертить из object в реальный тип, или это конвертирование проходит автоматически?
Опять поэкспериментировал и оказалось, что преобразование идет автоматом, хоть это радует  smile 
P.S. Еще замечание. Получается компилятор не может проверить соответствие типов smile 
Даже не смог проверить количество аргументов  smile 
Хм.. А зачем ему тогда нужено явно объявлять делегата  smile 
Наверное, invoke всетки хитрый метод. И именно он автоматом конвертирует типы и проверяет количество аргументов, на основании полученного делегата  smile 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 14.5.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



ivashkanet, в Invoke можно передать делегат любого типа. Что мешает, например, передать делегат на метод, принимающий string или массив Rectangle-ов, или на Dictionary<string,int> и так даее ? В конце концов, можно объявить делегат с нужным набором аргументов. 


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 15.5.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(mr.DUDA @  14.5.2006,  22:50 Найти цитируемый пост)
ivashkanet, в Invoke можно передать делегат любого типа. Что мешает, например, передать делегат на метод, принимающий string или массив Rectangle-ов, или на Dictionary<string,int> и так даее ? В конце концов, можно объявить делегат с нужным набором аргументов. 

mr.DUDA, эт я понял  smile Даже написал:
Цитата(ivashkanet @  14.5.2006,  20:19 Найти цитируемый пост)
Наверное, invoke всетки хитрый метод. И именно он автоматом конвертирует типы и проверяет количество аргументов, на основании полученного делегата 

 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.