Top / JUNK / HttpListener

HttpListener を使うと HTTP サーバーが簡単にできちゃいます。 以下、POST されたバイナリデータをファイルに書き出すサンプルです。

using System;
using System.IO;
using System.Net;
using System.Text;

namespace httpServer
{
    static class Program
    {
        [STAThread]
        static void Main() {
            var listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:8000/");
            listener.Start();
            listener.BeginGetContext(OnRequested, listener);
            while (Console.ReadKey().KeyChar != 'Q');
            listener.Stop();
        }

        static void OnRequested(IAsyncResult ar) {
            var listener = (HttpListener)ar.AsyncState;
            var context = listener.EndGetContext(ar);
            listener.BeginGetContext(OnRequested, listener);
            using (var sr = new BinaryReader(context.Request.InputStream)) {
                int len = (int)context.Request.ContentLength64;
                var video = sr.ReadBytes(len);
                using (var fs = new FileStream(@"Z:\OUT" + context.Request.RawUrl, FileMode.Create)) {
                    using (var writer = new BinaryWriter(fs)) {
                        writer.Write(video);
                    }
                }
            }
            var res = context.Response;
            res.StatusCode = 200;
            res.ContentType = "text/html";
            using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF8)) {
                writer.WriteLine("Ok");
            }
            res.Close();
        }
    }
}

クライアントはこんな感じ。

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace httpClientApp
{
    class Program
    {
        static async Task Main(string[] args) {
            await SendFileBainry("video/mp4", @"Z:\IN\test.mp4");
            await SendFileBainry("image/png", @"Z:\IN\test.png");
        }

        static async Task SendFileBainry(string contentType, string fileName) {
            Byte[] bytes;
            using (var fs = new FileStream(fileName, FileMode.Open)) {
                using (var br = new BinaryReader(fs)) {
                    bytes = br.ReadBytes((int)fs.Length);
                }
            }
            string contentName = Path.GetFileName(fileName);
            string url = $"http://localhost:8000/{contentName}";
            using (var client = new HttpClient()) {
                using (var content = new ByteArrayContent(bytes)) {
                    content.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
                    var response = await client.PostAsync(url, content);
                    string x = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(x);
                    Console.ReadKey();
                }
            }
        }
    }
}



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2019-08-05 (月) 17:09:23 (131d)