Android(java)学习笔记57:PC and Phone 通信程序
1. 首先我写的程序代码如下:
package com.himi.udpsend; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.DatagramSocketImpl;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener {
private EditText edittext;
private Button btnsend;
private WifiInfo wifiInfo; //类Wifiinfo,WifiInfo获取各种Wifi各种信息
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); edittext = (EditText)findViewById(R.id.edit);
btnsend = (Button)findViewById(R.id.btnsend); btnsend.setOnClickListener(this); WifiManager wman = (WifiManager) getSystemService(Context.WIFI_SERVICE); if(! wman.isWifiEnabled()) {
wman.setWifiEnabled(true);
}
Log.e("ip", intToIp(wifiInfo.getIpAddress()));//获得本机ip } public String intToIp(int i) {
return (i & 0xff) +"."+
((i>>8) & 0xff )+"."+
((i>>16) & 0xff )+"."+
((i>>24) & 0xff ); } public void onClick(View v) { try {
// 创建发送端socket对象
DatagramSocket ds = new DatagramSocket(); // 创建数据并打包
String edit_content = edittext.getText().toString();
byte[] bys = edit_content.getBytes();
int length = bys.length; String ip = intToIp(wifiInfo.getIpAddress());
InetAddress hostip = InetAddress.getByName(ip); int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, hostip, port); //发送数据包
ds.send(dp);
//关闭套接字,回收资源
ds.close(); } catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} } }
2. 报错如下:
06-26 02:37:29.270: E/Trace(841): error opening trace file: No such file or directory (2)
06-26 02:37:30.400: D/AndroidRuntime(841): Shutting down VM
06-26 02:37:30.400: W/dalvikvm(841): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
06-26 02:37:30.540: E/AndroidRuntime(841): FATAL EXCEPTION: main
06-26 02:37:30.540: E/AndroidRuntime(841): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.himi.udpsend/com.himi.udpsend.MainActivity}: java.lang.NullPointerException
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.os.Looper.loop(Looper.java:137)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-26 02:37:30.540: E/AndroidRuntime(841): at java.lang.reflect.Method.invokeNative(Native Method)
06-26 02:37:30.540: E/AndroidRuntime(841): at java.lang.reflect.Method.invoke(Method.java:511)
06-26 02:37:30.540: E/AndroidRuntime(841): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-26 02:37:30.540: E/AndroidRuntime(841): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-26 02:37:30.540: E/AndroidRuntime(841): at dalvik.system.NativeStart.main(Native Method)
06-26 02:37:30.540: E/AndroidRuntime(841): Caused by: java.lang.NullPointerException
06-26 02:37:30.540: E/AndroidRuntime(841): at com.himi.udpsend.MainActivity.onCreate(MainActivity.java:41)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.Activity.performCreate(Activity.java:5104)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-26 02:37:30.540: E/AndroidRuntime(841): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-26 02:37:30.540: E/AndroidRuntime(841): ... 11 more
06-26 02:37:34.910: I/Process(841): Sending signal. PID: 841 SIG: 9
原因:空指针异常,这时就要查看自己的程序中是否存在空指针。
4. 解决办法是:
package com.himi.udpsend; import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.DatagramSocketImpl;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener {
private EditText edittext;
private Button btnsend;
private WifiInfo wifiInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); edittext = (EditText)findViewById(R.id.edit);
btnsend = (Button)findViewById(R.id.btnsend); btnsend.setOnClickListener(this); WifiManager wman = (WifiManager) getSystemService(Context.WIFI_SERVICE); if(! wman.isWifiEnabled()) {
wman.setWifiEnabled(true);
}//没有正确使用Log()
//Log.e("ip", intToIp(wifiInfo.getIpAddress()));//获得本机ip } public String intToIp(int i) {
return (i & 0xff) +"."+
((i>>8) & 0xff )+"."+
((i>>16) & 0xff )+"."+
((i>>24) & 0xff ); } public void onClick(View v) { try {
// 创建发送端socket对象
DatagramSocket ds = new DatagramSocket(); // 创建数据并打包
String edit_content = edittext.getText().toString();
byte[] bys = edit_content.getBytes();
int length = bys.length; String ip = intToIp(wifiInfo.getIpAddress());
InetAddress hostip = InetAddress.getByName(ip); int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, hostip, port); //发送数据包
ds.send(dp);
//关闭套接字,回收资源
ds.close(); } catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} } }
附加:
DatagramSocket:套接字用来UDP通信
DatagramPacket:用来包装UDP通信数据包
InetAddress:是Java对IP地址的封装
Android(java)学习笔记57:PC and Phone 通信程序的更多相关文章
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
随机推荐
- log4net sqlite
<?xml version="1.0" encoding="utf-8" ?><log4net> <appender name=& ...
- oracle 查询及删除表中重复数据
create table test1( id number, name varchar2(20) ); ,'jack'); ,'jack'); ,'peter'); ,'red'); insert i ...
- unity摄像机脚本
直接挂载在摄像机上面即可 1.摄像机自由平移 using UnityEngine; using System.Collections; /// <summary> /// 摄像机视角自由移 ...
- BJFU 1551 ——delightful world——————【暴搜】
delightful world 时间限制(C/C++):20000MS/30000MS 运行内存限制:65536KByte总提交:33 测试通过:10 描述 ...
- nyoj 1023——还是回文——————【区间dp】
还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...
- 深入理解JavaScript系列(24):JavaScript与DOM(下)
介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...
- mpvue自定义化后台富文本样式
最近公司写小程序开始换框架了,之前用wepy,现在用mpvue. mpvue是基于vue的写法来开发微信小程序.虽然不完全和vue一样,但是大致和vue一样,所以基本开发上是上手很快的. 现在项目进程 ...
- 集合异常之List接口
List接口介绍:是Collection接口中的子类, 特点: l 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的).( ...
- javascript:中文等字符转成unicode
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Scrapy框架之日志等级和请求传参
一.Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 1.日志等级(信息种类) ERROR:错误 WARN ...