1

我在 D 中有以下原始服务器:

import std.stdio; 
import std.socket; 

int main() {

const int port = 8080; 

InternetAddress addr = new InternetAddress(InternetAddress.ADDR_ANY, port); 
TcpSocket server = new TcpSocket(AddressFamily.INET); 

server.bind(addr); 
server.listen(10);


for(;;) {

    Socket newclient = server.accept(); 

    newclient.send("HTTP/1.1 200 OK\r\n"); 
    newclient.send("Content-type: text/html\n\n"); 
    newclient.send("Hi from D!");

    newclient.shutdown(SocketShutdown.BOTH); 
    newclient.close(); 
}



    return 0;
}

如果我使用浏览器连接,它不会显示“Hi From D!”,而只是断开连接。

我的假设是 send() 缓冲数据,我必须刷新该缓冲区。但我还没想好你会怎么做。有趣的是,如果使用 writefln("asdf asdf\n"); 将一些数据写入 STDOUT,则代码可以工作。在最后一次调用 send() 之后,因此我的假设。

还是我在叫错树?

4

2 回答 2

5

这可能是一个标题问题,尝试类似:

// -- cut --

Socket newclient = server.accept(); 

newclient.send("HTTP/1.1 200 OK\r\n"); 
newclient.send("Content-type: text/plain\r\n"); 
newclient.send("Connection: close\r\n\r\n");
newclient.send("Hi from D!\r\n");

newclient.shutdown(SocketShutdown.BOTH); 
newclient.close();

// -- cut --

更新:我重新检查了 win64 下的代码片段我对内容类型的猜测似乎是正确的。如果您将内容声明为text/html ,您应该提供有效的html ,即

<html><body>Hi from D!</body></html>

或提供正确的 contnet 类型(即text/plain)。

请注意,我只在 Windows 上得到这种行为,即在 linux 上,您的代码片段按原样工作(使用 ff、telnet 等)。

于 2012-12-11T20:54:25.050 回答
5

您的代码实际上对我有用....但是一些更改可能会有所帮助:

1) 在响应中添加 Content-length 标头

2) 使用 \r\n\r\n 结束标题而不是 \n\n。

如果这些都没有帮助,也可能是防火墙或类似阻止您的连接的问题。

于 2012-12-11T20:24:51.120 回答