测试开发

Python_unix domain socket(域套接字)

2018-06-14  本文已影响11人  古佛青灯度流年

业务上需要实现romd与superd通信,采用的通信协议是:unix domain socket

简介

代码:

以下代码主要讲2种域套接字的通信方式

# server端
import socket
import sys 
import os

serverAddr = './uds_socket' # 套接字存放路径及名称

def serverSocket():
        #create sockert
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)# unix套接字,tcp通信方式
        if sock < 0:
                print >> sys.stderr, 'socket error'
        # bind to a file
        if os.path.exists(serverAddr):
                os.unlink(serverAddr)# 如果套接字存在,则删除
        if sock.bind(serverAddr): #绑定套接字文件,绑定成功后,会在指定路径下生成一个域套接字文件。
                print >> sys.stderr, 'socket.bind error'

        #listen
        if sock.listen(5): #最多监听5个客户端
                print >> sys.stderr, 'socket.listen error'

        while True:
                print >> sys.stderr, 'waiting for connecting'
                #waiting for client connecting
                conn, clientAddr = sock.accept() #如果监听到客户端连接,则调用accept接收这个连接并同时新建一个socket来和客户进行通信
                try:
                        # receive data 
                        # send data to client
                        while True:
                                data = conn.recv(100)#接收100个字节长度的数据
                                if data:
                                        print >> sys.stderr, 'received "%s"' %data
                                        conn.sendall(data)#发送数据
                                else:
                                        break
               except Exception as e :
                        print(e)

if __name__ == "__main__":
        serverSocket()
# client端
import socket
import sys 
import os

serverAddr = './uds_socket' #注意想要跟谁通信就绑定谁的套接字文件

def clientSocket():
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        if sock < 0:
                print >> sys.stderr, 'socket error'

        try:
                sock.connect(serverAddr)
        except socket.error, msg:
                print >> sys.stderr, "exception"
                print >> sys.stderr, msg 
                sys.exit(1)

        message = 'this is the message'
        sock.sendall(message)

        amountRecv = 0 
        amountSnd = len(message)

        while amountRecv < amountSnd:
                data = sock.recv(100)
                amountRecv += len(data)
                print >> sys.stderr, 'received "%s"' %data
        sock.close()

if __name__ == "__main__":
        clientSocket()
# coding:utf-8
__author__ = 'xcma'
import socket
import sys
import os

aAddr = './a.sock' # 套接字存放路径及名称
bAddr = './b.sock'
def serverSocket():
        #create sockert
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)# @这里不同   unix套接字,udp通信方式
        if sock < 0:
                print >> sys.stderr, 'socket error'
        # bind to a file
        if os.path.exists(aAddr):
                os.unlink(aAddr)# 如果套接字存在,则删除
        if sock.bind(aAddr): #删除后,绑定套接字文件
                print >> sys.stderr, 'socket.bind error'

        while True:
                print >> sys.stderr, 'waiting for connecting'
                try:
                        # receive data
                        # send data to client
                    while True:
                            data = sock.recv(100)#接收100个字节长度的数据
                            if data:
                                    print >> sys.stderr, 'received "%s"' %data
                                    sock.sendall(data,bAddr)# @ 这里不同 发送数据
                            else:
                                    break
                except Exception as e:
                    print(e)
if __name__ == "__main__":
        serverSocket()

这样如果需要UDP方式,双方通信,各自只需要绑定自己的域套接字文件,然后发送数据的时候指向目标的套接字文件就可以了

总结:

以上只是简单示例,实际应用中保准不能这么用,会显得比较没有层次,而且不容易维护,总的来说用起来还是比较简单的,遇到问题,也比较好查。

上一篇下一篇

猜你喜欢

热点阅读