结合服务器和客户端 python 套接字

Ben*_*Ben 2 python sockets

我正在尝试使用 python (稍后可能会在 c 中)和 TCP 套接字制作本地网络聊天程序。

我的目的是让服务器监听当前计算机的地址以获取传入消息,并将这些消息转发给客户端(我还不确定)。客户端将是一个简单的 GUI,它可以将消息发送到本地连接上的活动服务器。实际上,此设置将形成某种节点网络。

是否可以在同一个应用程序中同时拥有服务器和客户端,最好不使用线程?我知道服务器在侦听连接时会暂停,因此 GUI 无法响应。

如果我不能在同一个应用程序中同时拥有这两个应用程序,我会考虑拥有两个相互通信的应用程序,但是线程似乎是一个更好的选择,因为无论哪种方式我都会使用两个进程。如果我有单独的应用程序,我如何从服务器发送字符串到客户端,以更新 GUI?

我可以在希望服务器向客户端发送消息时发生某种事件(在客户端)吗?

此外,我如何检查服务器是否处于活动状态(可用并绑定到其计算机地址,等待消息)?

我的服务器/客户端关系模型合理吗?有什么建议么?

我已经检查了有关堆栈溢出的类似套接字问题,但没有找到任何专门解决我的问题的问题。我可能错过了一些,所以如果发现相关,请将我的注意力转移到它们上。

这个问题看起来非常相似:Python套接字服务器:监听多个客户端,但是他们似乎没有为每个客户端提供“服务器”和客户端。

注意:我是套接字和网络的新手。

Kro*_*ack 6

  1. 首先,您需要阅读一些关于套接字编程的好书或一些文章(谷歌搜索 - 有很多)。Stackoverflow 还不够。你只会浪费时间试图从随机的问题答案中学习一些东西。
  2. “服务器”并不意味着“仅接收模式”,“客户端”并不意味着“仅发送模式”。客户端和服务器之间存在全双工连接。不同之处在于“服务器”将打开一个端口并等待传入​​的消息连接。并且“客户端”知道服务器地址将启动此连接。一旦建立连接 - “客户端”和“服务器”将能够进行全双工通信。
  3. 是的,“在同一个应用程序中同时拥有服务器和客户端”是可能的。但这是罕见的行为。如果您的服务器需要向某些其他服务器(例如 google.com)发出请求,您将在服务器端需要它。为此,您只需要处理两种类型的套接字:主动和被动。
  4. “我如何检查服务器是否处于活动状态?”。如果服务器处于“ON”状态,您将能够连接到它。如果不是 - 您的尝试将返回错误(Python 中的异常)。就是这样。
  5. 使用套接字有两种方法:阻塞模式和非阻塞模式。在后一种情况下,您的程序不需要等待操作结束。它可以在通过套接字接收或发送数据的同时完成自己的业务。
  6. 我不建议您使用原始套接字。这不合理。仅当您尝试创建一些具有某些独特功能的全新套接字框架时才需要原始套接字(但为了做到这一点,您应该是套接字开发方面的专家)。只是因为 Python 中已有数十个现有框架(其中一些用于 C/C++,libevent是其中最好的框架之一)。Python 异步套接字库之一是asyncio- Python 标准库的一部分(适用于现代 Python 版本)。

祝你好运!