Как получить файл через socket в UWP(Windows 10)

242
25 февраля 2017, 03:00

Программа по передаче файлов с помощью сокетов и TCP/IP. В документации Microsoft нашёл рабочий пример получения сообщения.

Код (подключение к удалённому серверу):

public async void Connect()
    {
        //подкючиться ip
        var dialog = new MessageDialog("Подклчение к устройству. Адрес:"  + ip);
        await dialog.ShowAsync();
         string result = string.Empty;
        // Создать DnsEndPoint. Имя хоста и порт передаются в этот метод.
        DnsEndPoint hostEntry = new DnsEndPoint(ip, 1818);
        // Создать поток на основе TCP-сокет с использованием Интерсети Адрес семьи.
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Создать объект socketasynceventargs в, чтобы использоваться в запросе на подключение
        SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
        socketEventArg.RemoteEndPoint = hostEntry;
        // Обработчик рядный событие для завершения мероприятия.
        // Примечание: этот обработчик событий был реализован встроенный для того, чтобы сделать этот метод самодостаточным.
        socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
        {
            // Получить результат этого запроса
            result = e.SocketError.ToString();
            // Сигнал о том, что запрос выполнен, разблокирование потока пользовательского интерфейса
            _clientDone.Set();
        });
        // Устанавливает состояние события несигнальным, вызывая блокирование потоков
        _clientDone.Reset();
        // Делаем запрос на асинхронное подключение через сокет
        _socket.ConnectAsync(socketEventArg);
        // Блокировать поток пользовательского интерфейса для более TIMEOUT_MILLISECONDS миллисекунд.
        // Если нет ответа в течение этого времени, то продолжить
        _clientDone.WaitOne(TIMEOUT_MILLISECONDS); 
}

Код (получение сообщения с сервера):

   public async void GetFile()
{
// string response = null;
// Мы получаем через установленное соединение
if (_socket != null)
{
    // Создать контекст объект socketasynceventargs в
     SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
    socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
    // Настройка буфера для получения данных
    socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
    // Обработчик рядный событие для завершения мероприятия.
    // Примечание: это даже обработчик реализован встроенный для того, чтобы сделать 
    // этот метод самодостаточным.
      socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate (object s, SocketAsyncEventArgs e)
       {
           if (e.SocketError == System.Net.Sockets.SocketError.Success)
           {
               // Получаем данные из буфера
               response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
               response = response.Trim('\0');

               // преобразовать файл из полученных byte 
           }
           else
           {
               response = e.SocketError.ToString();
           }
           _clientDone.Set();
       });

    // Устанавливает состояние события несигнальным, вызывая блокирование потоков
    _clientDone.Reset();
    // Асинхронном получает запрос через сокет
    _socket.ReceiveAsync(socketEventArgFile);
    // Блокировать поток пользовательского интерфейса для более TIMEOUT_MILLISECONDS миллисекунд.
    // Если нет ответа в течение этого времени, то продолжить
    _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
    response = "Socket is not initialized,";
}
var dialog = new MessageDialog("Сообщение :" + response);
await dialog.ShowAsync();
}

Технология получения файла такая же как и получения сообщения. Проблема в том, что с UWP никогда не работал. Есть работающий вариант консольного приложения. За любой ответ буду благодарен.

READ ALSO
Узнать запущен ли процесс по PID

Узнать запущен ли процесс по PID

Есть консольный скрипт (1), который при запуске пишет в базу свой PID полученный функцией getmypid()

430
Как оптимизировать код php/mysql?

Как оптимизировать код php/mysql?

Как можно оптимизировать код, представленный ниже?

388
Асинхронные запросы PHP

Асинхронные запросы PHP

Подскажите как лучше организовать асинхронные запросы в PHP?

460
Есть ли кеширование запросов в IIS?

Есть ли кеширование запросов в IIS?

Можно ли IIS настроить так, чтобы, например, один и тот же запрос кешировался минут на 10 и пользователю возвращался сохраненный HTML вместо нового...

276