0

私はAndroidでのプログラミングに不慣れであり、アプリケーションを構築するための支援が必要です。2台の電話を相互に接続します。1つはクライアントで、もう1つはサーバーです。クライアントに2つのステージを持たせたいです。最初に、ユーザーはサーバーのIPを入力し、ボタンをクリックして接続を確立します。2つ目では、ユーザーはメッセージを入力し、ボタンをクリックしてサーバーに送信します。

以下に示すコードは、文字列「メッセージ」をサーバーに送信することですが、私が言ったように、ユーザーが文字列を入力できるようにしたいのです。彼の問題に取り組む方法がわかりません。以下に示すアクティビティで接続が確立されたら、2番目のアクティビティを呼び出す必要がありますか?その場合、ソケットを別のアクティビティに渡す方法がわからず、文字列を渡す方法しかわかりません。さらに、別のボタンが必要になるため、新しいOnClickListenerが必要になりますが、それでもその関数にソケットを渡す必要があります。

2番目のアクティビティを使用しないと、接続が確立されたときに2番目の入力フィールド(ユーザーがサーバーに送信するメッセージを入力するフィールド)を表示する方法がわかりません。このアクティビティのビュー(layout.xml)はすでに同じものに関連付けられているため、画面をクリアして新しいEditTextフィールドをその場で作成することはできません。

私は自分自身を明確にしたいと思います。

前もって感謝します

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_client);

    serverIp = (EditText) findViewById(R.id.server_ip);
    connectPhones = (Button) findViewById(R.id.connect_phones);
    connectPhones.setOnClickListener(connectListener);       

}

private OnClickListener connectListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }
};

public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
            connected = true;
            while (connected) {
                try {
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);
                    **out.println("messageToSend");**
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}
}
4

3 に答える 3

1

あなたがここで何を探しているのか完全にはわかりませんが、私の理解が正しければ、あなたはメッセージの送信方法に悩まされています。追加するだけ

     message2send= (EditText) findViewById(R.id.user_message); 

そして、あなたが持っている場所

         **out.println("messageToSend");**

と置換する

         **out.println(message2send);** 

レイアウトに追加の編集テキスト フィールドを追加します。

これについて行った方法は理想的ではないことに注意してください。メッセージを受信するには、他の電話(サーバー)がソケットをリッスンする必要があり、追加のデータ料金が発生し、バッテリー電力が浪費されます(モバイルの伝統的なサーバーは、ユーザーがオフラインまたは電話が切れた場合に備えてメッセージを保存するために2台の電話の間にあります)

これが少なからず役立つことを願っています!

于 2013-01-31T14:09:01.547 に答える
1

ソケット経由でメッセージを送信するには、2 番目のアクティビティが必要だとは思いません。

とにかく、それはあなたのデザインに依存します -

同時に 2 つの editText を持つことができますが、それらの可視性は異なります。

 EditText serverIpAddressET;  
 EditText messageET ;  // Deafult visibility Gone

serverIpAddressET は、ユーザーがソケット IP を提供していない場合に表示されます。接続が確立されたら、serverIpAddressET の可視性を Gone に変更し、messageET を可視にすることができます。

于 2013-01-31T14:11:57.030 に答える
1

簡単な修正は、現在表示されている EditText と Button を非表示にすることです。

 view.setVisiblility(View.GONE)

他のeditTextとボタンを表示します

 view.setVisibility(View.Visible)

同じアクティビティを使用します...

しかし、より良い解決策は、サービスでの通信用にソケットを開くことです。ソケットを使用してアンドロイドサービスを調べます...最初のアクティビティでサービスを開始し、接続が確立されたら2番目のアクティビティをシフトし、アクティビティをサービスにバインドして、存在できるようにします活動とサービスでのコミュニケーション...

于 2013-01-31T14:06:56.390 に答える