Haxe 读取HashLink上带有套接字的HTTP请求

Haxe 读取HashLink上带有套接字的HTTP请求,haxe,hashlink,Haxe,Hashlink,我正在尝试使用haxe(4)和HashLink(1.9.0)构建一个HTTP服务器,但是sockets似乎工作得不太好 import haxe.io.Error; import sys.net.Host; import sys.net.Socket; class Main { static public function main() { var _aSocketDistant = new List<Socket>(); var _oSo

我正在尝试使用haxe(4)和HashLink(1.9.0)构建一个HTTP服务器,但是sockets似乎工作得不太好

import haxe.io.Error;
import sys.net.Host;
import sys.net.Socket;

class Main {
    static public function main() {

        var _aSocketDistant = new List<Socket>();

        var _oSocketMaster = new Socket();
        _oSocketMaster.bind( new Host( 'localhost' ), 8000);
        _oSocketMaster.setBlocking( false );
        _oSocketMaster.listen( 9999 );

        while(true) {

            // Accepting socket
            var oSocketDistant = _oSocketMaster.accept();
            if ( oSocketDistant != null ) {
                trace( 'opening : ' + oSocketDistant.peer() );
                oSocketDistant.setBlocking( false );
                _aSocketDistant.add( oSocketDistant );
            }

            // Trying to read from each socket 
            for ( oSocketDistant in _aSocketDistant ) {
                try {
                    trace( oSocketDistant.read() );
                } catch ( e :Dynamic ) {
                    if ( e != Error.Blocked )
                        throw e;
                }
            }

        }
    }
}
导入haxe.io.Error;
导入sys.net.Host;
导入sys.net.Socket;
班长{
静态公共函数main(){
var_aSocketDistant=新列表();
var_oSocketMaster=新套接字();
_绑定(新主机('localhost'),8000);
_oSocketMaster.setBlocking(错误);
_oSocketMaster.听着(9999);
while(true){
//接受插座
var oSocketDistant=_oSocketMaster.accept();
如果(OSocketInstant!=null){
跟踪('opening:'+oSocketDistant.peer());
oSocketDistant.SETBOCKING(假);
_aSocketDistant.add(oSocketDistant);
}
//正在尝试读取每个套接字
用于(oSocketDistant in_aSocketDistant){
试一试{
跟踪(oSocketDistant.read());
}捕获(e:动态){
如果(e!=错误。已阻止)
投掷e;
}
}
}
}
}
运行这段代码,然后使用firefox调用,我得到以下信息:

Main.hx:27:opening:{host:127.0.0.1,port:65154}

远处的插座从未有任何消息可供读取。
它不应该发送请求吗?

问题似乎是使用了
read()
。这似乎是:

您的实际问题是
read()
将读取整个数据。在阻塞套接字上,该套接字将阻塞直到连接关闭。在非阻塞插座上,该插座将始终引发
阻塞
。相反,您必须使用
input.readBytes
,它将返回读取的字节数,然后确保正确管理缓冲区数据

在这种情况下,使用
input.readLine()
可能是最简单的解决方案:

trace(oSocketDistant.input.readLine());
这样,我可以按预期看到HTTP请求:

Main.hx:20:opening:{host:127.0.0.1,端口:50231}
Main.hx:29:GET/HTTP/1.1
Main.hx:29:Host:localhost:8008
Main.hx:29:连接:保持活动
Main.hx:29:升级不安全请求:1
Main.hx:29:用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/73.0.3683.86 Safari/537.36
Main.hx:29:DNT:1
Main.hx:29:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,图像/webp,图像/apng,*/*;q=0.8,申请/签名交换;v=b3
Main.hx:29:接受编码:gzip,deflate,br
Main.hx:29:接受语言:de-de,de;q=0.9,在美国;q=0.8,en;q=0.7
Main.hx:29:Cookie:Idea-369662de=0cbb3289-7f2c-4f82-a094-7409DBA8CF00
Main.hx:29:

好的,我想我现在明白了,读取不起作用可能是因为它需要流的结尾(永远不会出现),但另一方面,像readByte或readLine这样的函数会产生,因为它们只需要一个字符或大小来结束读取。我只知道hashlink有
libuv
,因此,我认为它可能比sys.net.Socket更好。