前提・実現したいこと
zmq
とsocket
の併用はできるかどうかについて
発生している問題・エラーメッセージ
例えば,socket
を使ったプログラム(multicli.py
,multisrv.py
)とzmq
を使ったプログラム(zmqSrv.py
とzmqCli.py
)がそれぞれで実行可能なときにこれらのサーバーを統合できるかどうか.
なお,socket
をzmq
で書き直したり,zmq
をsocket
で書き直すことは不可能でした.
該当のソースコード
このコードは簡略化したものでテキストを送受信するプログラムです.
実際のコードはシミュレータの改造なので,簡略化したもので試してみています.
zmqSrv
1import zmq 2 3def start_svr(): 4 context = zmq.Context() 5 socket = context.socket(zmq.REP) 6 socket.bind("tcp://*:11110") 7 8 print("Server startup.") 9 10 while True: 11 message = socket.recv_string() 12 print("Received: %s" % message) 13 socket.send_string("Reply: %s" % message) 14 15 socket.close() 16 context.destroy() 17 18if __name__ == "__main__": 19 start_srv()
zmqCli
1import sys 2import zmq 3 4def start_cli(): 5 context = zmq.Context() 6 socket = context.socket(zmq.REQ) 7 socket.connect("tcp://localhost:11110") 8 9 while True: 10 print("Enter message:") 11 message = sys.stdin.readline() 12 socket.send_string(message) 13 14 recv_message = socket.recv_string() 15 print("Receive: %s" % recv_message) 16 17 socket.close() 18 context.destroy() 19 20if __name__ == "__main__": 21 start_cli()
multicli
1from __future__ import print_function 2import socket 3import sys 4from contextlib import closing 5import select 6def main(): 7 host = '127.0.0.1' 8 #port = 4000 9 port=11110 10 bufsize = 4096 11 12 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 with closing(sock): 14 sock.connect((host, port)) 15 while True: 16 line = sys.stdin.readline().rstrip() 17 if len(line) == 0: 18 break 19 sock.send(line.encode('utf-8')) 20 print(sock.recv(bufsize)) 21 return 22 23if __name__ == '__main__': 24 main()
自分で調べたことや試したこと
試したこと:
multiCli
のポートを同じにして通信できるかどうか
調べた結果:
そもそもZeroMQは使うときにzmq
のプロトコル(REP
とかREQ
)に従ったソケットを作ってからやり取りしているので不可能なのではとは思ったのですが,どうにか実現できないでしょうか.
構成案としては,zeromq
を基にしたサーバーをマルチサーバーにして,zmq
を使ったClientからの受信はもちろん,socket
を使ったClientからの受信も可能にしたい.
使っているツールのバージョンなど補足情報
zmq,python3,ubuntu18.0.4
あなたの回答
tips
プレビュー