0

telnetを使用してコマンドをシリアルポートに送信するコンピューターにtelnet経由でコマンドを送信しようとしています。

adb shell
$telnet 172.20.104.203 5334
$h

コマンドhからデータを返しますが、アンドロイドを使用してこれを実行しようとするとソケットに接続され、コンピューターでこれを確認できます。コマンドを送信しますが、送信したことをログに記録するとすぐにハングします「アプリケーションが応答していません」というメッセージが表示され、待機または強制終了があり、待機しても同じままです。

これはtelnet部分の私のコードです

    private static final int TCP_SERVER_PORT = 5334;

    private void runTcpClient() {
        try {
            Socket s = new Socket("172.20.104.203", TCP_SERVER_PORT);
            BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            //send output msg
            String outMsg = "$getPos"; 
            out.write(outMsg);
            out.flush();
            Log.i("TcpClient", "sent: " + outMsg);
            //accept server response
            String inMsg = in.readLine() + System.getProperty("line.separator");
            Log.i("TcpClient", "received: " + inMsg);
            //close connection
            s.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }

送信はログに記録されますが、受信はログに記録されません。受信されるデータの量と関係があるのではないかと思ったので、送信しました

$getPos 

代わりに、それでもハングします。

何が起こっているのか知っている人はいますか?

4

1 に答える 1

0

私はプラットフォームの詳細に精通していませんが、readline がソケット/tcp ストリームで機能する可能性は低いです。ソケットから入ってくるデータは、必ずしも「行」に編成されるわけではなく、特定のサイズのパケットに編成されます。ソケットで実行される「読み取り」は、いくつかのバイト数を返します。

このような読み取りを行うクライアントは、各パケットを読み取り、合意された「データの終わり」マーカーを受信するまでそれらをバッファリングする必要があります。合意されたマーカーは、プロトコルによって決定されます。

コードのクライアント側を見せていただきました。対応するサーバー側はありますか?

あなたがここに持っていることから、あなたのクライアントコードは、何らかの理由で決して来ない「行末」を辛抱強く待っていると思います。または、サーバー側に問題があり、サーバーがクライアントにデータを送信していません。

于 2012-05-04T02:33:10.567 に答える