3

Matlab をサーバーとして実行し、Android Java アプリをクライアントとして実行したいと考えています。Android は、サイズ 460K のバイト配列を Matlab に転送する必要があります。Matlabで配列全体を正しく取得できません。Matlab で fread を最初に呼び出すと、ランダムなバイト数 (約 320K ~ 290K) が読み取られます。この数値は、t.BytesAvailable によって正しく表示されます。その後、t.BytesAvailable は 0 になり、それ以上読み取ることはできません。これが私が使用したものです:

Java クライアント コード:

Socket socket = new Socket("10.0.0.2", 3000);
OutputStream out = socket.getOutputStream();
out.write(buffer, 0, 460000);
out.flush();
out.close();
socket.close();

Matlab サーバー コード:

t=tcpip('0.0.0.0', 3000, 'NetworkRole', 'server');
set(t, 'InputBufferSize', 500000); 
fopen(t); 
pause(1);
while (get(t, 'BytesAvailable') > 0) 
    display(get(t, 'BytesAvailable'));
    data=fread(t, t.BytesAvailable, 'uint8');
end
fclose(t); 
delete(t); 
clear t 

マトラブのバージョン:

>>版

MATLAB バージョン: 8.1.0.604 (R2013a)

オペレーティング システム: Microsoft Windows 7 バージョン 6.1 (ビルド 7601: Service Pack 1)

Java バージョン: Java 1.6.0_17-b04、Sun Microsystems Inc. Java HotSpot(TM) クライアント VM 混合モード

MATLAB バージョン 8.1 (R2013a) Computer Vision System Toolbox バージョン 5.2 (R2013a) Image Acquisition Toolbox バージョン 4.5 (R2013a) Image Processing Toolbox バージョン 8.2 (R2013a) Instrument Control Toolbox バージョン 3.3 (R2013a) MATLAB Coder バージョン 2.4 (R2013a)

4

1 に答える 1

1

TCP 経由で大量のデータを送信し、直後にソケットを閉じることは、少し「安全ではない」場合があります。この非常に有益なガイド-SO_LINGER-と、可能なクリーンな回避策についてのこの良い答えを確認してください。

余裕がある場合の、より単純で汚れた回避策は、sleep送信後と送信前に(呼び出しで)待機することsocket.close()です。

于 2014-04-13T14:42:45.570 に答える