我不会再提醒你...我不知道我在做什么。

如果你想从头开始阅读。查看本系列第篇

什么是 ANSI 游戏引擎?

嗯,在它的核心,ANSI Game Engine是一个非常丰富多彩的交互式远程登录服务器。

为什么要远程登录!?

我知道,对吧!?今天我仍然问自己同样的问题,但在这一点上,我有点承诺。最初,这一切都归结为我决定编写客户端代码。我调查了一下,这不是我想做的事情。老实说,这似乎超出了我对 Perl 的舒适程度。我对使用服务器端代码感觉更舒服,也更感兴趣,这对于其他 Perl 开发人员来说可能也是如此。这就是Perl相当多产的地方。由于我使用的是ANSI graphics,因此至少对我而言,它们现在最为人所知的是用于 telnet/终端客户端和BBS 的,现在主要基于 telnet。话虽这么说,在我遇到 SyncTERM 之前没多久就搜索了谷歌。在我看来,SyncTERM是通过 telnet 跨平台渲染 ANSI 图形的最佳选择。SyncTERM 在这些平台上的工作方式最为一致,它已经存在了很长时间并且仍在积极开发中。所以telnet它是!我在 Mac、Windows 和 Linux 上尝试了许多不同的客户端。

** Telnet .... 分叉我... **

引擎必须是多人游戏。根据具体的游戏要求,这并不一定意味着玩家之间会互相交互,而是至少有多个玩家同时连接到同一个服务器。这是最低的初始要求。对我来说,这是与Fork合作的绝佳机会。我真的很喜欢用 fork 创建多个可以相互交互的进程的想法。这是一个我没有多少经验的领域,也是一个很好的学习机会。

你听说过 Perl 的 CPAN 吗?

如果您是 Perl 开发人员,显然是的。如果您用另一种语言编写代码,也许您已经听说过它。综合 Perl 存档网络或 CPAN 是 Perl 的代码模块存储库。如果你想做某事,很可能有人已经为此制作了一个模块。在撰写本文时,CPAN 目前有 208,034 个 Perl 模块,由 14,179 位作者编写。这真是太棒了!

这是我找到开发 telnet 服务器的模块的地方。一个分叉的telnet服务器,你能相信吗?叉啊! Okokok....我不会再开那个玩笑了,我保证!

让我们开始编码!

第一步是获得一个可以同时接受多个连接的 telnet 服务器。我阅读了如何使用 Perl 制作 telnet 服务器,从阅读中我很快了解到IO::Socket::INET。不久之后,我就有了 telnet 服务器的工作代码!

use strict;
use warnings;
use IO::Socket::INET;
print "\nBEGIN\n";

print "Setting up listen socket\n";
my $socket = new IO::Socket::INET (
    LocalHost => '192.168.1.15',
    LocalPort => '27777',
    Proto => 'tcp',
    Listen => SOMAXCONN,
    ReuseAddr => 1
);

my $player_socket;
my $player_data;

print "Waiting for connection ...\n";
while(1) {

    next unless $player_socket = $socket->accept();
    print "Incomming Connection!\n";

    my $player_address = $player_socket->peerhost();
    my $player_port    = $player_socket->peerport();

    my $response = "Player Connection Info: $player_address : $player_port. ";
    print "$response\n";

    $response .= "Press Any Key To Disconnect...\n";
    $player_socket->send($response);

    print "Waiting for player to press a key and disconnect...\n";
    while ($player_socket->connected()) {

        $player_socket->recv($player_data, 1024);
        if ($player_data) {
            print "Player Disconnecting $player_address : $player_port\n";
            $socket->close();
            print "Player Disconnected\n";
            last;
        }

    }
    last;
}
print "Good Bye!\n";
exit;

进入全屏模式 退出全屏模式

运行此代码并与 SyncTERM 连接显示:

localhost:~ # perl telnet_server.pl 

BEGIN
Setting up listen socket
Waiting for connection ...
Incomming Connection!
Player Connection Info: 192.168.1.9 : 55414. 
Waiting for player to press a key and disconnect...
Player Disconnecting 192.168.1.9 : 55414
Player Disconnected
Good Bye!

进入全屏模式 退出全屏模式

[图像描述](https://res.cloudinary.com/practicaldev/image/fetch/s--QEvJGtrE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/th0yb9l6o49xidryn1xg.png)

我阅读了我的Linux OpenSuSE服务器的手册页listen(2),我能理解的最好的结果是 SOMAXCONN 在Listen => SOMAXCONN中的值将允许我拥有多达 4096 个连接!?我认为这是正确的。它说该值可以在/proc/sys/net/core/somaxconn中找到,并且对该文件执行cat显示 4096。

localhost:~ # cat /proc/sys/net/core/somaxconn 
4096

进入全屏模式 退出全屏模式

现在我们只需要分叉!

事实证明,这个过程有点难以理解(对我来说),然后多几行代码就完成了 telnet 部分。我将在下一篇文章中从这里开始。

你以前做过 telnet 编程吗?如果是这样,您发现哪些模块有用? (CPAN 或其他)

如果您有任何建议或意见,请建设性地分享。此外,请访问我们的社交媒体页面,查看大量有趣的视频和图片,展示游戏引擎的运行情况。

Instagram 上的 ANSI 游戏引擎

Facebook 上的 ANSI 游戏引擎

Prev << Part 5 - 32bit -> 64bit & Perl's Storable

Next >> Part 7 - 前叉

干杯!

肖恩

Logo

更多推荐