如何在Python中使用套接字创建通道

用户名

我已经数次启动了Python,现在,我正在创建一个套接字服务器。我已经使服务器与具有多个客户端的多个线程一起工作(万岁!),但是我正在寻找无法调用的功能(我什至不知道它是否存在)我想在客户端创建一种渠道可以发送不同类型的消息。

我创建一个通道INFO的示例,如果服务器接收到这种类型的套接字,它只会执行打印

我创建了另一个通道DEBUG,可以在其中发送服务器将执行的自定义命令

等等

使用非编程语言,它将执行以下操作:

def socketDebug(command):
     run command

def socketInfo(input):
     print input

if socket == socketDebug:
     socketDebug(socket.rcv)
else:
   if socket == socketInfo:
     socketInfo(socket.rcv)

我希望我很清楚。

姆吉耶尔

这是Channel类的一个非常简单的实现。它创建一个套接字,以接受来自客户端的连接并发送消息。它本身也是一个客户端,从其他Channel实例接收消息(例如,在单独的进程中)。

通信是在两个线程中完成的,这非常糟糕(我将使用async io)。收到消息后,它将在接收线程中调用已注册的函数这可能会导致某些线程问题。

每个Channel实例都创建自己的套接字,但是通过单个实例多路复用通道“主题”将具有更大的可伸缩性。

一些现有的库提供了“通道”功能,例如nanomsg

如果可以的话,此处的代码用于教育目的...

import socket
import threading

class ChannelThread(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)

    self.clients = []
    self.chan_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    self.chan_sock.bind(('',0))  
    _, self.port = self.chan_sock.getsockname()
    self.chan_sock.listen(5)
    self.daemon=True
    self.start()

  def run(self):
    while True:
      new_client = self.chan_sock.accept()
      if not new_client:
        break
      self.clients.append(new_client)

  def sendall(self, msg):
    for client in self.clients:
      client[0].sendall(msg)

class Channel(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)

    self.daemon = True
    self.channel_thread = ChannelThread()

  def public_address(self):
    return "tcp://%s:%d" % (socket.gethostname(), self.channel_thread.port)

  def register(self, channel_address, update_callback):
    host, s_port = channel_address.split("//")[-1].split(":")
    port = int(s_port)
    self.peer_chan_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   
    self.peer_chan_sock.connect((host, port))
    self._callback = update_callback
    self.start()

  def deal_with_message(self, msg):
    self._callback(msg)

  def run(self):
    data = ""
    while True:
      new_data = self.peer_chan_sock.recv(1024)
      if not new_data:
        # connection reset by peer
        break
      data += new_data
      msgs = data.split("\n\n")
      if msgs[-1]:
        data = msgs.pop()
      for msg in msgs:
        self.deal_with_message(msg)

  def send_value(self, channel_value):
    self.channel_thread.sendall("%s\n\n" % channel_value)

用法:

在过程A中:

c = Channel()
c.public_address()

在过程B中:

def msg_received(msg):
  print "received:", msg

c = Channel()
c.register("public_address_string_returned_in_process_A", msg_received)

在过程A中:

c.send_value("HELLO")

在过程B中:

received: HELLO

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Python中使用套接字创建通道

来自分类Dev

如何在Angular 2应用程序中使用Phoenix通道/套接字?

来自分类Dev

如何在Python ssl套接字缓冲中使用select?

来自分类Dev

如何在Python和子进程中使用套接字?

来自分类Dev

如何使用SocketIO订阅套接字通道?

来自分类Dev

如何在套接字中使用raw_input

来自分类Dev

如何在Python中使用管道时关闭套接字连接

来自分类Dev

如何在不创建套接字文件的情况下使用Unix域套接字

来自分类Dev

Python:在OSX中使用原始套接字

来自分类Dev

如何在Objective-C中使用本地域套接字

来自分类Dev

零停机时间的目标,如何在套接字和(g)unicorn中使用新贵:

来自分类Dev

如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

来自分类Dev

如何在C ++中使用套接字(UDP)在LAN上查找服务器

来自分类Dev

如何在实时多人游戏中使用网络套接字?

来自分类Dev

如何在Java中使用相同的套接字连接执行多个HTTP请求?

来自分类Dev

如何在没有套接字的Android中使用TCP客户端?

来自分类Dev

如何在 C 中使用 TCP 套接字发送 size_t 变量?

来自分类Dev

如何在python中创建一个持续运行的套接字客户端

来自分类Dev

如何在 asyncio 和 transport_base 类中创建 python 并行套接字?

来自分类Dev

如何在Swift中使用AgoraRtcEngineKit创建通道和服务器令牌?

来自分类Dev

如何在android中的Socket.IO-client中加入套接字空间或通道

来自分类Dev

如何在android中的Socket.IO-client中加入套接字空间或通道

来自分类Dev

如何在D中创建SSL套接字?

来自分类Dev

如何在Sails 0.10.5中创建套接字连接

来自分类Dev

如何在Ruby中创建双向SSL套接字

来自分类Dev

如何在Sails 0.10.5中创建套接字连接

来自分类Dev

如何重置python中使用的套接字地址?(解决WinError 10048)

来自分类Dev

在Android中使用套接字?

来自分类Dev

如何使用 Java 客户端和 Python 服务器通过套接字创建 IPC?

Related 相关文章

  1. 1

    如何在Python中使用套接字创建通道

  2. 2

    如何在Angular 2应用程序中使用Phoenix通道/套接字?

  3. 3

    如何在Python ssl套接字缓冲中使用select?

  4. 4

    如何在Python和子进程中使用套接字?

  5. 5

    如何使用SocketIO订阅套接字通道?

  6. 6

    如何在套接字中使用raw_input

  7. 7

    如何在Python中使用管道时关闭套接字连接

  8. 8

    如何在不创建套接字文件的情况下使用Unix域套接字

  9. 9

    Python:在OSX中使用原始套接字

  10. 10

    如何在Objective-C中使用本地域套接字

  11. 11

    零停机时间的目标,如何在套接字和(g)unicorn中使用新贵:

  12. 12

    如何在UWP中使用StreamSocket时知道套接字连接是否仍然有效?

  13. 13

    如何在C ++中使用套接字(UDP)在LAN上查找服务器

  14. 14

    如何在实时多人游戏中使用网络套接字?

  15. 15

    如何在Java中使用相同的套接字连接执行多个HTTP请求?

  16. 16

    如何在没有套接字的Android中使用TCP客户端?

  17. 17

    如何在 C 中使用 TCP 套接字发送 size_t 变量?

  18. 18

    如何在python中创建一个持续运行的套接字客户端

  19. 19

    如何在 asyncio 和 transport_base 类中创建 python 并行套接字?

  20. 20

    如何在Swift中使用AgoraRtcEngineKit创建通道和服务器令牌?

  21. 21

    如何在android中的Socket.IO-client中加入套接字空间或通道

  22. 22

    如何在android中的Socket.IO-client中加入套接字空间或通道

  23. 23

    如何在D中创建SSL套接字?

  24. 24

    如何在Sails 0.10.5中创建套接字连接

  25. 25

    如何在Ruby中创建双向SSL套接字

  26. 26

    如何在Sails 0.10.5中创建套接字连接

  27. 27

    如何重置python中使用的套接字地址?(解决WinError 10048)

  28. 28

    在Android中使用套接字?

  29. 29

    如何使用 Java 客户端和 Python 服务器通过套接字创建 IPC?

热门标签

归档