社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Tal • 5 年前 • 1957 次点击  

我想使用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
 
1957 次点击  
文章 [ 3 ]  |  最新文章 5 年前
dotbit
Reply   •   1 楼
dotbit    5 年前
#!/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    5 年前

正如@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    5 年前

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

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

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

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