在构造好RPC消息数据后,就可以通过网络在调用双方进行传递了。
传递消息数据常用的有两种方式:TCP 和 HTTP
1. TCP
由于TCP的可靠性,所以TCP是最常用的方式。我们可以直接借助socket工具进行TCP开发。
TCP服务端编写:
sock = socket.socket() # 创建一个套接字
sock.bind() # 绑定端口
sock.listen() # 监听连接
sock.accept() # 接受新连接
sock.close() # 关闭服务器套接字
TCP客户端编写
sock = socket.socket() # 创建一个套接字
sock.connect() # 连接远程服务器
sock.recv() # 读
sock.send() # 尽可能地写
sock.sendall() # 完全写
sock.close() # 关闭
2. HTTP
虽然HTTP属于网络层级中应用层的协议,但是我们仍然可以借助HTTP来帮助我们传递RPC消息。
我们可以将构造好的RPC消息数据嵌入到HTTP报文中的body部分,而对于HTTP的path路径等都无需关心。
HTTP/1.0 POST /
Content-Type: binary
Content-Length: 5096
# 此处放置RPC消息数据
使用HTTP作为传输工具的好处是可以直接利用开发语言中已有的http库来进行通讯,无需自己操作socket的读写。但是通讯效率不如TCP高,所以不常用。
3. RPC传输实现
我们使用TCP来进行实现传输控制
import socket
class Channel(object):
"""
连接通道
"""
def __init__(self, host, port):
self.host = host
self.port = port
def get_connection(self):
"""
获取一个tcp连接
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((self.host, self.port))
return sock
class Server(object):
"""
服务器
"""
def __init__(self, host, port):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.host = host
self.port = port
self.sock.bind((host, port))