0

私は現在、端末で実行される単純な Java プログラムである、Android とサーバー間のソケット通信を開発しています。アプリケーションを閉じたときに常にlogCatに警告が表示されることを除いて、物事は順調に進んでいます:

IInputConnectionWrapper    showStatusIcon on inactive InputConnection

StackOverflow Similar Problemで投稿を見つけた問題を見つけるためにインターネットで検索しています。違いは、自分のプログラムで情報をうまく送受信できることです。この同様の問題に対する答えは、接続が閉じられていないことです。手術後に電話しなかったということsocket.close();ですか?これは、実装のより複雑な問題につながります。

まず第一に、サーバーをリッスンして送信する単一の静的ソケットが必要です。何かを送信するたびにソケットを閉じるとは限らないため、リスナーが作業を終了した後にソケットを閉じます。

詳細コードは以下に掲載されています

コンストラクターで接続を次のように初期化します。

client = new Socket(mServerName, mport);
out = new DataOutputStream(client.getOutputStream()); 
inFromServer = new InputStreamReader(client.getInputStream());
reader = new BufferedReader(inFromServer);

そして、プロセス全体を通してそれらをそこに置いておきます。

Androidからサーバーへの送信を次のように関数に書きました:

public void sendRequest(int type, int what1, int what2, Object data)
{
    try{
        if(client.isConnected())
        {
            out.writeUTF(encoded(type,what1,what2,data) + "\n");            
        }
    }catch(IOException e){
        Log.e(TAG, "IOException at SendRequest");
        e.printStackTrace();
    }
}

新しいスレッドのリスナー:

try {       
        String line = null;
        while ((line = reader.readLine()) != null)
        {
            ReceiveHandler(line);
        }
    } catch (IOException e) {
        Log.e(TAG, "IOException at StartListen");
        e.printStackTrace();
    }finally{
        try { 
         // The Only Place that I close the Socket
            inFromServer.close();
            out.close();
            reader.close();
            client.close();
        } catch (IOException e) {
            Log.e(TAG, "Close Socket with IOException " + e.toString());
            e.printStackTrace();
        } 
    }

私の質問は:

私の実装に何か問題がありますか、それともこれを行うためのより良い方法はありますか?

助けてくれてどうもありがとう!

4

2 に答える 2

1

Android デバイスとエミュレーターの両方で、ネットワーク関連の問題を診断するのに役立つツールがあります。問題をもう少し追跡するのに役立つ場合があります。ARO ツールはオープン ソースで、http://developer.att.com/developer/forward.jsp?passedItemId=9700312 から入手できます

于 2012-06-25T10:24:37.507 に答える
0

これがあなたに役立つかどうかはわかりません..しかし、クライアントサーバー通信に使用したコードを提供します..

クライアント側のコード:

public class ClientWala {

    public static void main(String[] args) throws Exception{

        Boolean b = true;
    Socket s = new Socket("127.0.0.1", 4444);

    System.out.println("connected: "+s.isConnected());


    OutputStream output = s.getOutputStream();
    PrintWriter pw = new PrintWriter(output,true);

    // to write data to server
    while(b){

        if (!b){

             System.exit(0);
        }

        else {
            pw.write(new Scanner(System.in).nextLine());
        }
    }


    // to read data from server
    InputStream input   = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(input);
    BufferedReader br = new BufferedReader(isr);
    String data = null;

    while ((data = br.readLine())!=null){

        // Print it using sysout, or do whatever you want with the incoming data from server

    }




    }
}

サーバー側のコード:

import java.io.*
import java.net.*;


public class ServerTest {

    ServerSocket s;

    public void go() {

        try {
            s = new ServerSocket(44457);

            while (true) {

                Socket incoming = s.accept();
                Thread t = new Thread(new MyCon(incoming));
                t.start();
            }
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    class MyCon implements Runnable {

        Socket incoming;

        public MyCon(Socket incoming) {

            this.incoming = incoming;
        }

        @Override
        public void run() {

            try {
                PrintWriter pw = new PrintWriter(incoming.getOutputStream(),
                        true);
                InputStreamReader isr = new InputStreamReader(
                        incoming.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String inp = null;

                boolean isDone = true;

                System.out.println("TYPE : BYE");
                System.out.println();
                while (isDone && ((inp = br.readLine()) != null)) {

                    System.out.println(inp);
                    if (inp.trim().equals("BYE")) {
                        System.out
                                .println("THANKS FOR CONNECTING...Bye for now");
                        isDone = false;
                        s.close();
                    }

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                try {
                    s.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

        }

    }

    public static void main(String[] args) {

        new ServerTest().go();

    }

}
于 2012-06-25T04:37:59.857 に答える