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()
これでこの部分は完成!
![](https://static.wixstatic.com/media/d6e266_c32374f14ddc45f28eed8033327a406a~mv2.png/v1/fill/w_980,h_551,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/d6e266_c32374f14ddc45f28eed8033327a406a~mv2.png)
右側の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との接続だな
さっきちょっとやってみたが、うまくいかない
歯ごたえありそうだ
Comments