gpt4 book ai didi

java - Android新手-没有线程的socket客户端

转载 作者:行者123 更新时间:2023-12-01 21:54:29 24 4
gpt4 key购买 nike

我想完成一个非常简单的应用程序:将 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 不允许在应用程序的主线程上进行网络操作。

关于java - Android新手-没有线程的socket客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34613831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com