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
Android 通过带按钮的插座连接_Android_Sockets_Button_Android Activity - Fatal编程技术网

Android 通过带按钮的插座连接

Android 通过带按钮的插座连接,android,sockets,button,android-activity,Android,Sockets,Button,Android Activity,是我被这个问题困扰的日子。我创建了一个带有片段和选项卡的应用程序,我必须插入一个按钮,当单击该按钮时,它会连接到某个ip和某个端口,我不知道如何写入和放置它,它们只能在启动mainActivity时连接,但我希望可以通过按钮控制它,你能帮忙吗?首先,对于最新版本的Android framework,所有网络操作都不能从主线程(即管理UI的线程)执行。因此,您需要使用自己的线程进行连接 例如: package it.resis.solarapp.activities.fourcloud.appli

是我被这个问题困扰的日子。我创建了一个带有片段和选项卡的应用程序,我必须插入一个按钮,当单击该按钮时,它会连接到某个ip和某个端口,我不知道如何写入和放置它,它们只能在启动mainActivity时连接,但我希望可以通过按钮控制它,你能帮忙吗?

首先,对于最新版本的Android framework,所有网络操作都不能从主线程(即管理UI的线程)执行。因此,您需要使用自己的线程进行连接

例如:

package it.resis.solarapp.activities.fourcloud.application;

import it.resis.solarapp.R;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class CopyOfActivity4CloudConfiguration extends Activity {

    private volatile Socket socket = null;
    private boolean connectionOk = false;
    private Button buttonDisconnect;
    private Button buttonConnect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_layout);

        buttonConnect = findViewById(R.id.buttonConnect);
        buttonConnect.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                InetSocketAddress addr = new InetSocketAddress("192.168.1.1", 80);
                new ConnectToIpTask().execute(addr);
            }
        });

        buttonDisconnect = findViewById(R.id.buttonDisconnect);
        buttonConnect.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                new CloseSocket().execute();
            }
        });

        buttonDisconnect.setEnabled(false);
        buttonConnect.setEnabled(true);
    }

    private class ConnectToIpTask extends AsyncTask<InetSocketAddress, Void, Boolean> {

        @Override
        protected Boolean doInBackground(InetSocketAddress... params) {

            InetSocketAddress addr = params[0];

            try {
                socket = new Socket(addr.getAddress().toString(), addr.getPort());
            } catch (UnknownHostException e) {
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            connectionOk = result;

            // update here the ui with result
            if (result) {
                buttonDisconnect.setEnabled(true);
                buttonConnect.setEnabled(false);
            }
        }
    }

    private class CloseSocket extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {
                socket.close();
            } catch (Exception ex) {

            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            buttonDisconnect.setEnabled(false);
            buttonConnect.setEnabled(true);
        }
    }
}
package it.resis.solarapp.activities.fourcloud.application;
导入it.resis.solarapp.R;
导入java.io.IOException;
导入java.net.InetSocketAddress;
导入java.net.Socket;
导入java.net.UnknownHostException;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
公共类CopyOfActivity4CloudConfiguration扩展活动{
私有易失性套接字=空;
私有布尔连接OK=false;
专用按钮断开连接;
私人按钮连接;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_布局);
buttonConnect=findViewById(R.id.buttonConnect);
buttonConnect.setOnClickListener(新建Button.OnClickListener(){
@凌驾
公共void onClick(视图v){
InetSocketAddress addr=新的InetSocketAddress(“192.168.1.1”,80);
新建ConnectToIpTask().execute(addr);
}
});
buttonDisconnect=findViewById(R.id.buttonDisconnect);
buttonConnect.setOnClickListener(新建Button.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建CloseSocket().execute();
}
});
buttonDisconnect.setEnabled(假);
buttonConnect.setEnabled(true);
}
私有类ConnectToIpTask扩展异步任务{
@凌驾
受保护的布尔doInBackground(InetSocketAddress…参数){
InetSocketAddress addr=params[0];
试一试{
套接字=新套接字(addr.getAddress().toString(),addr.getPort());
}捕获(未知后异常e){
e、 printStackTrace();
返回false;
}捕获(IOE异常){
e、 printStackTrace();
返回false;
}
返回true;
}
@凌驾
受保护的void onPostExecute(布尔结果){
super.onPostExecute(结果);
connectionOk=结果;
//在这里用结果更新ui
如果(结果){
buttonDisconnect.setEnabled(true);
buttonConnect.setEnabled(假);
}
}
}
私有类CloseSocket扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
socket.close();
}捕获(例外情况除外){
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
buttonDisconnect.setEnabled(假);
buttonConnect.setEnabled(true);
}
}
}

我可以,我更改了代码行 发件人:


多亏了所有这些

通过socketif连接到ip后发生了什么?如果我无法连接以发送和接收数据,请在最后用另一个按钮关闭连接。现在,它崩溃了,无法连接。我复制了你的代码,不幸的是它无法工作,手机似乎无法连接。pulstante“disconnect”仍然处于禁用状态。我不知道这是否重要,但eclipse通过添加按钮(Button)强迫我更改代码行,例如:buttonDisconnect=(Button)findViewById(R.id.buttonClose);
@Override
    protected Boolean doInBackground(InetSocketAddress... params) {

        InetSocketAddress addr = params[0];

        try {
            **socket = new Socket(addr.getAddress().toString(), addr.getPort());**
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
 @Override
    protected Boolean doInBackground(InetSocketAddress... params) {

        InetSocketAddress addr = params[0];

        try {
            **socket = new Socket("192.168.1.1", 80);**
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }