Py学习  »  Python

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

Tal • 6 年前 • 2492 次点击  

我想使用Unix套接字在同一个系统上的两个Python程序之间进行通信。

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

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/51217
文章 [ 3 ]  |  最新文章 6 年前
dotbit
Reply   •   1 楼
dotbit    6 年前
#!/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)
John
Reply   •   2 楼
John    6 年前

正如@greencoptoguy所指出的,您可能希望使用管道,但是如果设置为使用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套接字(如本文所示)可能是您的最佳选择。

Green Cloak Guy
Reply   •   3 楼
Green Cloak Guy    6 年前

同一个系统上的两个Python程序之间的对话

不要使用插座。使用管道。

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

管道更像是专门用于进程间通信的文件描述符。基本上有两种使用管道的方法-命名管道和匿名管道。如果您的“两个python程序”是使用类似于 multiprocessing ,则可以使用匿名管道 os.pipe() 来设置它。否则,您需要为您的管道找出一个两个程序都知道的一致名称和位置,并在一端使用 os.mkfifo() 然后在另一端像普通文件一样打开它。此功能似乎仅在Unix上可用,因此如果您在Windows上,则可能必须 investigate other solutions .