top of page

テキストボックスの内容をPythonに送る その2

執筆者の写真: snackvirtualsnackvirtual

ajax通信エラーが多発

recieve = sys.stdin.readline()  
 ......
print(recieve)

この間でエラーが発生すると、例え文字エンコードのエラーであっても通信がfailとなるので、ここは最小限の内容にして、その後ろ(つまり返信後)に処理を書く


昨日は文字コードがShift-Jisになっているらしいと書いたが、これを試してみると、文字によってはエンコードエラーとなる

recieve = sys.stdin.readline()  
recieve_encode = recieve.encode('shift-jis')
print('Content-type: text/html\n')
print(recieve)

「かながわ」はOKだが、「神奈川」はfail(ひらがなならOKということではない)

つまり上記のrecieveデータは単純な文字列ではない可能性があるということだ


例えば「全部最後の一文字」を送信してみると、

正:e5 85 a8 e9 83 a8 e6 9c 80 e5 be 8c e3 81 ae e4 b8 80 e6 96 87 e5 ad 97 
誤:e5 85 a8 e9 83 a8 e6 9c    e5 be 8c e3    ae e4 b8    e6 96    e5 ad

となり、途中が欠けているのがわかる

またかけ方は毎回同じなので、通信問題ではなさそう


これを調査するのはちょっとしんどいので、ACIIコードならちゃんと送れそうなので、

すべて16進に変換して、これを文字列として伝送することにした

これは助かった

何も考えずにコピペして流用

ばっちり!

=== talk client joined ===
FEE: テストです
ajax doneだよ
Return data : e38386e382b9e38388e381a7e38199
Decode data from Hex : テストです 

Javascript:

  • チャットデータ送信ルーチンの中にajax通信ルーチンを埋め込む

  • 通信は上述のとおり、文字列を16進に変換して送信

  • Python側では”フィー:”という文字を文頭に追加してループバックさせている

  • 16進文字列のレスポンスデータを文字列に変換

  • チャット送信

    room.on('data', ({ data, src }) => {
      // Show a message sent to the room and who sent
      messages.textContent += `${src}: ${data}\n`;

      // ajax 通信 to Python Hideo
      data_buffer = data;
      send_data = string_to_utf8_hex_string (data_buffer);
      
      $(function(){
        $.ajax({
          url: "test.py",
          type: 'POST',
          data: send_data,
        }).done(function(data){
          messages.textContent += 'ajax done\n';
          messages.textContent += `Return data : ${data}`;
          decode_str = utf8_hex_string_to_string  (data);
          messages.textContent += `Decode data from Hex : ${decode_str} \n`;
          response_fee = decode_str;
          onClickSend();
        }).fail(function(){
          messages.textContent += 'ajax failed\n';
        });   
      });
    });

Python:

  • 16進文字列の受信データに”フィー:”という文字の16進文字列を文頭に追加してループバック

  • 受信文字列は別途文字列に変換してファイルに上書き(デバッグ用)

recieve = sys.stdin.readline()  
recieve_data = recieve
recieve_relpy = "e38395e382a3e383bcefbc9a" + recieve
print('Content-type: text/html\n')
print(recieve_relpy)

recieve_decode_data = (bytes.fromhex(recieve_data)).decode('utf-8')

fileobj = open("sample.txt", "w", encoding="utf-8") 
fileobj.write(recieve_data) 
fileobj.write("\n") 
fileobj.write(recieve_decode_data) 
fileobj.close()  

これでこの部分は完成!

右側のChrome(Client)からの”チャットテスト”という入力に対して

中央のChrome(Talk)が受信し、これをPythonに送り、ループバックして、Clientのチャットまで到達しているのがわかる


これは大きな一歩だ


次はEnterキーで入力できるようにしよう

// Enterキーをボタンを押す代わりに
    document.addEventListener('keypress', keypress_ivent);
    function keypress_ivent(e) {
      if(e.code === 'Enter'){
        //Enterキーが押された時の処理
        //messages.textContent += `Enterキーが押されたよ\n`;
        onClickSend();
      }
      return false; 
    }

簡単簡単!

次回はいよいよCeVIO AIとの接続だな

さっきちょっとやってみたが、うまくいかない

歯ごたえありそうだ

閲覧数:0回0件のコメント

最新記事

すべて表示

Comments


bottom of page