鍍金池/ 問答/Android/ 安卓開發(fā)錯誤,發(fā)送UDP包時報錯

安卓開發(fā)錯誤,發(fā)送UDP包時報錯

問題描述

如題,使用AS做安卓開發(fā)時遇到的問題,ds.send(dp)報錯空指針



問題代碼

package com.example.administrator.controllerapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client extends BroadcastReceiver {
    int SELECT_FLAG = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        DatagramSocket ds = null;
        DatagramPacket dp = null;
        try {
            ds = new DatagramSocket(9999);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        intent.getIntExtra("msg", SELECT_FLAG);
        String str = "" + SELECT_FLAG;
        try {
            dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("218.197.253.42"), 9000);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        try {
            ds.send(dp);  //此行報錯。
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Toast.makeText(context, "指令已發(fā)送", Toast.LENGTH_SHORT).show();
    }
}


權(quán)限聲明

權(quán)限聲明

錯誤提示

提示空指針

嘗試解決

更改端口號,仍然報錯
更改ip地址,仍然報錯
百度和論壇搜索了,但是沒有找到很多相關(guān)的東西

回答
編輯回答
風畔

自己的回答

聽從@亞林的建議我重新靜下心來debug了一下
首先發(fā)現(xiàn)了下面的錯誤:

錯誤提示

SocketException
根據(jù)錯誤提示可以看到第一行的err就寫道:SocketException
仔細一看,原來是粗心沒有添加網(wǎng)絡(luò)訪問權(quán)限

添加權(quán)限后的聲明

圖片描述
第二條permission就是為聯(lián)網(wǎng)新添加的權(quán)限聲明,想一想現(xiàn)在沒有幾個app是不用聯(lián)網(wǎng)的了,這條權(quán)限聲明
大家記得寫,不要學(xué)我粗心大意。。

再次Debug

仍然有錯誤,我們看一看錯誤提示

NetworkOnMainThreadException
圖比較小,可能看不清,上面寫的是NetworkOnMainThreadException,原來問題出在這里。。
百度一下發(fā)現(xiàn):
在很早以前,某個比較老版本之后,就禁止在主線程中進行網(wǎng)絡(luò)操作了,因為網(wǎng)絡(luò)操作很可能會阻塞線程,為了避免主線程被阻塞的情況發(fā)生,干脆就禁止開發(fā)者在主線程中進行網(wǎng)絡(luò)操作了,只能夠使用多線程在子線程中操作網(wǎng)絡(luò)相關(guān)的任務(wù)。那么,我們簡單地寫一個多線程。

修改后的Client代碼

package com.example.administrator.controllerapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client extends BroadcastReceiver {
    int SELECT_FLAG = 0;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramSocket ds = null;
                DatagramPacket dp = null;
                try {
                    ds = new DatagramSocket(9999);
                } catch (SocketException e) {
                    e.printStackTrace();
                }
                SELECT_FLAG = intent.getIntExtra("msg", SELECT_FLAG);
                String str = "" + SELECT_FLAG;
                try {
                    dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("192.168.43.20"), 9000);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                try {
                    ds.send(dp);
                    ds.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        Toast.makeText(context, "指令已發(fā)送", Toast.LENGTH_SHORT).show();
    }
}

僅僅添加了多線程,其他的內(nèi)容幾乎沒有改變

問題解決啦~讓我們在電腦上隨便寫一個小程序接收一下數(shù)據(jù)來驗證一下吧

圖片描述
驗證成功~

總結(jié)

1.遇到問題要淡定

2.遇到問題要淡定

3.遇到問題要淡定

仔細分析,查查資料,沒有不可能,只有

不,可能

如果覺得回答還不錯請支持一下哦~謝謝

2018年6月8日 01:32
編輯回答
夢若殤

Client.java37行,debug看看

2018年5月19日 12:36