用于本地客户端-服务器通信的套接字与标准流
Posted
技术标签:
【中文标题】用于本地客户端-服务器通信的套接字与标准流【英文标题】:Sockets vs Standard Streams for local client-server communication 【发布时间】:2013-03-12 17:40:51 【问题描述】:我有一个由本地“服务器”和 GUI 客户端组成的应用程序。服务器是用 Python 编写的,而 GUI 是可变的,并且是用 Flex 4 编写的。客户端查询本地服务器的信息并相应地显示它。这两个应用程序都应该在同一台计算机上运行,并且只能在本地进行通信。目前,客户端和Python服务器通过一个基本的socket进行通信,客户端向socket写入请求,socket返回一些数据。
但是,由于我正在编写一个桌面应用程序,我认为使用标准流而不是套接字的系统可能更容易维护和完善。服务器将持续监听raw_input()
,并根据写入标准输入的任何内容进行输出,在这种情况下,客户端将使用AIR 的NativeProcess
类来读取和写入标准输出和标准输入,而不是使用套接字。
客户端和服务器是独立的进程,但应该或多或少同时启动。我真的不需要复杂的网络,只需要本地跨语言交流。
每种方法的优缺点是什么?使用套接字我会得到什么或失去什么,而使用标准流进行通信我会得到什么或失去什么?哪个效率更高?哪一个更容易维护?
【问题讨论】:
【参考方案1】:在类 UNIX 平台上,使用 stdin/stdout 是一个套接字,所以没有区别。也就是说,如果您启动一个重定向其 stdout 的进程,通常会使用 socketpair 来完成,因此不需要让您自己的 UNIX 域套接字进行通信。用于处理 stdin/stdout 的 Python 类不会让您访问底层套接字的全部灵活性,因此您必须自己设置它我认为如果您想做半关闭,例如(Python不能提供跨平台,因为 Windows sys::stdin 不能是套接字,例如,它也不总是在 UNIX 上。)
本地 TCP 连接的好处是它是跨平台的,并且在任何地方都提供可预测的语义。例如,如果您希望能够关闭输出并仍然从输入中读取,那么使用在任何地方都相同的套接字来做这种事情要简单得多。即使没有这个,为了简单起见,使用 TCP 套接字始终是解决 Windows 命名管道的古怪混乱的一种合理方法,尽管 Python 可以很好地保护你。
【讨论】:
以上是关于用于本地客户端-服务器通信的套接字与标准流的主要内容,如果未能解决你的问题,请参考以下文章