protobuf 的使用
先看proto
package tutorial;
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
说明下这是protobuf基本数据格式,要注意的是required 表示必须有的,optional表示可能有,可能无的,repeated表示数组[],string 表示char,bytes 表示widechar.
然后运行命令 protobuf
--python_out =./ ./addressbook.proto
来看客户端代码:
#coding:utf8
import time
import addressbook_pb2
from socket import AF_INET,SOCK_STREAM,socket
HOST='127.0.0.1'
PORT=5000
BUFSIZE=1024
ADDR=(HOST , PORT)
client = socket(AF_INET,SOCK_STREAM)
client.connect(ADDR)
person = addressbook_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
phone = person.phone.add()#自定义了一个类
phone.number = "555-4321"
phone.type = addressbook_pb2.Person.HOME
str = person.SerializeToString()
client.send(str)
data = client.recv(BUFSIZE)
print data
服务端
'''
Created on 2015-1-12
@author: Administrator
'''
from gevent.server import StreamServer
from tool import addressbook_pb2
BUFSIZE=1024
def handle(socket,address):
data = socket.recv(BUFSIZE)
print "\n"
person = addressbook_pb2.Person()
person.ParseFromString(data)
print person.id
print person.name
if person.HasField('email'):#optional
print " E-mail address:", person.email
for phone_number in person.phone:
if phone_number.type == addressbook_pb2.Person.MOBILE:
print " Mobile phone #: ",
elif phone_number.type == addressbook_pb2.Person.HOME:
print " Home phone #: ",
elif phone_number.type == addressbook_pb2.Person.WORK:
print " Work phone #: ",
print phone_number.number
socket.send("Hello clinet!\n")
#print data
server = StreamServer(('127.0.0.1',5000),handle)
server.serve_forever()