如何在Python中使用Unix套接字?

2024-10-16 17:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为同一系统上的两个Python程序使用Unix套接字来相互通信。你知道吗

这里有绑定到套接字文件的示例:https://gist.github.com/jmhobbs/11276249

常用的socketserver库还有一个UnixStreamServer和一个UnixDatagramServer,听起来它也处理unix套接字,但是没有任何一个示例,据我所知,在初始化UnixStreamServer或UnixDatagramServer时,它需要一个IP和端口,而不是一个文件。你知道吗

UnixDatagramServer和UnixStreamServer是演示here的不同类型的unix套接字吗?或者我只是没有看到如何使用它们来正确地连接到套接字文件?有例子吗?为什么有人会像在我的链接中那样直接使用UnixDatagramServer/UnixStreamServer绑定到socket文件?你知道吗

当谈到IP套接字时,TCP/UDP之间的区别是有意义的——一个是可靠的,而另一个不是,没有开销。在一个套接字的世界里,我假设没有不可靠的通信,为什么还有两种不同的类型(数据报和流)?你知道吗


Tags: 文件https程序ipgithubcom示例类型
3条回答

for 2 Python programs on the same system to talk to each other

不要使用插座。使用管道。你知道吗

在网络中,套接字本质上是应用层和传输层之间的链接。这就是为什么你需要提供一个IP和端口号-这些是重要的地址信息,任何人看你的电脑外部。这也是为什么你有数据报和流-TCP和UDP是两个主要的传输层协议,当你建立到传输层的链接时,你需要指定你想要使用的协议。套接字用于使用网络进行通信—在同一系统上的两个进程之间有替代的、更有效和更简单的通信方式。你知道吗

管道更像是专门用于进程间通信的文件描述符。基本上有两种使用管道的方法-命名管道和匿名管道。如果您的“两个python程序”是使用multiprocessing之类的东西从一个原始程序中分离出来的,那么您可能需要使用匿名管道,您可以使用^{}来设置它。否则,您需要为您的管道找出一个两个程序都知道的一致的名称和位置,并在一端用^{}初始化它,然后像在另一端打开一个常规文件一样打开它。这个功能似乎只在Unix上可用,因此如果您在Windows上,您可能需要investigate other solutions。你知道吗

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#kate: syntax Python ;

# use them like so:

import          socket,               os , time
parent, child = socket.socketpair()

#child.close() # bad fdesc

pid           =                       os.fork()
if pid:
    #time.sleep(0.3)
    #child.close()
    print 'in   parent, sending    message'
    p =         parent.sendall('ping p')
    response1 = parent.recv(444)
    print      'response from child         :', response1
    p =         parent.close()

else:
    #time.sleep(0.7)
    #parent.close()

    print  'in child, waiting for message'
    message1 = child.recv(333)
    print  'message from parent         :', message1

    child.sendall('päng c')
    child.close()

#print "Ende" , pid
#print parent # , child
#print type(pid) , "   " , type(child)

正如@green斗篷guy指出的,您可能希望使用管道,但是如果您打算使用Unix套接字,下面是一个使用StreamRequestHandler的粗略示例:

服务器:

#!/usr/bin/env python3

from socketserver import UnixStreamServer, StreamRequestHandler, ThreadingMixIn
import os

os.unlink("/tmp/test")

class Handler(StreamRequestHandler):
    def handle(self):
        while True:
            msg = self.rfile.readline().strip()
            if msg:
                print("Data Recieved from client is: {}".format(msg))
            else:
                return

class ThreadedUnixStreamServer(ThreadingMixIn, UnixStreamServer):
    pass

with ThreadedUnixStreamServer('/tmp/test', Handler) as server:
    server.serve_forever()

客户:

#!/usr/bin/env python3

import socket
import sys 
import time

with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
    client.connect("/tmp/test")

    while True:
        client.send(b"Client 1: hi\n")
        time.sleep(1)

    client.close()

ThreadingMixIn不是必需的,但它允许您运行两个客户端,并同时从这两个客户端接收消息。将客户机代码复制到“client1.py”和“client2.py”中,并将client2.py中的“client1”更改为“client2”,同时运行这两个命令,以在实践中看到这一点。你知道吗

我不是专家,但听起来虽然管道效率更高,但它们的缺点是只有一个程序链接到另一个程序。如果您有多个客户机和一台服务器,那么Unix套接字(如本文所示)可能是您的最佳选择。你知道吗

相关问题 更多 >