【问题标题】:How do I use Haxe sockets in a cross-platform way without blocking?如何在不阻塞的情况下跨平台使用 Haxe 套接字?
【发布时间】:2016-09-02 12:31:37
【问题描述】:

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

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

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

【问题讨论】:

  • 在非阻塞模式下,我最初也遇到了一些不寻常的错误,比如 eof。我还没有时间回答,但也许看看这段代码。 github.com/5Mixer/mphx/blob/master/mphx/server/impl/… 所以我们有一个socket来监听连接,然后每个连接处理eof错误等。
  • 我想出了答案,但没有看到它发布在其他任何地方,所以我写了这个问题并自己回答了。但是,该代码对于记录我在回答中忽略的特定错误处理非常有用。我会用信息更新它。

标签: sockets network-programming haxe


【解决方案1】:

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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多