Java Android新手-无线程套接字客户端

Java Android新手-无线程套接字客户端,java,android,Java,Android,我想完成一个非常简单的应用程序:向服务器发送TCP数据包。 服务器回答,暂时不重要 因此,我编写了一个非常简单的类,在其中创建一个套接字,发送消息,然后关闭套接字 s.send(msg.serialized)中的应用程序崩溃

我想完成一个非常简单的应用程序:向服务器发送TCP数据包。 服务器回答,暂时不重要

因此,我编写了一个非常简单的类,在其中创建一个套接字,发送消息,然后关闭套接字

s.send(msg.serialized)中的应用程序崩溃
myActivity中的代码:

        final TcpSender s = new TcpSender();

        switch (tab_ID) {
            case 1:
                rootView = inflater.inflate(R.layout.fragment_tab1, container, false);

                //----- btn_BotolaUp
                final ToggleButton btn_light = (ToggleButton) rootView.findViewById(R.id.btn_light);
                btn_light.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        String toastmessage;

                        if (isChecked) {
                            msg.serialize("Identifier", "ON", "datafield1", "datafield2");
                            toastmessage = "Light ON";
                        } else {
                            msg.serialize("Identifier", "OFF", "datafield1", "datafield2");
                            toastmessage = "Light OFF";
                        }

                        s.send(msg.serialized);
                        Toast.makeText(rootView.getContext(), toastmessage, Toast.LENGTH_SHORT).show();
                    }
                });

            case.... 
                etc
TcpSender类定义如下:

import android.util.Log;

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 TcpSender {
Socket socket;

public boolean send(String messagetosend) {

    try {
        InetAddress serverAddr = InetAddress.getByName("192.168.1.1");
        socket = new Socket(serverAddr, 10000);
        Log.d("Net", "Socket created");

        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        Log.d("Net", "PrintWriter out");

        out.print(messagetosend);
        Log.d("Net", "Message: " + messagetosend + " ->sent");
        socket.close();
        Log.d("Net", "Socket closed");

    } catch (UnknownHostException err) {
        err.printStackTrace();
        Log.e("Net", "UnknownHostException err");
        return (false);
    } catch (IOException err) {
        err.printStackTrace();
        Log.e("Net","IOException err");
        return (false);
    }

    Log.d("Net","send successful!");
    return (true);
}

}

有人能帮我理解我做错了什么吗?

对你的问题的简短回答是,如果你想进行网络操作,你需要一个单独的线程。Android不允许在应用程序的主线程上进行网络操作

对您的问题的简短回答是,如果您想进行网络操作,您将需要一个单独的线程。Android不允许在应用程序的主线程上进行网络操作

谷歌禁止您使用主线程执行网络任务,原因如下:

网络操作可能涉及不可预测的延迟。为了防止这种情况造成糟糕的用户体验,请始终在UI的单独线程上执行网络操作。
AsyncTask
类提供了从UI线程启动新任务的最简单方法之一

并确保清单中包含正确的权限


您可能会发现这个问题,并通过了解更多信息。

谷歌禁止您使用主线程执行网络任务,原因如下:

网络操作可能涉及不可预测的延迟。为了防止这种情况造成糟糕的用户体验,请始终在UI的单独线程上执行网络操作。
AsyncTask
类提供了从UI线程启动新任务的最简单方法之一

并确保清单中包含正确的权限


您可能会发现这个问题,并通过了解更多信息。

在android中,通常会在主线程上出现UrlConnection和任何其他网络操作的编译错误。我认为这也属于同一类。尝试在线程中执行此操作logcat中引发的异常是什么?是主线程上的网络异常吗?@Rahultwari我很确定您得到的运行时android.os.NetworkOnMainThreadException不是编译错误,但您可能是正确的,这是OP问题的根源。@JJF是的,您是正确的,但我记得看到eclipse显示红色的错误标记是几年前在onCreate方法中尝试创建urlconnection时出现的。在android中,对于urlconnection和主线程上的任何其他网络操作,通常会出现编译错误。我认为这也属于同一类。尝试在线程中执行此操作logcat中引发的异常是什么?是主线程上的网络异常吗?@Rahultwari我很确定您得到的运行时android.os.NetworkOnMainThreadException不是编译错误,但您可能是正确的,这是OP问题的根源。@JJF是的,您是正确的,但我记得看到eclipse显示红色的错误标记是几年前在onCreate方法中尝试创建urlconnection时出现的。所以,如果我已经很好地理解了,我必须在同一个单独的任务中创建套接字、发送数据包并关闭套接字。。。这样,每次需要发送数据包时,我都会创建一个新任务(new connectTask().execute(“”;)。。。可以吗?我推断任务一旦终止,将被垃圾杀死?可以吗?所以,如果我已经很好地理解了,我必须在同一个单独的任务中创建套接字、发送数据包并关闭套接字。。。这样,每次需要发送数据包时,我都会创建一个新任务(new connectTask().execute(“”;)。。。可以吗?我推断任务一旦终止,将被垃圾杀死?可以吗?