python - 连接客户端套接字和服务器套接字的问题
问题描述
我有一台在 IP 地址为 192.168.1.11 的台式机上运行的服务器,客户端代码正在通过 OpenVPN 连接访问的服务器上运行。当我运行下面的代码客户端发送请求但服务器没有收到它。
服务器.py:
context=zmq.Context()
socket=context.socket(zmq.REP)
socket.bind("tcp://*:8080")
while True:
message=socket.recv_pyobj()
print("%s:%s" %(message.get(1)[0],message.get(1)[1]))
socket.send_pyobj({1:[message.get(1)[0],message.get(1)[1]]})
客户端.py
socket=context.socket(zmq.REQ)
socket.connect("tcp://192.168.1.11:8080")
name="Test"
while True:
message=input("Test Message")
socket.send_pyobj(({1:[name,message]}))
非常感谢您的帮助。
解决方案
问:“连接客户端套接字和服务器套接字的问题”
第 0 步:证明已实现 OSI-ISO-Layer-3 可见性traceroute <targetIP>
第1步:实现了可见路径<targetIP>
,修复代码以满足文档化的REQ/REP
特性。
第2步:在实现了到<targetIP>
and的可见路径REQ/REP
之后,我们应该提高代码的健壮性
context = zmq.Context()
socket = context.socket( zmq.REP )
socket.bind( "tcp://*:8080" )
#---------------------------------------------- # ROBUSTNESS CONFIGs
socket.setsockopt( zmq.LINGER, 0 ) # .set explicitly
socket.setsockopt( zmq.MAXMSGSIZE, ... ) # .set safety ceiling
socket.setsockopt( ..., ... ) # .set ...
#---------------------------------------------- # ROBUSTNESS CONFIGs
while True:
message = socket.recv_pyobj() # .recv() a request from REQ-side
print( "%s:%s" % ( message.get(1)[0], # shall improve robustness
message.get(1)[1] # for cases other than this
)
)
socket.send_pyobj( { 1: [ message.get(1)[0], # REP must "answer" to REQ
message.get(1)[1]
]
}
)
TARGET_IP = "<targetIP>" # <targetIP> from Step 0
PORT_NUMBER = 8080
socket = context.socket( zmq.REQ )
socket.connect( "tcp://{0:}:{1:}".format( TARGET_IP, PORT_NUMBER ) )
#---------------------------------------------- # ROBUSTNESS CONFIGs
socket.setsockopt( zmq.LINGER, 0 ) # .set explicitly
socket.setsockopt( zmq.MAXMSGSIZE, ... ) # .set safety ceiling
socket.setsockopt( ..., ... ) # .set ...
#---------------------------------------------- # ROBUSTNESS CONFIGs
name = "Test"
while True:
message = input( "Test Message" )
socket.send_pyobj( ( { 1: [ name, # REQ-side sends a request
message # here
] # bearing a tuple
} # with a dict
) # having a list
) # for a single key
#------------------------------------------ # REQ-side now MUST also .recv()
_ = socket.recv() # before it can .send() again
推荐阅读
- scala - intelliJ 多个 scala-library*.jar 文件
- shell - 在我的 Jenkins 管道中出现 groovy 语法问题
- c# - 使用端口重定向到 URL - IIS
- ios - 如何在不破坏响应者链的情况下将 UIViewController 的视图嵌入到另一个视图中
- cypress - 调用 Cypress 运行或打开时触发一次的全局事件挂钩
- math - 如果我们重复样本 n 次,其中 n 是正整数,集合的中位数会改变吗?
- scikit-learn - 是否可以在分层KFold 中取回列表?
- kubernetes - Java-client:检查操作删除操作完成的最佳方法?
- ruby-on-rails - ActiveRecord 通过多个表关联
- jhipster - JHipster 与额外字段的多对多关系