关于c# HttpListener外网不能连接的问题

老杂毛一番 2014-12-27 01:37:53
在服务器端开启一个端口监听服务

服务器本地访问没有问题

但是我在客户端访问的时候,却是400错误,没有找到监听的端口号

服务器端HttpListener的代码如下

//开启服务按钮
private void btn_Start_Click(object sender, EventArgs e)
{
btn_Start.Enabled = false;
btn_Selectfolder.Enabled = false;

Begin(tb_address.Text.Trim(),tb_webRoot.Text.Trim());

btn_Stop.Enabled = true;
}
private void Begin(string addressstr,string folder)
{
if (!addressstr.EndsWith("/"))
{
addressstr += "/";
}

if (!folder.EndsWith("\\"))
{
folder += "\\";
}

WebServerParamter para = new WebServerParamter()
{
ListenerUrl=addressstr,
WebRootFolder=folder
};
webthread = new Thread(doWork);
webthread.Start(para);
}
private void doWork(object obj)
{
WebServerParamter para = obj as WebServerParamter;
using (HttpListener listerner = new HttpListener())
{
listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
listerner.Prefixes.Add(para.ListenerUrl);
listerner.Start();
StatusAppend("WebServer Start Successed.......");
try
{

while (true)
{
if (IsClose)
{
StatusAppend("WebServer Stop Successed.......");
break;
}
//等待请求连接
//没有请求则GetContext处于阻塞状态
HttpListenerContext ctx = listerner.GetContext();

System.Threading.ThreadPool.QueueUserWorkItem(ProcessHttpClient,
new WebServerRequestParamter(){
Context=ctx,
WebRootFolder=para.WebRootFolder
});

}
}
catch (Exception ex)
{
}
finally
{
listerner.Stop();
}

}
}
void ProcessHttpClient(object obj)
{
WebServerRequestParamter para = obj as WebServerRequestParamter;


HttpListenerContext context = para.Context;
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;

//do something as you want
//string responseString = string.Format("<HTML><BODY> {0}</BODY></HTML>", DateTime.Now);
//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();


if (IsClose)
{
//StatusAppend("WebServer Stop Successed.......");
return;
}

StatusAppend("Request:" + request.Url);

response.StatusCode = 200;//设置返回给客服端http状态代码
string url = request.RawUrl;

string filepath =Path.Combine(para.WebRootFolder, request.Url.AbsolutePath.TrimStart('/').Replace("/","\\"));

if (!File.Exists(filepath))
{

if (filepath.EndsWith(".aspx"))
{
using (StreamWriter writer = new StreamWriter(response.OutputStream))
{
//StringWriter sw = new StringWriter();
//HttpServerUtility server = new HttpServerUtility();
//server.Execute(filepath, sw);

//HttpContext

//string content = sw.ToString();

writer.Write("不支持aspx");

writer.Close();
response.Close();
}
}
else
{
//使用Writer输出http响应代码
using (StreamWriter writer = new StreamWriter(response.OutputStream))
{
response.ContentEncoding = Encoding.UTF8;


writer.WriteLine("<html><head><title>访问的文件不存在!</title><meta http-equiv=\"X-UA-Compatible\" content=\"IE=7\"><meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"></head><body>");
writer.WriteLine("<div><p> 访问的文件不存在!</p></div>");
writer.WriteLine("</body></html>");

writer.Close();
response.Close();
}
}
}
else
{

using (Stream outstream = response.OutputStream)
{
using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int _cachesize = 128;
byte[] bytes = new byte[_cachesize];
int numBytesToRead = (int)fs.Length;
//int numBytesRead = 0;
response.ContentLength64 = numBytesToRead;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = fs.Read(bytes, 0, _cachesize);
outstream.Write(bytes, 0, n);
// Break when the end of the file is reached.
if (n == 0)
break;
//numBytesRead += n;
numBytesToRead -= n;
}
}

outstream.Close();
}
}



}
...全文
755 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
listener.Prefixes.Add("http://+:5674"); listener.Prefixes.Add("https://+:5674");

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧