Java android上局域网中运行的UDP服务器

Java android上局域网中运行的UDP服务器,java,android,multithreading,service,udp,Java,Android,Multithreading,Service,Udp,我正在使用UDP服务器,但我的服务器类给了我错误,我正在为我的服务器使用服务类并创建线程,但最终它没有运行,并给了我错误,它在运行几秒钟后停止 public class MainActivity extends Service { static String UDP_BROADCAST = "UDPBroadcast"; DatagramSocket socket; private void listenAndWaitAndThrowIntent(InetAddress broadcas

我正在使用UDP服务器,但我的服务器类给了我错误,我正在为我的服务器使用服务类并创建线程,但最终它没有运行,并给了我错误,它在运行几秒钟后停止

public class MainActivity extends Service {


static String UDP_BROADCAST = "UDPBroadcast";
DatagramSocket socket;


private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception {
    byte[] recvBuf = new byte[15000];
    if (socket == null || socket.isClosed())
    {
        socket = new DatagramSocket(port, broadcastIP);
        socket.setBroadcast(true);
    }
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
    Log.e("UDP", "Waiting for UDP broadcast");
    socket.receive(packet);

    String senderIP = packet.getAddress().getHostAddress();
    String message = new String(packet.getData()).trim();
    Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message);

//  broadcastIntent(senderIP, message);
    socket.close();
}
private void broadcastIntent(String senderIP, String message) {
    Intent intent = new Intent(MainActivity.UDP_BROADCAST);
    intent.putExtra("sender", senderIP);
    intent.putExtra("message", message);
    sendBroadcast(intent);
}
     Thread UDPBroadcastThread;

void startListenForUDPBroadcast() {
    UDPBroadcastThread = new Thread(new Runnable() {
        public void run() {
            try {
                InetAddress broadcastIP =     InetAddress.getByName("192.168.1.101"); //172.16.238.42 //192.168.1.255
                Integer port = 11111;
                while (shouldRestartSocketListen) {
                    listenAndWaitAndThrowIntent(broadcastIP, port);
                }
                //if (!shouldListenForUDPBroadcast) throw new ThreadDeath();
            } catch (Exception e) {
                Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage());
            }
        }
    });
    UDPBroadcastThread.start();
}
           private Boolean shouldRestartSocketListen=true;

void stopListen() {
    shouldRestartSocketListen = false;
    socket.close();
}

@Override
public void onCreate() {

};

@Override
public void onDestroy() {
    stopListen();
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    shouldRestartSocketListen = true;
    startListenForUDPBroadcast();
    Log.i("UDP", "Service started");
    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}
 }
我的日志猫是:

    08-26 19:28:44.232: D/AndroidRuntime(618): Shutting down VM
    08-26 19:28:44.252: W/dalvikvm(618): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
    08-26 19:28:44.352: E/AndroidRuntime(618): FATAL EXCEPTION: main
    08-26 19:28:44.352: E/AndroidRuntime(618): java.lang.RuntimeException: Unable to   instantiate activity ComponentInfo{com.example.receiver/com.example.receiver.MainActivity}:   java.lang.ClassCastException: com.example.receiver.MainActivity cannot be cast to   android.app.Activity
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1879)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.os.Handler.dispatchMessage(Handler.java:99)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.os.Looper.loop(Looper.java:137)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.ActivityThread.main(ActivityThread.java:4340)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at java.lang.reflect.Method.invokeNative(Native Method)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at java.lang.reflect.Method.invoke(Method.java:511)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at dalvik.system.NativeStart.main(Native Method)
    08-26 19:28:44.352: E/AndroidRuntime(618): Caused by: java.lang.ClassCastException: com.example.receiver.MainActivity cannot be cast to android.app.Activity
    08-26 19:28:44.352: E/AndroidRuntime(618):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
    08-26 19:28:44.352: E/AndroidRuntime(618):  at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
    08-26 19:28:44.352: E/AndroidRuntime(618):  ... 11 more

你正在混合你试图在这里完成的不同任务。您的活动必须扩展
活动
,以便Android能够在屏幕上显示它<另一方面,代码>服务,基本上是一种告诉Android你有一些背景或点播任务需要处理的方式

您需要将您的UI(需要是
活动
)与
服务
分开。根据您的代码,您的类中似乎没有任何名为
MainActivity
的UI代码,因此您需要编写一个(扩展
Activity
)或指向现有的
Activity
。您还应该重命名
main活动
,因为它实际上不是
活动


有一些例子可能会有所帮助。

谢谢兄弟,那么服务呢,我该如何告诉我的活动作为一种服务来工作???@AmeerHumza一个类不能既是一种
活动
又是一种
服务
。你把它们分开写,让它们互相交流。文档中有一些示例。