首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#网站服务器连接问题

C#网站服务器连接问题
EN

Stack Overflow用户
提问于 2008-10-26 20:56:56
回答 4查看 4.4K关注 0票数 1

我正在试着做一个简单的C#网络服务器,在这个阶段,你可以通过你的浏览器访问,并且只会做一个"Hello World“。

我遇到的问题是,服务器可以很好地接收数据-我可以获得浏览器的头信息-但浏览器不会接收我发送的任何内容。此外,我只能通过转到localhost (或127.0.0.1)来连接到服务器。我不能通过转到我的IP来访问它,这也不是一个网络设置,因为如果我运行它,Apache工作得很好。此外,我正在使用一个端口监控程序,在我尝试从浏览器进行连接后,进程的端口仍然停留在TIME_WAIT状态,即使我告诉连接关闭,它应该返回侦听。

下面是相关的代码。几个调用可能没有意义,但这是一个更大的程序的一部分。

代码语言:javascript
复制
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);
    }
}

有谁有什么想法吗?感觉这一定是我的愚蠢行为,但我就是不知道是什么。我真的很感激任何有见地的

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-10-26 21:13:47

你可能想知道,你可以很容易地使用HttpListener编写一个基本的web服务器--这解决了大部分痛苦的部分,让你专注于编写实际的代码。MSDN页面给出了一个示例。

请注意,它使用HTTP.SYS,这很好-但这意味着需要显式地授予非管理员访问开放端口的权限;在xp上,您可以使用httpcfg;在vista上,您可以使用netsh。有关详细信息,请参阅here

票数 1
EN

Stack Overflow用户

发布于 2008-10-26 21:03:24

目前没有问题的一件事是,您的内容长度基于消息字符串的Unicode长度,而不是二进制长度。

在连接构造函数中也有相当多的东西-这些东西根本不属于构造函数,IMO。如果发生异常,它也不会关闭东西。

您看过像WireShark这样的网络跟踪器中发生了什么吗?这将是查看是否有数据被发送回客户端的最简单方法。

或者,发布一个简短但完整的代码版本,我们可以自己编译和运行。

票数 1
EN

Stack Overflow用户

发布于 2008-10-26 21:26:14

也许我只是错过了一些东西,但你只能在本地主机上连接的原因是因为你监听的IP是127.0.0.1,这使得TCPListener只能监听该IP地址。我没有看到任何地方你调用任何客户端断开连接,TCPListener是一个阻塞调用,所以它永远在那里,直到建立连接。根据我过去使用TCP/IP和TCPListener、TCPClient类的经验,在您删除客户端连接之前,没有多少方法可以强制侦听器删除它的连接。调用TCPListener.Abort()不会丢弃保持端口阻塞的客户端连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/238606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档