使用 Perl 开发游戏引擎:第 6 部分 - 多彩的 Telnet 服务器
我不会再提醒你...我不知道我在做什么。 如果你想从头开始阅读。查看本系列第篇 什么是 ANSI 游戏引擎? 嗯,在它的核心,ANSI Game Engine是一个非常丰富多彩的交互式远程登录服务器。 为什么要远程登录!? 我知道,对吧!?今天我仍然问自己同样的问题,但在这一点上,我有点承诺。最初,这一切都归结为我决定不编写客户端代码。我调查了一下,这不是我想做的事情。老实说,这似乎超出了我对 P
我不会再提醒你...我不知道我在做什么。
如果你想从头开始阅读。查看本系列第篇
什么是 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 - 前叉
干杯!
肖恩
更多推荐
所有评论(0)