客户端 - 服务器设置是在机器之间移动数据的好方法吗?

时间:2009-07-24 05:09:57

标签: perl sockets client-server

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

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

7 个答案:

答案 0 :(得分:5)

简短回答:使用Perl程序作为客户端或服务器就可以了。您唯一的问题可能是您的个人技能和经验水平,但在您这样做后,您就知道该怎么做了。 :)大多数问题是选择你需要做的,而不是涉及的技术。 Perl不会成为问题,但它也没有优于其他语言的优势。


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

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

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

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

但是,Perl的标准库包含Socket模块,它更易于使用(并且有详细记录)。

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

搜索CPAN可以为您节省很多痛苦。查看Net :: *层次结构中的模块

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

你基本上问了两个问题:

  1. Perl是套接字通信的合适语言吗?
  2. Perl是适合用户界面的语言吗?
  3. 参考e5的答案,Perl确实是一种以字符串为中心的语言,专注于可读字符串,处理二进制数据的能力较差。因此答案可能在于问题:您的沟通字符串是否基于?你的UI字符串是基于吗?

    如果通过套接字进行二进制交互,那么你可能比Perl做得更好(不是说C,但可能是C-ish语言)。如果您想进行图形用户交互,您可以选择一种更专注于gui交互的高级语言,从而获得更快的结果。 (Java-ish可能就是这里的事情。)

答案 6 :(得分:0)

在Perl中编写套接字通信相对容易。做得对,可靠性很大,即使CPAN模块也是容易出错的代码的例子。这取决于你的期望。