【问题标题】:Is a client-server setup a good way to move data between machines?客户端-服务器设置是在机器之间移动数据的好方法吗?
【发布时间】:2010-11-13 15:11:25
【问题描述】:

我需要将一些数据从一台机器移动到另一台机器。在 Perl 中使用套接字编写客户端服务器应用程序来进行传输是个好主意吗?如果一侧是用 Java 编写的,我会遇到问题吗?

我的意思是,当我尝试上述方法时,我是否应该注意可能遇到的任何问题?

【问题讨论】:

  • 请告诉我们更多关于您想要实现什么样的应用程序。客户端和服务器之间要传递什么样的消息?
  • 我有点担心这会变成一场语言之战,我们可能应该结束讨论并重新开始。可能是通过创建一个更精确的问题。
  • 为什么语言大战..我在 perl 中问了一个问题.. 我想要/期待一个与 perl 相关的答案.. 不在乎它是否有任何其他语言..
  • 顺便说一句,我正在从社区的经验中寻找“是”或“否”……就这么简单……:)
  • @not-exactly-a-unixhater:您可以将您的 cmets 带到答案中并将它们添加到原始问题中以获得更好的答案。

标签: perl sockets client-server


【解决方案1】:

简短回答:使用 Perl 程序作为客户端或服务器就可以了。您唯一的问题可能是您的个人技能和经验水平,但是在您完成之后,您就会知道如何去做。 :) 大部分问题在于选择您需要的方式,而不是所涉及的技术。 Perl 不会成为问题,但与其他语言相比,它也没有优势。


正如一些人已经指出的,问题的套接字部分在大多数语言中都是相同的,因为几乎所有东西都使用 BSD 的东西。 Perl 对此没有任何障碍或特殊的陷阱。要在您周围移动数据,请创建一侧以侦听套接字,另一侧以打开连接并发送数据。十分简单。您可能想查看 Lincoln Stein 的 Network Programming with Perl 以了解这一点。这可以让你获得低级位。

对于更高级别的网络,POE 非常有用,并且在您开始使用后很容易使用。它是一个处理事件驱动编程的框架,并且有许多插件可以轻松地在进程之间进行通信。您可能会花一点时间来学习它,但它也会带来很多回报。

如果您没有发明自己的协议,很可能已经有一个可以格式化和解析消息的 Perl 模块。

如果您只想传输数据,您可以做几件事。最简单的概念可能只是将行写入套接字并将它们作为来自另一端的行读取。比这更复杂一点的是使用 Data::Dumper、YAML 或 JSON 之类的东西将数据序列化为文本并发送。对于更复杂的事情,例如共享 Perl 对象,您可能需要使用Storable。您冻结对象,将它们作为数据通过网络发送,然后在另一端解冻。

如果您想用不同的语言实现您的客户端和服务器,您需要做更多的工作来弄清楚它们将如何相互通信。套接字的内容基本相同,但 Java 服务器无法理解 Perl 的 Storable 的输出(这是可能的,但您必须自己解析它,这不好:)。如果你做的一切都正确,任何一方都不应该关心你在另一边使用了什么。

【讨论】:

    【解决方案2】:

    我只能想到一个问题:大多数基于文本的网络协议使用CRLF 作为行尾,但 UNIX 类型机器上的 Perl 默认采用 LF 结尾,这意味着您需要如果您想使用readline(又名)和print(也请注意printf,因为它不使用输出记录分隔符),请更改输入和输出记录分隔符。当然,如果您要使用预先存在的协议,CPAN 上可能已经有一个Net::<PROTOCOL NAME> 模块,因此您无需担心。如果您正在设计自己的协议,我会保留CRLF 约定,因为它可以很容易地使用telnet 调试服务器(这实际上是该程序的最后一个有效用途)。

    【讨论】:

    • 所以如果我用 java 写客户端,用 perl 写服务器,我传递的消息会不会有问题?
    • 只要你开发了一个协议并在两端都遵循它,你应该是安全的。
    • Socket.pm 为您提供常量 $CR、$LF 和 $CRLF。
    【解决方案3】:

    您没有说是否需要实现您的应用程序以支持任何特定协议,或者您是否需要实现一个本地协议。 Perl 中的网络支持足够灵活,可以支持任何一种(或介于两者之间的大多数地方)。

    在低级套接字端,无论您使用什么语言,您的代码都将非常相似 - BSD 套接字 API 在任何受支持的地方都非常相似。您需要的支持已内置在 Perl 中,但低级套接字编程可能会令人沮丧——它非常低级。

    然而,Perl 的标准库包含 Socket 模块,它更容易使用(并且有很好的文档说明)。

    如果您需要实施现有协议,您可能会发现它已经实施。例如Net::Telnet 实现命令/响应协议(如 Telnet),使客户端应用程序变得微不足道。

    搜索 CPAN 可能会为您省去很多麻烦。查看 Net::* 层次结构中的模块

    【讨论】:

    • 为什么我要编写一个应用程序来支持特定协议.. 我只想使用 perl 中的套接字将一些数据从机器 A 移动到机器 B。现在这是个好主意吗?是我的问题..
    • 你没有说客户是干什么用的。它可能是一个 Web 用户代理,因此您可以支持 HTTP。实际上,如果您想移动一些数据,您可能只需使用 CPAN 上的简单 HTTP 服务器模块和 LWP 客户端工具之一。您可能最多可以用 200 行编写代码。
    【解决方案4】:

    我认为您不会遇到不使用 Perl 就不会遇到的任何重大问题。由于网络延迟,甚至性能也可与其他解决方案相媲美。 您可能想查看POE framework。它使编写这样的组件变得轻而易举。

    【讨论】:

      【解决方案5】:

      这可能取决于几个因素。速度或响应能力重要吗?您是否在它们相同类型的机器(Unix 到 Unix,Windows 到 Windows)之间移动数据?您要移动什么类型的数据(文本或二进制)?关于套接字的知识有哪些,你有什么语言经验?

      我已经通过 PERL 套接字从不同的应用程序发送和接收二进制数据,但是我对通过来自不同机器的套接字进行文本处理没有太多经验。如果您在机器之间移动数据,您需要记住数据的编组方式以及数据是否在某个字节边界上打包或对齐。我没有与 Java 程序交换数据,但应该是类似的。

      对 PERL 有一些经验可能会有所帮助,我建议您查看“camel”书中的示例。我以书中的内容为起点,并针对我需要实现的目标进行了修改。如果您正在处理二进制数据,或者帮助进行翻译以发送数据,您可能需要查阅本书的其他部分。

      【讨论】:

        【解决方案6】:

        在 Perl 中编写套接字通信相对容易。即使 CPAN 模块是容易出错的代码的例子,做到正确和可靠也是一大痛苦。这取决于您的期望。

        【讨论】:

          【解决方案7】:

          你基本上是在问两个问题:

          1. Perl 是适合套接字通信的语言吗?
          2. Perl 是适合 UI 的语言吗?

          参考 e5 的回答,Perl 确实是一种以字符串为中心的语言,专注于可读的字符串,不太适合处理二进制数据。因此,答案可能在于以下问题:您的通信字符串是否基于?你的 UI 是基于字符串的吗?

          如果通过套接字进行二进制交互,那么您可能会比 Perl 做得更好(不是在谈论 C,但可能是 C-ish 语言)。如果您想进行图形用户交互,您可能会通过选择一种更专注于 gui 交互的高级语言来获得更快的结果。 (这里可能是 Java 风格的东西。)

          【讨论】:

          • Perl 可以很好地处理二进制数据,请参阅打包和解包功能。而且我更愿意使用 Perl 和 Gtk2 而不是 Java 和 Swing 或 AWT 来编写 GUI 应用程序。
          • 好的,那么我必须声称自己无知并请求原谅我误判了 perl。我可以补充一点,一个人应该使用他最精通的语言。(在一些可用性问题上,我指的是汇编程序和从处理器寄存器中凿出一个 GUI。)
          • 我从“客户端应用程序”推断“UI”。但我想强调的是,CLI 或 GUI 都包含 UI,并且两者之间有很多阴影(CLI 完成、诅咒、屏幕)。 [今天声望值波动]
          • 我想 -1 是为了回答“处理二进制数据的能力较差”。 Perl 并没有真正区分这两者。
          • 您可能使用过的非 gui 网络客户端的简短列表:ftp、telnet、ssh、wget、curl 等。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-20
          • 2012-09-26
          • 2012-05-14
          • 1970-01-01
          • 2016-05-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多