FC2ブログ

Python to Lua:PIPE 1本のみでバイナリ・データ通信

2019-05-29 :  PCクリニック
前(2019-05-22)の記事:
Python/Lua:PIPE 1本のみで双方向通信」では、
テキスト・データの送信だった。

今回は、バイナリ・データの送信に挑戦してみた。


バイナリ・データを、numpyarrayとしてみた。

それから、
前回のメインプログラム「NonE_Main_Client.py」の
for i in range(1):
for j in range(1000):
win32file.WriteFile( P1, str(j) )
for j in range(1000):
# ----- 結果受信
_, ss = win32file.ReadFile( P1, 4096 )
print( ss ) # -- 最終結果のみ
win32file.CloseHandle( P1 )
の部分を、
1回往復に限定してみた:
win32file.WriteFile( P1, str(1000) )
# ----- 結果受信
_, ss = win32file.ReadFile( P1, 4096 )
print( ss )
win32file.CloseHandle( P1 )
これを移植することになるのだが、
win32file.WriteFileを使うには、

str(1000)の部分は、
numpy.ndarray.tobytes(・)とすることになる?

つまり、当該部分は;
import ctypes as ct
import numpy as np

x = np.zeros( 1, dtype=np.int ); x[0]=35
win32file.WriteFile( P1, np.ndarray.tobytes(x) ) # リクエスト送信
となる?


全体のコードは、
# coding: utf-8
# ------------------ NonE_Main_Client_B.py
import win32file, subprocess, time

# ----- サーバー立ち上げ
subprocess.Popen( 'cluajit NonE_Sub_Server_B.lua', shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True )

time.sleep( 1 ) # 秒数 --- “サーバー”が完全に立ち上がるのを待つ

#-- PIPE オープン
P1 = win32file.CreateFile( "\\\\.\\pipe\\PIPE1",
win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None,
win32file.OPEN_EXISTING, 0, None );

# ---------------------- 処理:
import ctypes as ct
import numpy as np

x = np.zeros( 1, dtype=np.int ); x[0]=35
win32file.WriteFile( P1, np.ndarray.tobytes(x) ) # リクエスト送信

# ----- 結果受信
_, dataB = win32file.ReadFile( P1, 4096 ) # バイナリデータ
y = ( ct.c_int * 1 )()
_ = ct.cdll.msvcrt.memcpy( y, dataB, 4 )

print( y[0] ) ### x[0] + 100
win32file.CloseHandle( P1 )
でしょうか。

一方のサーバ側は、基本的には変わらない?
--------------- NonE_Sub_Server_B.lua
require'cdef_PIPE_Event_SUBx'

-- パイプを作成
P1=C.CreateNamedPipeA(charA("\\\\.\\pipe\\PIPE1"),3,0,1,0,0,100,0)

-- Client オープン待ち
rtn=C.ConnectNamedPipe( P1, 0 )

------------------------ 処理:
function IntA( s )
return ffi.cast( 'int32_t*', s )
end

Buf = ffi.new('int32_t[4097]')
-- リクエスト受信
rtn=C.ReadFile( P1, charA(Buf), 4097, nIO, 0 )

Buf[0]=Buf[0]+100 -- サーバ側の処理本体!

-- 結果送信
rtn=C.WriteFile( P1, charA(Buf), 4, nIO, 0 )

C.FlushFileBuffers( P1 )
C.DisconnectNamedPipe( P1 )
C.CloseHandle( P1 )
と云うことだが、・・・・・


やはり、
精神衛生上

np.ndarray.tobytes(x)

が気になる。



本日はここまで。


LuaJIT / Anaconda ( Python ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

190407
関連記事
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

人気blog Ranking



最新記事
カレンダー
07 | 2021/08 | 09
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

FC2 / i2i / Google




Google Analytics
ブックマーク