代码之家  ›  专栏  ›  技术社区  ›  mustafabar

使用httpwebrequest.getrequeststream时无法连接到远程服务器

  •  0
  • mustafabar  · 技术社区  · 16 年前

        class Server
    {
        static void Main(string[] args)
        {
            NonblockingListener(new string[] {"http://192.168.0.55:5432/"});
        }
    
        public static void NonblockingListener(string[] prefixes)
        {
            HttpListener listener = new HttpListener();
            foreach (string s in prefixes)
            {
                listener.Prefixes.Add(s);
            }
            listener.Start();
            IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);     
            Console.WriteLine("Waiting for request to be processed asyncronously.");
            result.AsyncWaitHandle.WaitOne();
            Console.WriteLine("Request processed asyncronously.");
            listener.Close();
        }
    
        public static void ListenerCallback(IAsyncResult result)
        {
            HttpListener listener = (HttpListener)result.AsyncState;
            // Call EndGetContext to complete the asynchronous operation.
    
            HttpListenerContext context = listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;
            Stream reader = request.InputStream;
    
    
            HttpListenerResponse response = context.Response;
    
            string responseString = "<HTML><BODY> Hello World!</BODY></HTML>";
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
    
            response.ContentLength64 = buffer.Length;
            System.IO.Stream output = response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
    
            output.Close();
        }
    
    
    }
    
    
       class Client
    {
        public static void Main()
        {
            // Create a request using a URL that can receive a post. 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.0.55:5432");
    
            request.UserAgent = "linkToShare - HTTPWebRequest";
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "data data data data.";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;          
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    
    }
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   Darin Dimitrov    16 年前

    您的代码的问题在于您调用的服务器中 EndGetContext 方法,该方法将设置waithandle并在服务器有时间发送响应之前立即关闭服务器。

    这是对代码的一个小修改。

    服务器:

    class Program
    {
        private static ManualResetEvent _waitHandle = new ManualResetEvent(false);
    
        static void Main()
        {
            NonblockingListener(new string[] { "http://+:5432/" });
        }
    
        public static void NonblockingListener(string[] prefixes)
        {
            using (var listener = new HttpListener())
            {
                foreach (string s in prefixes)
                {
                    listener.Prefixes.Add(s);
                }
                listener.Start();
                var result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
                Console.WriteLine("Waiting for request to be processed asyncronously.");
    
                // Block here until the handle is Set in the callback
                _waitHandle.WaitOne();
                Console.WriteLine("Request processed asyncronously.");
                listener.Close();
            }
        }
    
        public static void ListenerCallback(IAsyncResult result)
        {
            var listener = (HttpListener)result.AsyncState;
            var context = listener.EndGetContext(result);
    
            var response = context.Response;
            string responseString = "<HTML><BODY>Hello World!</BODY></HTML>";
            byte[] buffer = Encoding.UTF8.GetBytes(responseString);
            response.ContentLength64 = buffer.Length;
            response.OutputStream.Write(buffer, 0, buffer.Length);
            // Finished sending the response, now set the wait handle
            _waitHandle.Set();
        }
    }
    

    客户:

    class Program
    {
        static void Main(string[] args)
        {
            using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.UserAgent] = "linkToShare - HTTPWebRequest";
                var valuesToPost = new NameValueCollection
                {
                    { "param1", "value1" },
                    { "param2", "value2" },
                };
                var result = client.UploadValues("http://127.0.0.1:5432", valuesToPost);
                Console.WriteLine(Encoding.UTF8.GetString(result));
            }
        }
    }