我在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将一些数据写入STDOUT(" asdf asdf \ n"),则代码可以工作。在send()的最后一次调用之后,因此我的假设。
还是我在错误的树上吠叫?
答案 0 :(得分:5)
你的代码实际上对我有用......但是一些可能有所帮助的改变:
1)在响应中添加Content-length标头
2)使用\ r \ n \ r \ n来结束标题而不是\ n \ n。
如果这些没有帮助,也可能是防火墙或类似设备阻止连接的问题。
答案 1 :(得分: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等)。