如何创建一个监听文件描述符的Python套接字服务器?

7
我正在尝试让一个Javascript(Nodejs)应用程序与一个Python应用程序通信。
我使用绑定到本地主机和特定端口的套接字得到了 一些可行方案
为了使事情更简单(例如,在部署到可能不允许我监听多个端口的环境时),我想改变我的实现方式,使用绑定到文件描述符的套接字。
我搜索了很多,但我找到的所有示例都使用端口。
基本上,我需要Python服务器的 这个来自Nodejs文档的示例 的对应版本(指定路径的版本): var client = net.connect({path: '/tmp/echo.sock'}
请问能否提供一个简单的示例,展示如何创建和绑定文件描述符套接字以及在其上处理数据,或者指导我正确的方向?

1
你应该使用socket.AF_UNIX,而不是socket.AF_INET。 - jordanm
非常感谢,这个简洁的评论足以改进我的谷歌查询,并让我找到了我在更新中添加的示例。 - Thorsten Lorenz
在这种情况下,您可以使用代码示例回答自己的问题并接受它。 - jordanm
1个回答

11

我修改了这个不错的例子(例如,Python服务器必须在TCP而不是UDP套接字上监听以与Node.js客户端兼容)。

我在此发布Python服务器和Node.js客户端代码作为参考:

Python服务器:

import socket
import os, os.path
import time

sockfile = "./communicate.sock"

if os.path.exists( sockfile ):
  os.remove( sockfile )

print "Opening socket..."

server = socket.socket( socket.AF_UNIX, socket.SOCK_STREAM )
server.bind(sockfile)
server.listen(5)

print "Listening..."
while True:
  conn, addr = server.accept()

  print 'accepted connection'

  while True: 

    data = conn.recv( 1024 )
    if not data:
        break
    else:
        print "-" * 20
        print data
        if "DONE" == data:
            break
print "-" * 20
print "Shutting down..."

server.close()
os.remove( sockfile )

print "Done"

Nodejs客户端:

使用npmlog获取彩色日志输出 npm install npmlog

var net = require('net')
  , log = require('npmlog')
  , sockfile = './communicate.sock'
  ;

var client = net.connect( { path: sockfile });

client
  .on('connect', function () {
    log.info('client', 'client connected');
    client.write('hello server');
  })
  .on('data', function (data) {
    log.info('client', 'Data: %s', data.toString());
    client.end(); 
  })
  .on('error', function (err) {
    log.error('client', err);
  })
  .on('end', function () {
    log.info('client', 'client disconnected');
  })
  ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接