gpt4 book ai didi

Android 数据报套接字不工作

转载 作者:行者123 更新时间:2023-11-30 03:21:52 24 4
gpt4 key购买 nike

我正在尝试在 Android 中实现基本的数据报套接字。我从网上提供的示例之一开始:

String messageStr="Hello Android!";
int server_port = 54372;
try {
DatagramSocket s = new DatagramSocket();
InetAddress local = null;
local = InetAddress.getByName("192.168.100.127");
int msg_length=messageStr.length();
byte[] message = messageStr.getBytes();
DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
s.send(p);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

我在 AndroidManifest.xml 中启用了 INTERNET 权限:

<uses-permission android:name="android.permission.INTERNET"/>

程序在遇到 s.send(p) 命令时终止。

我错过了什么?它一定是显而易见的。

最佳答案

您收到一个您没有捕获的错误:NetworkOnMainThreadException。您应该在另一个 Thread 或 AsyncTask 中处理所有网络工作人员。

例如:

class MyThread extends Thread
{
@Override
public void run()
{
UDPSend();
}

void UDPSend()
{
String messageStr = "Hello Android!";
int server_port = 54372;
try
{
DatagramSocket s = new DatagramSocket();
InetAddress local = null;
local = InetAddress.getByName("192.168.1.57");
int msg_length = messageStr.length();
byte[] message = messageStr.getBytes();
DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
s.send(p);
android.util.Log.w("UDP", "Works fine!");
}
catch (SocketException e)
{
e.printStackTrace();
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (Exception e)
{
android.util.Log.w("UDP", "Catched here.");
e.printStackTrace();
}
}

}

要在主线程中执行线程:new MyThread().start();

更新:

异步任务中的 UDP 接收器:这是应用程序的真实示例。我删除了一些不相关的行。我向您展示了 doInBackgroud,它接收 UDP 数据包。

@Override
protected Void doInBackground(Void... urls)
{
DatagramSocket socketUDP;

try
{
socketUDP = new DatagramSocket(5050);
socketUDP.setSoTimeout(5000);

// set it to true if you want to receive broadcast packets
socketUDP.setBroadcast(false);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}

byte[] buff = new byte[512];
DatagramPacket packet = new DatagramPacket(buff, buff.length);
try
{
asyncTask_UDP_is_running=true;
// Keep running until application gets inactive
while (aplicationActive)
{
try
{
socketUDP.receive(packet);
android.util.Log.w("UDP", "got a packet");
}
catch (java.net.SocketTimeoutException ex)
{
// timeout
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
finally
{
asyncTask_UDP_is_running=false;
}
return null;
}

关于Android 数据报套接字不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986184/

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