Question

I've been writing a server for an app of mine. Due to suggestions, I decided to use HttpListener to listen for incoming connections in an async method. My current code is as following:

        public static async void StartServerAsync()
        {
            while (true)
            {
                Console.WriteLine("Waiting for client.. ");
                var context = await listener.GetContextAsync();
                Console.WriteLine("Client connected!");
// ReSharper disable once CSharpWarnings::CS4014
                Task.Factory.StartNew(() => ProcessClient(context));
            }
            listener.Close();
        }

This method is started with this:

public static void ServerBoot()
{
    listener.Prefixes.Add("http://localhost:1000/");
    listener.Start();
    StartServerAsync();
}

The ProcessClient() method is as following:

private static void ProcessClient(HttpListenerContext context)
{
    try
    {
        var request = context.Request;
        string response;
        using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            response = reader.ReadToEnd();
        }
        Console.WriteLine("Got command: {0}", response);
    }
    catch (WebException)
    {
        Console.WriteLine("Error reading string, closing..");
        return;
    }
}

Right now it's only supposed to get the string posted. However, when I run the client with this code:

                Console.WriteLine(" -- Bagrut Client -- ");
                Console.Write("Enter IP of server to connect to: ");
// ReSharper disable once AssignNullToNotNullAttribute
                var ip = Console.ReadLine();
                WebClient client = new WebClient();
                var response = client.UploadString(ip, "query");
                Console.WriteLine("Type of response is {0}", response);

the server does not do anything. As you can see in ProcessClient(), and in the server loop itself, it should at least say something when a client connects. However, when the code is run, nothing happens. Am I doing something wrong?

EDIT: new code:

        public static void ServerBoot()
        {
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:1337/");
            listener.Start();
            StartServerAsync(listener).ContinueWith(task => { });
        }
        private static void ProcessClient(HttpListenerContext context)
        {
            try
            {
                var request = context.Request;
                string response;
                using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
                {
                    response = reader.ReadToEnd();
                }
                Console.WriteLine("Got command: {0}", response);
            }
            catch (WebException)
            {
                Console.WriteLine("Error reading string, closing..");
                return;
            }
        }
        private static async Task StartServerAsync(HttpListener listener)
        {
            while (true)
            {
                Console.WriteLine("Waiting for client.. ");
                var context = await listener.GetContextAsync();
                Console.WriteLine("Client connected!");
// ReSharper disable once CSharpWarnings::CS4014
                Task.Factory.StartNew(() => StartServerAsync(listener));
                ProcessClient(context);
                await StartServerAsync(listener);
            }
            listener.Close();
        }

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top