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内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
随机推荐
- C#数组 动态添加元素
string[] a = new string[] { "1", "2", "3" }; 给a追加一个 "4" 1 2 ...
- vue之理解异步更新 --- nextTick
默认情况下,vue中DOM的更新是异步执行的,理解这一点非常重要. 当侦测到数据变化时,Vue会打开一个队列,然后把在同一个事件循环(event loop)当中观察到的数据变化的watcher推送进入 ...
- 几个免费 IP 归属地查询 API
1.淘宝:同个IP不能连续查询,需要时间间隔 http://ip.taobao.com/service/getIpInfo.php?ip=114.114.114.114 返回结果 { "co ...
- ContextCapture水面约束(水面破洞修复)
[问题描述] 对于水面而言,由于特征点较少,软件在计算时很难匹配正确,导致输出模型的水面通常是支离破碎的.软件针对这种情况提供了一个约束工具,用户手动的为水面添加平面约束后,输出的水面模型就会非常 ...
- [转]JFreeChart简介及下载、配置
JFreeChart简介 JFreeChart是完全基于Java语言的开源项目,因此可以使用在Java开发环境中,包括Java应用程序,或者是Java Web应用都没有任何问题.结合iText项目,可 ...
- POJ 3667 线段树区间合并
http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...
- idea tomcat 日志的存放路径
idea的项目发布web项目与eclipse很不同,于是思想被固化了后(用eclipse久了),折腾这个走弯路好多条.首先settings下配的Application Server是配置本机tomca ...
- 基于forms组件和Ajax实现注册功能
一.基于forms组件的注册页面设计 1.运用forms组件的校验字段功能实现用户注册 views.py: (在钩子中代码解耦,将form放在cnblog/blog/Myforms.py中) f ...
- 【数据库】2.0 MySQL入门学习(二)——如何获得MySQL以及MySQL安装
1.0 如何获得MySQL: www.oracle.com https://dev.mysql.com/downloads/ 2.0 例如进入Oracle官网,找到MySQL: 进入页面后,切换到“资 ...
- 原生js封装十字参考线插件(一)
需求来源: 拓扑图之机房平面图,显示机房长宽比例尺,房间内标注各种设备间距不易实现,特在机房平面图上层加一个十字参考线 横竖两条线垂直,在鼠标指针处交叉,显示鼠标指针坐标(相对机房平面图的坐标,不是相 ...