尝试在作为客户端的AndroidStudio-Java应用程序与Visual Studio C#服务器之间实现简单的UDP客户端/服务器数据报。我完全确定服务器端正在工作。
Here是一个UDP客户端,在ButtonClick上,UDP消息应该被发送到15000端口的本地主机“。”
我的StackTrace弹出Android.os.NetworkOnMainThreadException
错误。我发现here我可以使用一个简单的解决方案来导入StrictMode并将新策略设置为permitAll()。然而,仍然我的应用程序无法正常工作,并且字面上没有任何事情发生在ButtonClick“无例外跟踪+没有收到消息”,这是我的代码:
ButtonOne.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
TextView TextOne = (TextView) findViewById(R.id.TestText);
TextOne.setText("Hi");
String host = "127.0.0.1"; // localhost
int port = 15000;
String message = "Test";
DatagramSocket dsocket = null;
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
try {
// Get the Internet address of the specified host
InetAddress address = InetAddress.getByName(host);
// wrap a packet
DatagramPacket packet = new DatagramPacket(
message.getBytes(),
message.length(),
address, port);
// Create a datagram socket, send the packet through it, close it.
dsocket = new DatagramSocket();
dsocket.send(packet);
dsocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
);
然后我在这里发现here强烈建议不要使用StrictMode并且我需要使用AsyncTask。但是在Android Documentation上它说“ AsyncTask必须被子类化才能使用。子类将覆盖至少一个方法(doInBackground(Params ...)),并且通常会覆盖第二个方法(onPostExecute(结果)。)“我没有得到,因为每次我在MainActivity类中添加Async我都会收到错误并且令人沮丧......
是否可以将StrictMode用于此简单任务?如果是的话,为什么它不起作用?如果不是,有人能告诉我如何将AsyncTask导入这段代码吗?我应该使用Params,Progress,Result函数吗?
答案 0 :(得分:0)
由于您的数据包是发送和忘记的,并且您不监视其进度或在其结束时执行某些操作,因此您不需要异步任务。您需要在新线程中启动网络活动。代码如下,可能有轻微的编译问题,因为我现在无权访问。
ButtonOne.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
TextView TextOne = (TextView) findViewById(R.id.TestText);
TextOne.setText("Hi");
String message = "Test";
Thread networkThread = new Thread() {
String host = "127.0.0.1"; // localhost
int port = 15000;
DatagramSocket dsocket = null;
public void run() {
try {
// Get the Internet address of the specified host
InetAddress address = InetAddress.getByName(host);
// wrap a packet
DatagramPacket packet = new DatagramPacket(
message.getBytes(),
message.length(),
address, port);
// Create a datagram socket, send the packet through it, close it.
dsocket = new DatagramSocket();
dsocket.send(packet);
dsocket.close();
} catch (Exception e) {
e.printStackTrace();
}//catch
}//run
};// Networkthread
networkThread.start();//networkThread.start()
}//onClick
}//onClickListener
);//setOnClickListener