Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 与不扩展活动的类共享数据_Sockets_Android Intent_Android Activity_Tcpclient_Extends - Fatal编程技术网

Sockets 与不扩展活动的类共享数据

Sockets 与不扩展活动的类共享数据,sockets,android-intent,android-activity,tcpclient,extends,Sockets,Android Intent,Android Activity,Tcpclient,Extends,我使用socket为android制作了一个TCP客户端。但是,我的程序不允许我动态输入服务器地址。此外,我无法使用intent从MainActivity传输字符串,因为我的TcpClient.java没有扩展到Activity。我应该实现什么样的逻辑,以便动态设置服务器地址并连接到我想要的任何服务器 MainActivity.java @Override public boolean onCreateOptionsMenu(Menu menu) { ge

我使用socket为android制作了一个
TCP
客户端。但是,我的程序不允许我动态输入服务器地址。此外,我无法使用intent从
MainActivity
传输字符串,因为我的
TcpClient.java
没有扩展到
Activity
。我应该实现什么样的逻辑,以便动态设置服务器地址并连接到我想要的任何服务器

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();
           }
Preferences.java

package com.example.homauto;
导入android.os.Bundle; 导入android.preference.PreferenceActivity

公共类首选项扩展了PreferenceActivity{

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

我是个编程新手。。
这是我获取参考资料的网站。

好的,为了将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);
mTcpClient = new TcpClient(ServerIP, ServerPort, new TcpClient.OnMessageReceived()
另一种可能是更改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.run("ServerIP", ServerPort);
 like this: mTcpClient.run("192.168.1.25", 4444);
mTcpClient = new TcpClient(ServerIP, ServerPort, new TcpClient.OnMessageReceived()
现在,在您的应用程序(主活动)中,您需要放置一个对话框或另一个活动,以便在启动TCPClient类(在您的示例中为AsyncTask)之前要求用户提供要连接的IP和端口

我会放置一个操作栏菜单,当点击时会显示一个对话框来询问这些值

此外,您还可以保存这些值,以便将来使用(在MainActivity中):


您能否在启动/调用TcpClient的地方发布MainActivity的代码?它(TcpClient)是一个服务还是一个线程?我希望这是您所需要的…将变量MYPREFS从
“192.168.1.3”
更改为
“Config.dat”
并初始化其他两个变量,例如:`public String serverip=“192.168.1.3”`和
public int serverport=4444Thanx以获得有用的解释。。除了Typedefs.saveConfigsFileName之外,我得到了它的每一部分。。。能给我解释一下这部分吗?很抱歉,我是从我的一份申请中粘贴的。它只是一个字符串变量,包含一个文件名,例如:“MyFile.dat”、“Config.def”,随便你怎么命名。对不起,我还是不明白它的意思。。。另外,在调用run()函数时,您已经发送了一个字符串(ip地址)。我想发送一个字符串变量来代替它。编辑:是的,我把它改成了字符串变量,但我只停留在sharedprefs部分,好吧,我会解释一下:Typedefs是我的一个类,我有一个名为saveConfigsFileName的静态变量,声明如下:
string static final saveConfigFileName=“Config.dat”“Config.dat”
或您喜欢的任何其他名称更改
typedefs.saveConfigFilename
。Thanx我理解您所说的。。。但是,我在保存数据时遇到问题。。检查我编辑的问题中的代码。。