gpt4 book ai didi

sockets - 如何在不阻塞的情况下跨平台使用 Haxe 套接字?

转载 作者:行者123 更新时间:2023-12-02 21:24:54 25 4
gpt4 key购买 nike

大多数有关 Haxe 工具包使用套接字的指南都依赖于线程的使用,而线程是特定于平台的。这是因为套接字默认是阻塞的,这使得它们不适合许多类型的应用程序,包括游戏。

我知道有一个非阻塞模式,但我无法让它在不引发异常的情况下运行。

如何在不依赖线程的情况下以跨平台方式使用套接字?

最佳答案

sys.net.Socket是主要的套接字实现,适用于九个 Haxe 目标:Python、HashLink、Neko、Java、Macro、C++、Lua、PHP 和 C#。

以线程方式使用这些套接字的一种方法以及进一步的背景是 provided here.

但是,Haxe 文档并没有明确说明套接字如何在非阻塞模式下工作。下面的示例适用于客户端,可能会在游戏中使用 - 其他用法应该类似。为此,请创建一个套接字并以常规方式连接它:

var socket = new Socket();

try
{
socket.connect(new Host('example.com'), 80);
}
catch (e: Dynamic)
{
// handle connection errors...
}

成功建立连接后,应关闭阻塞模式:

socket.setBlocking(false);

然后我们可以使用 socket.input 从套接字读取数据,但需要注意的是我们必须使用 try-catch 异常处理:

var out: String = '';
try
{
// could also use .input.readByte(), .input.readDouble() etc.
// .read() doesn't work, however.
out = socket.input.readLine();
}
catch (e: Dynamic) // catch all types of errors
{
// can handle specific types of exceptions here.
}

由于套接字是非阻塞的,我们必须在循环中调用它。每次调用此方法时,我们都会收到一个可以忽略的“操作将阻塞”异常。此异常用于在等待数据时中断从套接字的读取以在循环中执行其他操作。

以类似的方式,我们可以写入套接字:

var msg: String = 'hello world!\r\n';
try
{
// could also use socket.write(msg) or socket.output.writeByte() etc...
socket.output.writeString(msg);
}
catch (e: Dynamic) { }

我们还可以进行具体的异常处理:

catch (e: Dynamic)
{
// end of stream
if (Std.is(e, haxe.io.Eof) || e == haxe.io.Eof)
{
// close the socket, etc.
}
else if (e == haxe.io.Error.Blocked)
{
// not an error - this is still a connected socket.
break;
}
else
{
trace(e);
}
}

关于sockets - 如何在不阻塞的情况下跨平台使用 Haxe 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com