• 22-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 连接和断开


    https://www.cnblogs.com/yangfengwu/p/11192618.html

    有些很细致的东西参考这篇   https://www.cnblogs.com/yangfengwu/p/5212570.html  看看就可以

    咱用Android Studio做

     

    包名  路径什么的自己随意哈

     

    放一个textview 自己拖动,哈

     

    由于没有Edittext 控件,所以,没有可以拖进来的.....

     

    选择自适应

     如果没有提示 可以   CTRL + ALT +空格

     

     忘了一件事情,设置下控件的ID  实际上系统会自动设置,但是最好还是自己设置,避免以后文件多了ID冲突

     

     我一般命名规则是 这个控件的名称+该控件所在xml文件的文件名然后后面是1,2,3,4..................有多少个相同的控件就这样排

     

     

     

     

     

     

    public class MainActivity extends AppCompatActivity {
    
        EditText editTextActivityMain1,editTextActivityMain2;//定义两个EditText变量,变量名字我一般设置的和先前页面里面的一样
        Button buttonActivityMain1;//连接按钮
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //获取控件
            editTextActivityMain1 = findViewById(R.id.editTextActivityMain1);
            editTextActivityMain2 = findViewById(R.id.editTextActivityMain2);
            buttonActivityMain1 = findViewById(R.id.buttonActivityMain1);
        }
    }

      连接网络通信需要加权限,我一般都会一次性把自己所有可能用到的都加进去

        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <!--读手机内容的权限 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

    其实只需要,,我是为了以后做软件省时省事

     

     

    由于连接的时候是阻塞的(连接不上就一直等着,直到连接错误,或者超时),所以需要任务

     

     

     

    还是用的

    https://www.cnblogs.com/yangfengwu/p/11130428.html  这节的程序

                                    

     接着完善

    由于不能在任务里面操作控件,所以咱需要用  Handler

    和当时  https://www.cnblogs.com/yangfengwu/p/11087618.html

    一样的道理,只不过解决的方法不一样

     

     

     

    public class MainActivity extends AppCompatActivity {
    
        EditText editTextActivityMain1,editTextActivityMain2;//定义两个EditText变量,变量名字我一般设置的和先前页面里面的一样
        Button buttonActivityMain1;//连接按钮
    
        Socket socket;//定义一个Socket
    
        MyHandler myHandler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myHandler = new MyHandler();
    
            //获取控件
            editTextActivityMain1 = findViewById(R.id.editTextActivityMain1);
            editTextActivityMain2 = findViewById(R.id.editTextActivityMain2);
            buttonActivityMain1 = findViewById(R.id.buttonActivityMain1);
    
            //连接按钮点击事件
            buttonActivityMain1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (buttonActivityMain1.getText().toString() == "连接"){
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                //这里面写具体的程序
                                try {
                                    socket = new Socket("192.168.4.1",8888);//连接TCP服务器
                                    if (socket.isConnected()){//如果连接上TCP服务器
                                        Log.e("MainActivity", "isConnected");
                                        Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                                        msg.what = 1;//设置消息变量的 what 变量值 为1
                                        myHandler.sendMessage(msg);//插入消息队列
                                    }
                                }
                                catch (Exception e){
                                    Log.e("MainActivity", e.toString());
                                }
                            }
                        }).start();
                    }
                    else {
                        try{ socket.close(); }catch (Exception e){} //关闭连接
                        buttonActivityMain1.setText("连接");//按钮显示连接
                    }
                }
            });
        }
    
    
        //Handler
        class MyHandler extends Handler {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1){//接收到消息变量的 what 变量值 为1
                    buttonActivityMain1.setText("断开");//按钮显示断开
                }
            }
        }
    }

     测试

         

    现在用上上面的IP和端口号

    socket = new Socket(editTextActivityMain1.getText().toString(),Integer.valueOf(editTextActivityMain2.getText().toString()))

        

    public class MainActivity extends AppCompatActivity {
    
        EditText editTextActivityMain1,editTextActivityMain2;//定义两个EditText变量,变量名字我一般设置的和先前页面里面的一样
        Button buttonActivityMain1;//连接按钮
    
        Socket socket;//定义一个Socket
    
        MyHandler myHandler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myHandler = new MyHandler();
    
            //获取控件
            editTextActivityMain1 = findViewById(R.id.editTextActivityMain1);
            editTextActivityMain2 = findViewById(R.id.editTextActivityMain2);
            buttonActivityMain1 = findViewById(R.id.buttonActivityMain1);
            buttonActivityMain1.setText("连接");//加上这个,否则按钮需要点击两次才会判断按钮的Text是"连接"
    
            //连接按钮点击事件
            buttonActivityMain1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (buttonActivityMain1.getText().toString() == "连接"){
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                //这里面写具体的程序
                                try {
                                    socket = new Socket(editTextActivityMain1.getText().toString(),Integer.valueOf(editTextActivityMain2.getText().toString()));//连接TCP服务器
                                    if (socket.isConnected()){//如果连接上TCP服务器
                                        Log.e("MainActivity", "isConnected");
                                        Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                                        msg.what = 1;//设置消息变量的 what 变量值 为1
                                        myHandler.sendMessage(msg);//插入消息队列
                                    }
                                }
                                catch (Exception e){
    
                                    Log.e("MainActivity", e.toString());
                                }
                            }
                        }).start();
                    }
                    else {
                        try{ socket.close(); }catch (Exception e){} //关闭连接
                        buttonActivityMain1.setText("连接");//按钮显示连接
                    }
                }
            });
        }
    
    
        //Handler
        class MyHandler extends Handler {
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1){//接收到消息变量的 what 变量值 为1
                    buttonActivityMain1.setText("断开");//按钮显示断开
                }
            }
        }
    }

    https://www.cnblogs.com/yangfengwu/p/11204436.html

  • 相关阅读:
    【转载】python字符格式化
    【python】生产者消费者问题优化
    【python】pickle文件读写的insecure问题
    【工具使用】sublime设置换行符为unix风格
    【python】CGI部署问题解决
    【python】引用c的dll
    【多线程】Python进程,队列和锁相关的一些问题
    【Python】下载图片,标识之后转发出去
    【Python】PIL在window64位机制上引用异常问题解决
    【Python网页分析】httplib库的重定向处理
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11203546.html
Copyright © 2020-2023  润新知