Unix domain sockets

#server:

SERVER_PATH = "/tmp/python_unix_socket_server"
def run_unix_domain_socket_server():
    if os.path.exists(SERVER_PATH):
        os.remove(SERVER_PATH)
    print('starting unix domain socket server.')
    #
    #UNIX 无连接的socket(类型 SOCK_DGRAM)
    sever=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)
    #在创建套接字描述符之后,bind() 函数获取套接字的唯一名称。
    #UNIX 域套接字的名称空间由路径名组成。
    # 当套接字程序调用 bind() 函数时,会在文件系统目录中创建一项。
    # 如果路径名已存在,则 bind() 失败。因此,UNIX 域套接字程序应总是调用 unlink() 函数以在结束时除去该目录项。
    sever.bind(SERVER_PATH)
    print("监听路径:%s"%SERVER_PATH)
    while True:
        #从客户机应用程序接收数据。
        datagram=sever.recv(1024)
        #如果没有数据
        if not datagram:
            break
        else:
            print('-'*20)
            print(datagram)

        if "DONE"==datagram:
            break
    print('*'*20)
    #关闭socket
    print('关闭服务器')
    sever.close()
    #从文件系统除去 UNIX 路径名。
    os.remove(SERVER_PATH)

  client:

#coding:utf-8
__author__ = 'similarface'

import socket
import sys
SERVER_PATH = "/tmp/python_unix_socket_server"
def run_unix_domain_socket_client():
    #端点的套接字描述符。该语句还标识将对此套接字使用带有流传输(SOCK_STREAM)的 UNIX 地址系列。该函数返回表示端点的套接字描述符。还可使用 socketpair() 函数初始化 UNIX 套接字
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    #使用 connect() 函数来建立与服务器的连接。
    try:
        sock.connect(SERVER_PATH)
    except socket.error, msg:
           print >>sys.stderr, msg
           sys.exit(1)

    try:
        message="Good Info"
        print("Sending[%s]"%message)
        sock.sendall(message)
        amount_received=0
        amount_expected=len(message)
        while amount_received < amount_expected:
            #函数一直循环,直到所有 16 字节数据都到达为止。
            data=sock.recv(16)
            amount_received+=len(data)
            print >>sys.stderr, "Received [%s]" % data
    finally:
        #关闭客户端
        sock.close()

if __name__ == '__main__':
    run_unix_domain_socket_client()

  

AF_UNIX

 

posted @ 2016-05-30 11:44  similarface  阅读(296)  评论(0编辑  收藏  举报