Android之Socket的基于UDP传输
接收方创建步骤:
1. 创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket = new DatagramSocket (4567);
2. 创建一个byte数组用于接收
byte data[] = new byte[1024];
3. 创建一个空的DatagramPackage对象
DatagramPackage package = new DatagramPackage(data , data.length);
4. 使用receive方法接收发送方所发送的数据,同时这也是一个阻塞的方法
socket.receive(package);
5. 得到发送过来的数据
new String(package.getData() , package.getOffset() , package.getLength());
发送方创建步骤:
1. 创建一个DatagramSocket对象
DatagramSocket socket = new DatagramSocket (4567);
2. 创建一个 InetAddress , 相当于是地址
InetAddress serverAddress = InetAddress.getByName("想要发送到的那个IP地址");
3. 这是随意发送一个数据
String str = "hello";
4. 转为byte类型
byte data[] = str.getBytes();
5. 创建一个DatagramPacket 对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号
DatagramPacket package = new DatagramPacket (data , data.length , serverAddress , 4567);
6. 调用DatagramSocket对象的send方法 发送数据
socket . send(package);
一、有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。
1、可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock;具体如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在调用广播发送、接收报文之前先调用lock.acquire()方法;
3、用完之后及时调用lock.release()释放资源,否决多次调用lock.acquire()方法,程序可能会崩,详情请见
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;记得在配置文件里面添加如下权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
经过这样处理后,多数手机都能正常发送接收到广播报文。
本小点转载自Android手机接收不到UDP报文
二、在UDP通信中,android端发送UDP广播包没有问题。至于接收的话,有时候不能接收到包。
在UDP通信中,Android端发送UDP广播包没有问题。至于接收的话,有时候不能接收到包。但是如果UDP包中指定了目标主机的地址的话,那么android端就能正常接收。
下面上一段代码,大家可用这段代码进行测试。
1、在一个Service里面,我们创建一个线程
public void onCreate() {//用于创建线程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);
//传递WifiManager对象,以便在UDPHelper类里面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}
2、弄一个UDP帮助类,这个类主要用于发送和接收数据
package com.example.com.ihome.bang.util; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Observable;
import com.example.com.ihome.bang.tool.SendThread;
import android.net.wifi.WifiManager;
import android.util.Log; /**
*
* UdpHelper帮助类
*
* @author 陈喆榕
*
*/
public class UdpHelper implements Runnable {
public Boolean IsThreadDisable = false;//指示监听线程是否终止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP服务器监听的端口
Integer port = ;
// 接收的字节大小,客户端发送的数据不能超过这个大小
byte[] message = new byte[];
try {
// 建立Socket连接
DatagramSocket datagramSocket = new DatagramSocket(port);
datagramSocket.setBroadcast(true);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (!IsThreadDisable) {
// 准备接收数据
Log.d("UDP Demo", "准备接受");
this.lock.acquire(); datagramSocket.receive(datagramPacket);
String strMsg=new String(datagramPacket.getData()).trim();
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" +strMsg );this.lock.release();
}
} catch (IOException e) {//IOException
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
} }
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = ;
Log.d("UDP Demo", "UDP发送数据:"+message);
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
local = InetAddress.getByName("255.255.255.255");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try { s.send(p);
s.close(); } catch (IOException e) {
e.printStackTrace();
}
} @Override
public void run() {
StartListen();
}
}
最后, 添加个人的实例 :
package com.example.android.helloactivity; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.example.andriod.udp.UDPClient;
import com.example.andriod.udp.UDPServer; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainAct extends Activity {
EditText msg_et = null;
Button send_bt = null;
TextView info_tv = null;
private static final String TAG ="MainAct";
private UDPClient client;
private String sendInfo; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.udp_test);
msg_et = (EditText) findViewById(R.id.edit_msg);
send_bt = (Button) findViewById(R.id.send_bt);
info_tv = (TextView) findViewById(R.id.receive_msg);
info_tv.setText("source");
// 开启服务器
ExecutorService exec = Executors.newCachedThreadPool();
UDPServer server = new UDPServer();
exec.execute(server);
// 发送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) { myThread1 thread = new myThread1("");
new Thread(thread).start(); }
});
} final Handler mHander = new Handler() { public void handleMessage(Message msg) {
// TODO Auto-generated method stub
//super.handleMessage(msg);
info_tv.setText(sendInfo); Log.d(TAG, "client.send()=");
}
}; class myThread1 implements Runnable { private String threadName; public myThread1(String name) {
this.threadName = name;
} public void run() {
Log.d(TAG, "MyThread execu"+msg_et.getText().toString());
client = new UDPClient(msg_et.getText().toString());
sendInfo=client.send(); Message msg = mHander.obtainMessage();
msg.arg1=;
mHander.sendMessage(msg);
Log.d(TAG, "client.send()=");
}
}
}
package com.example.andriod.udp; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; import android.util.Log; public class UDPServer implements Runnable {
private static final int PORT = ;
private byte[] msg = new byte[];
private boolean life = true; public UDPServer() {
} public boolean isLife() {
return life;
} public void setLife(boolean life) {
this.life = life;
} @Override
public void run() {
DatagramSocket dSocket = null;
DatagramPacket dPacket = new DatagramPacket(msg, msg.length);
try {
dSocket = new DatagramSocket(PORT);
while (life) {
try {
dSocket.receive(dPacket);
Log.d("tian msg sever received",
new String(dPacket.getData(), dPacket.getOffset(),
dPacket.getLength())
+ "dPacket.getLength()="
+ dPacket.getLength());
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
package com.example.andriod.udp; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; import android.util.Log; public class UDPClient {
private static final int SERVER_PORT = ;
private DatagramSocket dSocket = null;
private String msg; public UDPClient(String msg) {
super();
this.msg = msg;
} public String send() {
StringBuilder sb = new StringBuilder();
InetAddress local = null;
try {
local = InetAddress.getByName("localhost"); // 本机测试
sb.append("已找到服务器,连接中...").append("/n");
} catch (UnknownHostException e) {
sb.append("未找到服务器.").append("/n");
e.printStackTrace();
}
try {
dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常
sb.append("正在连接服务器...").append("/n");
} catch (SocketException e) {
e.printStackTrace();
sb.append("服务器连接失败.").append("/n");
}
int msg_len = msg == null ? : msg.length();
DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len,
local, SERVER_PORT);
try {
dSocket.send(dPacket);
Log.d("tian", "msg=="+msg+"dpackage="+dPacket.getData()+"dPacket.leng="+dPacket.getLength());
sb.append("消息发送成功!").append("/n");
} catch (IOException e) {
e.printStackTrace();
sb.append("消息发送失败.").append("/n");
}
dSocket.close();
return sb.toString();
}
}
Android之Socket的基于UDP传输的更多相关文章
- 网络编程、三要素、Socket通信、UDP传输、TCP协议、服务端(二十五)
1.网络编程概述 * A:计算机网络 * 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传 ...
- 基于UDP传输协议局域网文件接收软件设计 Java版
网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...
- Android如何实现TCP和UDP传输
TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控 ...
- java Socket编程-基于UDP
package com.wzy.UDPTest; import java.net.DatagramPacket; import java.net.DatagramSocket; import java ...
- socket通信——通过Udp传输方式,将一段文字数据发送出去
需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...
- socket原理-基于UDP的套接字-基于TCP实现远程命令-粘包
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- AC6102 开发板千兆以太网UDP传输实验2
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...
- AC6102 开发板千兆以太网UDP传输实验
AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...
随机推荐
- 【Android 进阶】图片载入框架之Glide
简单介绍 在泰国举行的谷歌开发人员论坛上,谷歌为我们介绍了一个名叫 Glide 的图片载入库,作者是 bumptech.这个库被广泛的运用在 google 的开源项目中,包含 2014 年 googl ...
- 开源企业IM-免费企业即时通讯-ENTBOOST V0.9版本号公布
ENTBOOST V0.9版本号公布,更新内容:1.完好多人群组聊天,提高群组聊天性能及稳定性:2.苹果IOS SDK.添加联系人管理功能,优化API和内部流程.修复部分BUG.3.添加企业应用功能集 ...
- 一个美丽的java烟花程序
<img src="http://img.blog.csdn.net/20150625104525974?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...
- xml Data Type Methods in sql server
nodes() Method (xml Data Type) https://docs.microsoft.com/en-us/sql/t-sql/xml/nodes-method-xml-data- ...
- @Transactional 事务注解
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = ...
- 《读书报告 – Elasticsearch入门 》----Part II 深入搜索(2)
第十三章 全文检索 这一章开始介绍 全文检索 :怎样对全文字段(full-text fields)进行检索以找到相关度最高的文档. 全文检索最重要的两个方面是: 相关度(Relevance) 根据文档 ...
- 今日SGU 5.14
//SGU 131 还没完全想清楚 留坑 SGU 259 题意:一个机器处理n个任务,每个任务有时间t和传送时间l 收获:贪心 #include<bits/stdc++.h> #defin ...
- struts2的acton标签中的ignoreContextParams属性和param子元素的冲突
<s:action ignoreContextParams="true" executeResult="true" name="login&qu ...
- js插件---datatables如何使用
js插件---datatables如何使用 一.总结 一句话总结:a.引入css和js(不要忘记css):b.js代码启动插件(里面可以用参数控制各种功能) 1.dataTables如何显示控制行(比 ...
- 1、Bracket使用
转自:https://www.jianshu.com/p/393833400782 Adobe的PhotoShop.Dreamweaver等大批优秀软件,印(nue)象(杀)了一代一代的优秀的计算机高 ...