0

TCPソケットを使用してAndroid用のクライアントを作成しました。ただし、私が持っているプログラムでは、サーバー アドレスを動的に入力することはできません。また、 myは に拡張されていないMainActivityため、String を転送する意図を使用できません。サーバーアドレスを動的に設定し、希望する任意のサーバーに接続できるようにするには、どのロジックを実装する必要がありますか..TcpClient.javaActivity

MainActivity.java

@Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {

            case R.id.menu_settings:
                Intent i = new Intent(this, Preferences.class);
                startActivityForResult(i, RESULT_SETTINGS);
                break;

            }

            return true;
        }



        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            switch (requestCode) {
            case RESULT_SETTINGS:
               saveData();
                break;

            }

        }

        public class connectTask extends AsyncTask<String,String,TcpClient> {

            @Override
            protected TcpClient doInBackground(String... message) {

                //we create a TCPClient object and
                mTcpClient = new TcpClient(new TcpClient.OnMessageReceived() {
                    @Override
                    //here the messageReceived method is implemented
                    public void messageReceived(String message) {
                        //this method calls the onProgressUpdate
                        publishProgress(message);
                    }
                });
                mTcpClient.run(serverip, serverport);

               return null;
            }

        }


        //call it at Activity startup onStart() for example
        public void loadData(){

               int mode = Activity.MODE_PRIVATE;
               SharedPreferences mySharedPreferences;
               mySharedPreferences = getSharedPreferences(MYPREFS, mode);
               serverip = mySharedPreferences.getString("IP", serverip);
               serverport = mySharedPreferences.getInt("Port", serverport);
           }

           // Call it whenever you modify the values
           public void saveData()
           {
               int mode = Activity.MODE_PRIVATE;
               SharedPreferences mySharedPreferences;
               mySharedPreferences = getSharedPreferences(MYPREFS, mode);
               SharedPreferences.Editor editor = mySharedPreferences.edit();
               editor.putString("IP", serverip);
               editor.putInt("Port", serverport);
               editor.commit();
            Toast.makeText(getBaseContext(), 
                    "Server Settings Saved" + serverip + serverport , 
                     Toast.LENGTH_LONG).show();
           }

}

これはデータを保存していません。Toast に null0 が表示されます。また、これらは上記のコードで宣言された変数です。

public static final String MYPREFS = "192.168.1.3";
public String serverip;
public int serverport;

Preferences.java

package com.example.homauto;

android.os.Bundle をインポートします。android.preference.PreferenceActivity をインポートします。

public class Preferences extends PreferenceActivity{

@SuppressWarnings("deprecation")
@Override
protected void onCreate(final Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
} 

}

私はプログラミングの初心者です..これは私が参考にしたウェブサイトです..Android TCP接続チュートリアル

4

1 に答える 1

0

OK、IP とポートを TCPClient クラスに渡すためにできることがいくつかあります。私にとって最も簡単なのは、run メソッドを次のように宣言することです。

public void run(String srvIP, int srvPort)
{
    mRun = true;
    try {
        //here you must put your computer's IP address.
        InetAddress serverAddr = InetAddress.getByName(srvIP);
        Log.e("TCP Client", "C: Connecting...");
        //create a socket to make the connection with the server
        Socket socket = new Socket(serverAddr, srvPort);

次のように呼び出す必要があります。

 mTcpClient.run("ServerIP", ServerPort);
 like this: mTcpClient.run("192.168.1.25", 4444);

他の可能性は、create メソッドを変更してそれらのパラメーターをそこに置くことです。

// You have to remove the final in these variables
public static String SERVERIP = "192.168.0.102"; //your computer IP address
public static int SERVERPORT = 4444;
 public TCPClient(String srvIP, int srvPort, OnMessageReceived listener) {
        SERVERIP=srvIP;
        SERVERPORT=srvPort;
        mMessageListener = listener;
    }

そして、次のようにクラスをインスタンス化します。

mTcpClient = new TcpClient(ServerIP, ServerPort, new TcpClient.OnMessageReceived()

ここで、アプリケーション (メイン アクティビティ) で、TCPClient クラス (この場合は AsyncTask) を起動する前に、接続先の IP とポートをユーザーに尋ねるために、ダイアログまたは別のアクティビティを配置する必要があります。

アクション バー メニューを配置し、クリックすると、それらの値を尋ねるダイアログが表示されます。

また、値を保存して、後で使用できるようにすることもできます (MainActivity で)。

// call it at Activity startup onStart() for example
public void loadData()
{
    int mode = Activity.MODE_PRIVATE;
    SharedPreferences mySharedPreferences;
    mySharedPreferences = getSharedPreferences(Typedefs.saveConfigsFileName, mode);
    serverIP = mySharedPreferences.getString("IP", serverIP);
    serverPort = mySharedPreferences.getInt("Port", serverPort);
}

// Call it whenever you modify the values
public void saveData()
{
    int mode = Activity.MODE_PRIVATE;
    SharedPreferences mySharedPreferences;
    mySharedPreferences = getSharedPreferences(Typedefs.saveConfigsFileName, mode);
    SharedPreferences.Editor editor = mySharedPreferences.edit();
    editor.putString("IP", serverIP);
    editor.putInt("Port", serverPort);
    editor.commit();
}
于 2013-07-16T12:34:09.897 に答える