2

データのパケットを組み込みデバイスに送信する Android アプリを作成しようとしています。私の組み込みデバイスは UDP データグラム プロトコルをサポートしていないため、同期 TCP を使用してシミュレートしたいと考えています。

そうは言っても、デバイスからの応答文字列は必要ないので、アプリからデータが送信されたらすぐに TCP ソケットを切断したいと考えています。

ある時間枠内にデータが受信されない場合に接続を実行し、ソケットを閉じるスレッドを作成する方法を誰かが概説してくれれば幸いです。

私の現在のコードは簡単です:

    try {
        Socket s = new Socket("localhost",12345);

        //outgoing stream redirect to socket
        OutputStream out = s.getOutputStream();

        PrintWriter output = new PrintWriter(out);
        output.println("Hello Android!");
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));

        //read line(s)
        String st = input.readLine();
        . . .
        //Close connection
        s.close();


} catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

前もって感謝します!!!

4

1 に答える 1

3

最初にプロトコルに注意してください。アプリケーションが動かString st = input.readLine();なくなった場合、サーバーがデータを送信しないという意味ではありません。readLine()メソッドは行 (CRLF で終了) を想定しているためです。これは、サーバーが改行なしで文字列を送信する可能性があるためです。 、その後、バッファリングされたリーダーは、CRLF を予期しているため、スレッド (現在のスレッド) をスタックします。次に、ソケットをパラメーターとして受け入れ、しばらく待ってから、サーバーからの応答がないためソケットを閉じる別のクラスがあります。このようなものです。

class SocketMgr implements Runnable{
final private int timeout=5000;
private Socket s;
public SocketMgr(Socket s){this.s=s;new Thread(this).start();}
public void run(){
try{Thread.sleep(timeout);s.close();}catch(Exception ex){}
}
}

そしてあなたのコードで

 try {
        Socket s = new Socket("localhost",12345);

        //outgoing stream redirect to socket
        OutputStream out = s.getOutputStream();

        PrintWriter output = new PrintWriter(out);
        output.println("Hello Android!");
        output.flush();
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //////////////////////////////////
        new SocketMgr(s);
        //////////////////////////////////
        //read line(s)
        String st = input.readLine();
        . . .
        //Close connection
        s.close();


} catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

また、簡単な[Java スレッド化チュートリアル] をもう一度確認してください。これは、サーバーに属するプロトコルについて知っておくことが重要です。頑張ってください、素敵なソケットプログラムを持ってください:)。

于 2013-10-01T18:39:30.670 に答える