protobuf 的使用

本文介绍了一种高效的数据交换格式——Protocol Buffers(简称 Protobuf),并详细解释了其定义方式和 Python 实现过程。通过一个具体的例子展示了如何定义数据结构、发送及接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值