首先是发送
package remote.com; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.Buffer; import java.util.ArrayList; import java.util.List; import udpreceive.com.UdpReceive; import android.app.Activity; import android.content.Intent; import android.hardware.Camera.Size; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class RemoteActivity extends Activity { /** Called when the activity is first created. */ private Button start_button; private Button end_button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); start_button = (Button)findViewById(R.id.start_bu); end_button = (Button)findViewById(R.id.end_bu); Intent intent = new Intent(); intent.setClass(RemoteActivity.this, UdpReceive.class); RemoteActivity.this.startService(intent); System.out.println("mian activity thread = " + Thread.currentThread().getId()); start_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub int server_port = 60000; String server_addr = "192.168.1.233"; String aa = "aa"; try { byte[] bytesa = aa.getBytes(); int bytesa_len = bytesa.length; DatagramSocket socket = new DatagramSocket(server_port); InetAddress local = InetAddress.getByName(server_addr); DatagramPacket sendSocket = new DatagramPacket(bytesa, bytesa_len, local, server_port); socket.send(sendSocket); System.out.println("send success"); socket.close(); //很关键, 发完后必须cloas 不然再点就发不了了 } catch (Exception e) { // TODO: handle } System.out.println("main activity thread id = " + Thread.currentThread().getId()); } }); end_button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(RemoteActivity.this, UdpReceive.class); RemoteActivity.this.stopService(intent); } }); // } ////// }
然后是接收 ,接收 是新建了一个线程 , new thread.start
package cfg.mft; import gloabal.mft.MyApplication; import java.io.IOException; import java.net.BindException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import android.app.Activity; import android.app.Service; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.MulticastLock; import android.os.Bundle; import android.os.IBinder; import android.util.Log; public class CfgUdpReceive extends Service{ private boolean threadDisable; private int count; MyApplication app; WifiManager wifi; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); System.out.println( "到了UdpReceive了"); new Thread(new ServerThread()).start(); } class ServerThread extends Thread{ public void run(){ Log.d("UDP Demo","到了里面了"); while (true) { // UDP服务器监听的端口 try { DatagramSocket socket = new DatagramSocket(15001); byte data [] = new byte[1024]; //创建一个空的DatagramPacket对象 DatagramPacket packet = new DatagramPacket(data,data.length); //使用receive方法接收客户端所发送的数据 if(socket == null){ break; } wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); MulticastLock ml = wifi.createMulticastLock("just some tag text"); ml.acquire(); // socket.receive(packet); String result = new String(packet.getData(),packet.getOffset(),packet.getLength()); Log.d("log", "收到udpReceive"); //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId()); app = (MyApplication) getApplication(); app.setName(1); ml.release(); socket.close(); } catch (Exception e) { // TODO: handle exception } } } } @Override public void onDestroy() { super.onDestroy(); this.threadDisable = true; Log.v("CountService", "on destroy"); } public int getCount() { return count; } }
然后是 manifest 里面添加权限
<uses-permission android:name="android.permission.INTERNET"/>
--
关于HTC 手机不能接收 问题 在 while 前 执行 下面的
WifiManager wifi; wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); MulticastLock ml = wifi.createMulticastLock("just some tag text"); ml.acquire();
如果 执行完了, 在 while 里面的 最后 执行
ml.release();
//创建一个DatagramSocket对象,并指定监听的端口号 DatagramSocket socket = new DatagramSocket(15001); byte data [] = new byte[1024]; //创建一个空的DatagramPacket对象 DatagramPacket packet = new DatagramPacket(data,data.length); //使用receive方法接收客户端所发送的数据 wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); MulticastLock ml = wifi.createMulticastLock("just some tag text"); ml.acquire(); while (true) { socket.receive(packet); String result = new String(packet.getData(),packet.getOffset(),packet.getLength()); //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId()); app = (MyApplication) getApplication(); app.setName(1); ml.release(); }
---
如果在虚拟机里面 搞不定, 不能接收 UDP 通知, 那需要 改 下 ip端口
解决方法:
1. 运行模拟器
2. 打开window 命令行
执行:telnet localhost 5554 或者是 telnet 127.0.0.1 5554
5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:
redir add udp :端口号:端口号
例如:
redir add udp:22221:22221
其中,第一个端口号是模拟器1的端口,第二个端口号是模拟器2端口。(端口映射)
执行此命令之后,会把模拟器 22221 端口发送的数据通过本机转到模拟器的22221端口,就能从22221端口接收UDP数据包了
-----------------------------------------------------------------------------
此外以上的做法有个个确定就是 在 接收的时候 要指定 端口 ,下面这个 接收方式 在同一个socket 下面就不用 在接收的时候指定端口了
class ServerThread extends Thread{ public void run(){ int server_port = 8257; String server_addr = "192.168.1.233"; String aa = "aaaa"; try { byte[] b = aa.getBytes(); int b_len = b.length; socket = new DatagramSocket(server_port); InetAddress local = InetAddress.getByName(server_addr); DatagramPacket sendSocket = new DatagramPacket(b, b_len, local, server_port); socket.send(sendSocket); System.out.println("send success" ); } catch (Exception e) { // TODO: handle e.printStackTrace(); } byte buff[]=new byte[1024]; DatagramPacket receivePacket=new DatagramPacket(buff,buff.length); try { socket.setSoTimeout(5000); //设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效 socket.receive(receivePacket); String result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength()); String rr = bin2hex(result); System.out.println("result--->" + rr + "\n" + " now thread id = " + Thread.currentThread().getId()); } catch (Exception e) { // TODO: handle exception socket.close(); } ////////// } }
如果是接收多个UDP 包
try { socket.setSoTimeout(5000); ////设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效 String re = ""; try { while (true) { re = re + "["; socket.receive(receivePacket); repacs=receivePacket.getData(); int effLength=receivePacket.getLength(); repac=new byte[effLength]; for (int i = 0; i < effLength; i++) { re = re + to16(repacs[i]); } re = re + "]"; } }catch (Exception e) { // TODO: handle exception } socket.close(); re=re.substring(0, re.length()-1); System.out.println("result--->" + re ); return re.toString(); } catch (Exception e) { // TODO: handle exception } socket.close();
相关推荐
这个“Android UDP通讯工具”可能是一个应用程序,允许开发者或者用户通过UDP进行网络通信,例如实现语音聊天、多人在线游戏或者其他需要快速数据交换的场景。 UDP通讯工具的核心原理主要包括以下几个部分: 1. **...
Android开发的Udp实时消费机服务端源码,展示了Android环境下Udp通讯编程,包括Sock的端口监听、数据包发送、Android UI布局等。详细介绍:https://blog.csdn.net/zhangjin7422/article/details/116708207
在Android平台上进行网络通信时,UDP(User Datagram Protocol)socket是一种常用的方式,它提供了一种无连接、不可靠但高效的数据传输服务。本演示DEMO将深入解析如何在Android应用中实现UDP socket通信,帮助...
实现了两台Android设备在同一局域网内通过UDP进行实时的聊天通信。实测支持颜文字,emoji。 操作简单,输入需要连接的对方的ip地址,即可马上通讯。 --------------------- 作者:Alan_Mo 来源:CSDN 原文:...
在Android和Java应用之间进行UDP通讯,需要分别在客户端(Android)和服务器端(Java)实现发送和接收数据的逻辑。 #### 客户端(Android) 1. **创建DatagramSocket**:在Android应用中,首先需要在合适的线程...
在Android平台上进行UDP通信是移动应用开发中常见的一种网络编程任务。UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输层协议,适用于需要快速发送小数据包且对数据完整性和顺序不敏感的...
在Android开发中,UDP(User Datagram Protocol)广播是一种常见的通信方式,它允许设备在同一网络内...通过实践和理解这些知识点,开发者可以创建出能够利用UDP广播功能的应用,例如局域网内的即时通讯、设备发现等。
1 使用工具eclipse开发的Android udp通讯应用的源码,可以使用udp协议发送和接收数据 2 为了测试udp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试的,放心下载!
android Udp多播通讯.实现局域网内通过udp多播进行数据交互.
本文将深入探讨如何利用UDP(User Datagram Protocol)和蓝牙技术实现局域网内的Android设备发现与连接通信。 首先,让我们了解一下UDP发现。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,但因其低延迟和...
简单的Android Socket ...客户端通过UDP广播获取到服务器端的IP地址,通过TCP/IP协议与服务器建立连接。代码实现心跳检测,当服务器断网或是结束进程,客户端可重新连接(重连部分自己实现);代码有点凌乱,仅供参考!
- 实时聊天应用:UDP可以用于构建简单的即时通讯应用,因为延迟比可靠性更重要。 - 文件传输:虽然不保证所有数据都能到达,但在大文件传输中,偶尔丢失一两个数据包可能不会影响整体效果。 - 游戏网络同步:实时...
在Android平台上,UDP(User Datagram Protocol)是一种无连接的、不可靠的数据传输协议,常用于实时数据通信或者对网络延迟敏感的应用,如在线游戏、视频会议等。与TCP(Transmission Control Protocol)不同,UDP...
压缩包中的两个文件"VC代码:udp通信:PC机成功发送接收android端信息.rar"和"AndroidUdp1.3成功发送接收PC端数据.rar"分别包含了PC端和Android端的UDP通信示例代码。PC端通常使用C++或Java实现,而Android端则是...
基于AS3.0 Aodbe Air开发的 UDP通讯。Flash源文件。 可以发布桌面应用,android手机端和IOS
1 使用工具eclipse开发,Android平台,tcp和udp通讯应用源码,可以使用udp或tcp协议发送和接收数据 2 为了测试udp或tcp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试...
**UDP通讯** UDP是一种无状态的协议,它不建立连接,每个数据包都是独立发送的,没有确认机制,因此速度快但可能会丢失数据。在Android中,我们通常使用`DatagramSocket`和`DatagramPacket`来实现UDP通信。客户端...
本项目是一个测试安卓和电脑UDP通讯的例子源码,项目自带一个winform的客户端,运行之前需要做两件事,第一件事是必须知道电脑的ip地址,如果是内网可以用cmd的ipconfig命令看一下电脑的ipv4地址,如果是模拟器的话...
总的来说,理解并掌握Android环境下的TCP和UDP通信是移动开发中的重要技能,这有助于实现各种网络功能,如即时通讯、文件传输等。通过`TCPUtil`这样的工具类,开发者可以更方便地进行网络编程,提高代码的复用性和可...
基于udp协议的android 通信 1 将两台手机连上同一个wifi 2 分别将两个应用装到两台手机上,启动 3 将server界面上显示的ip地址输入到sender界面的editText内 4 在sender的输入框内输入文字,点击发送 5 server会...