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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sockets client+server with await/async c# 5.0 / C# 
:(
    Опции темы
123456789igor
Дата 1.5.2014, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уже долго пытаюсь найти хотя бы какой то пример, но пока безуспешно, поэтому обращаюсь с просьбой к вам.
Проблема такова. Хочу написать простое асинхронное клиент-серверное приложение с банальной передачей байт. Удалось найти и реализовать 2 решения: колбэки и await/async базирующиеся на tcplistener и networkStream. Но это все не то. Пытаюсь написать базируясь на Task, Sockets и async/await без tcplistener и networkStream. Почитал некоторую литературу но необвведите код здесьходимого ответа/примера не нашел. 
Знаю, что делается это базируясь на следующем:
Код


    public static Task ConnectAsync(this Socket socket, EndPoint remoteEP)
            {
                return Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, remoteEP, null);
            }


но пока ничего не выходит. Даже сервер не могу "собрать" воедино. Прошу помощи.
PM MAIL   Вверх
123456789igor
Дата 1.5.2014, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получилось подключиться, а вот с передачей пока никак.
Код

private readonly Socket _server;
        public ServerSocket(IPAddress ipAddress, int port)
        {
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, port));
            _server.Listen(20);
            Console.WriteLine("Wait connection");
            Accept();
        }
        private async void Accept()
        {
            for (; ; )
            {
                var socket = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                Console.WriteLine("Connected");
            }
        }

PM MAIL   Вверх
123456789igor
Дата 1.5.2014, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Получилось передать то, что мне надо. Теперь не могу понять как поставить клиент на постоянный прием. У меня он принимает только 1 раз а потом перестает.
Сервер:
Код

public ServerSocket(IPAddress ipAddress, int port)
        {
            _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _server.Bind(new IPEndPoint(ipAddress, port));
            _server.Listen(20);
            Console.WriteLine("Wait connection");
            Accept();
        }
        private async Task StartSend(int i)
        {
            try
            {
                CodingImage img = new CodingImage();
                var buffer = img.CodingImages("C:\\image\\file"+i+".bmp");
                Task<int> senTask = SendAsync.AsyncSend(client, buffer, 0, buffer.Length);
            }
            catch(Exception ex)
            {

            }
        }
        private async void Accept()
        {
            for (int i = 0 ;i<14 ;i++ )
            {
                client = await Task.Factory.FromAsync<Socket>(_server.BeginAccept, _server.EndAccept, true);
                Console.WriteLine("Connected");
                await StartSend(i);

            }
        }

public static Task<int> AsyncSend(this Socket socket, byte[] buffer, int offset, int count)
        {
            return Task.Factory.FromAsync<int>(
                socket.BeginSend(buffer, offset, count, SocketFlags.None, null, socket),
                socket.EndSend);
        }


Клиент:

Код

private async void Form1_Load(object sender, EventArgs e)
        {
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            ClientSocket cs = new ClientSocket();
            await cs.Connect(ipAddress, 11000);
            //await cs.StartRecieve();
        }
public ClientSocket()
        {
            _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        public async Task Connect(IPAddress ipAddress, int port)
        {
            _client.Connect(ipAddress, port);
            if (!_client.Connected)
            {
                Console.WriteLine("Can't connect");
            }else
            Console.WriteLine("Connected");
            int i=0;
            while(i<14)
            {
                await StartRecieve(i);
                i++;
            }
        }
        public async Task StartRecieve(int i)
        {
            try
            {
                var buffer = new byte[999999];
                //Console.WriteLine("Картинка под номером {0} сохранена", i);
                buffer2 = await _client.ReceiveTaskAsync(buffer,0,buffer.Length);
                EncodingImage enc = new EncodingImage();
                enc.EncodingImageForRecievedBuffer(buffer, i);
                Console.WriteLine("Картинка под номером {0} сохранена", i);
            }
            catch (Exception ex)
            {
            }
        }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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