mjx-project / mjx_mjai_translater

Translation server between mjx and mjai protocols
MIT License
2 stars 0 forks source link

pythonでかいたサーバーにmjaiをアクセスさせてみて通信がうまくいくかどうか確かめる #2

Closed nissymori closed 3 years ago

nissymori commented 3 years ago
nissymori commented 3 years ago

スクリーンショット 2021-02-26 22 15 24

サーバーからの入力 {"type": "hello", "protocol": "mjsonp", "protocol_version": 3} がclient側に伝わっている。

nissymori commented 3 years ago

clientからのデータを受け取ることができていない。

rubyのクライアント側でデータを送ってから,メッセージを出力するように変更したところメッセージは出力されたので 少なくとも発信はしている スクリーンショット 2021-03-02 15 01 09 ![Uploading スクリーンショット 2021-03-02 15.01.18.png…]()

nissymori commented 3 years ago

スクリーンショット 2021-03-04 18 31 22

socket.each_lineの前に送るとサーバー側にうまく送れた。

each_lineでどういうことが起こっているのか調査

nissymori commented 3 years ago
import socket
import json
import threading

init_message = {
                      "type": "hello",
                      "protocol": "mjsonp",
                      "protocol_version": 5,
                  }

"""
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:  # このサーバーでとりあえずjsonをmjaiのagentに送れている  TODO mjaiのclientからの入力を確認する。
    s.bind(('127.0.0.1', 11600))
    s.listen(1)
    conn, addr = s.accept()
    msg = json.dumps(init_message)
    conn.send(bytes(msg, encoding="utf-8"))
    data = conn.recv(1024).decode(encoding="uft-8")
    if data:
        print(data)
    else:
        print("fail")
    conn.close()
"""

def accept_loop(soc):
    while True:
        try:
            acc, addr = soc.accept()
            hbuf, sbuf = socket.getnameinfo(addr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
            print("accept:{}:{}".format(hbuf, sbuf))
            t = threading.Thread(target=send_recv, args=[acc])
            t.start()
        except RuntimeError as e:
            print("thread:{}".format(e))

def send_recv(acc):
    buf_size = 512
    id = threading.get_ident()
    try:
        msg = json.dumps(init_message)
        print(type(msg))
        acc.send(bytes(msg, encoding="utf-8"))
        print("okureta")
    except:
        print("okuretenai")
    while True:
        try:
            data = acc.recv(1024)
            print(data)
        except InterruptedError as e:
            print("recv:{}".format(e))
            break
    acc.close()

if __name__ == "__main__":
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.bind(('127.0.0.1', 11600))
    soc.listen(1)
    accept_loop(soc)
nissymori commented 3 years ago

サーバーからメッセージを送った時逐次的にクライアントが対応することができていない。

サーバーを落とした時に初めてクライアント側で処理が実行されている。(このことの原因がわかればうまくいきそう)

nissymori commented 3 years ago

clientとserverのアドレスファミリとプロトコルファミリを合わせてみたがどちら側のものに合わせてもうまくいかなかった。

nissymori commented 3 years ago

結果

nissymori commented 3 years ago

書類/mjx-translator_python_preserve に保存している