2010-10-24 467 views
0

我在本地机器上创建了一个简单的HTTP客户端/服务器应用程序,但我不知道为什么在服务器上触发了ListenerCallback;然而,当投掷“网络异常EndGetContext没有完成:?无法连接到客户端上删除服务器”任何想法,这里的代码使用HttpWebRequest.GetRequestStream时无法连接到远程服务器

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(); 
    } 

} 

回答

0

与您的代码的问题是,在服务器中,你在呼唤。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)); 
     } 
    } 
} 
+0

我在这两个客户端/服务器端复制你的确切代码。 client.UploadValues给了我这个WebException {“无法将数据写入传输连接:现有连接被远程主机强制关闭。”} – mustafabar 2010-10-24 09:33:34

+0

服务器是否引发异常?查看事件日志。 – 2010-10-24 09:36:24

+0

我注意到服务器在客户端继续执行UploadValues之前仍然关闭 – mustafabar 2010-10-24 09:57:41

相关问题