C#Web服务器连接问题
我试图做一个简单的C#web服务器,在这个阶段,你可以通过浏览器访问,只会做一个“Hello World”。C#Web服务器连接问题
我遇到的问题是服务器可以接收数据正常 - 我得到浏览器的头信息 - 但浏览器没有收到我发送的任何内容。此外,我只能通过转到localhost(或127.0.0.1)连接到服务器。我不能通过去我的IP,它不是一个网络设置,因为Apache运行良好,如果我运行它。另外,我正在使用一个端口监视程序,并且在我尝试从浏览器进行连接之后,即使我告诉连接关闭,进程的端口仍然处于TIME_WAIT状态,应该返回到LISTEN状态。
下面是相关的代码。一对夫妇的电话可能没有意义,但这是一个更大的计划。
class ConnectionHandler
{
private Server server;
private TcpListener tcp;
private ArrayList connections;
private bool listening;
private Thread listeningThread;
public Server getServer()
{
return server;
}
private void log(String s, bool e)
{
server.log("Connection Manager: " + s, e);
}
private void threadedListen()
{
while (listening)
{
try
{
TcpClient t = tcp.AcceptTcpClient();
Connection conn = new Connection(this, t);
}
catch (NullReferenceException)
{
log("unable to accept connections!", true);
}
}
log("Stopped listening", false);
}
public void listen()
{
log("Listening for new connections", false);
tcp.Start();
listening = true;
if (listeningThread != null && listeningThread.IsAlive)
{
listeningThread.Abort();
}
listeningThread = new Thread(new ThreadStart(
this.threadedListen));
listeningThread.Start();
}
public void stop()
{
listening = false;
if (listeningThread != null)
{
listeningThread.Abort();
log("Forced stop", false);
}
log("Stopped listening", false);
}
public ConnectionHandler(Server server)
{
this.server = server;
tcp = new TcpListener(new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 80));
connections = new ArrayList();
}
}
class Connection
{
private Socket socket;
private TcpClient tcp;
private ConnectionHandler ch;
public Connection(ConnectionHandler ch, TcpClient t)
{
try
{
this.ch = ch;
this.tcp = t;
ch.getServer().log("new tcp connection to "
+ this.tcp.Client.RemoteEndPoint.ToString(), false);
NetworkStream ns = t.GetStream();
String responseString;
Byte[] response;
Int32 bytes;
responseString = String.Empty;
response = new Byte[512];
bytes = ns.Read(response, 0, response.Length);
responseString =
System.Text.Encoding.ASCII.GetString(response, 0, bytes);
ch.getServer().log("Received: " + responseString);
String msg = "<html>Hello World</html>";
String fullMsg = "HTTP/1.x 200 OK\r\n"
+ "Server: Test Server\r\n"
+ "Content-Type: text/html; "
+ "charset=UTF-8\r\n"
+ "Content-Length: " + msg.Length + "\r\n"
+ "Date: Sun, 10 Aug 2008 22:59:59 GMT"
+ "\r\n";
nsSend(fullMsg, ns);
nsSend(msg, ns);
ns.Close();
tcp.Close();
}
catch (ArgumentNullException e)
{
ch.getServer().log("connection error: argument null exception: " + e);
}
catch (SocketException e)
{
ch.getServer().log("connection error: socket exception: " + e);
}
}
private void nsSend(String s, NetworkStream ns)
{
Byte[] data = System.Text.Encoding.ASCII.GetBytes(s);
ns.Write(data, 0, data.Length);
ns.Flush();
ch.getServer().log("Sent: " + s);
}
}
有没有人有任何想法?这感觉就像我的一部分是愚蠢的,但我不知道是什么。我真的很感激任何见解
您可能想知道,您可以使用HttpListener
轻松编写基本的Web服务器 - 这可以处理大部分痛苦的事情,让您专注于编写实际的代码。 MSDN页面举例说明。
请注意,这使用HTTP.SYS,这是很好 - 但意味着非管理员需要明确给予访问打开的端口;在XP上,你可以用httpcfg
来做到这一点;在Vista上,您可以使用netsh
。有关更多信息,请参阅here。
有一两件事,是不是现在的一个问题,但可能以后是你的内容长度是基于Unicode的长度消息字符串的,而不是二进制长度。
在Connection构造函数中还有很多东西 - 实际上根本不属于构造函数的东西,IMO。如果发生异常,它也不会结束。
你看过像WireShark这样的网络追踪器发生了什么吗?这将是查看是否有任何数据被发送回客户端的最简单方法。
或者,发布一段简短但完整的代码,我们可以编译和运行自己的代码。
也许我只是错过了一些东西,但你只能在本地主机上连接的原因是你正在监听的IP是127.0.0.1,这使得TCPListener只能监听该IP地址。而且我没有看到任何你调用任何客户端断开连接的地方,TCPListener是一个阻塞呼叫,所以它永远坐在那里,直到连接完成。在我以前使用TCP/IP和TCPListener的经验中,TCPClient类没有太多方法强制侦听器放弃连接,直到删除客户端连接。调用TCPListener.Abort()不会丢弃阻止端口阻塞的客户端连接。
那么,如果你打算把所有的乐趣都拿出来......;) – 2008-10-26 21:17:30