java - 在开关按钮中进行套接字编程

标签 java android sockets

我正在做一个项目,通过 WiFi 路由器将数据发送到目标 IP。我放置了一个开关按钮。当开关按钮打开时,一些预先写入的数据被发送到IP。

我在目的地无法听到任何声音。我已附上代码。

MainActivity.java:

package com.project.saket.switchsocket;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.CompoundButton.OnCheckedChangeListener;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {

        private Switch switch1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                            .setAction("Action", null).show();
                }
            });
            switch1 = (Switch) findViewById(R.id.switch1);
            switch1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                    if (isChecked) {
                        new SuriSocket("$ASAS,F1#");
                    } else {
                        new SuriSocket("$ASAS,F0#");
                    }
                }
            });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();

            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }
    }

SuriSocket.java:

package com.project.saket.switchsocket;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class SuriSocket {
    private Socket output;
    private static final int SERVERPORT = 8080;
    private static final String SERVER_IP = "192.168.0.131";

    private boolean setup() {
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            output = new Socket(serverAddr, SERVERPORT);
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
            return false;
        } catch (IOException e1) {
            e1.printStackTrace();
            return false;
        }
        return true;
    }


    public SuriSocket(String sMessage) {
        if (setup()) {
            try {
                PrintWriter out = new PrintWriter(new BufferedWriter(
                        new OutputStreamWriter(output.getOutputStream())),
                        true);
                out.println(sMessage);
                out.flush();
                out.close();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

最佳答案

您在 IDE 的 LogCat 中清晰可见 NetworkOnMaiThreadException。将网络和套接字代码放置在 AsyncTask 或线程中。

关于java - 在开关按钮中进行套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290303/

相关文章:

java - Eclipse & 注入(inject)点 : 的依赖关系不满足或不明确

java - 使用 Tinkerpop 的 g.V() 时,TitanDB 是否会将完整图加载到内存中?

java - 字符串比较时获取空指针异常

android - 根据屏幕类型动态更改 TextView 中的点数

Python 3 : Sending files through socket.(客户端-服务器程序)

java - 创建套接字连接后 JFrame 被阻止

java - Jackson JsonMappingException 错误 - 表示属性 'PROPERTY_NAME' 的多个字段

android - 无法在 AppCompatActivity 中使用 android :Theme. Material

java - 如何在 Android 中找到路径中的所有点?

java - 因本地异常 : java.net.SocketException : No buffer space available (maximum connections reached? 失败):