首先是发送
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 socket通讯,连个画面画面与操作同步,演示demo
一个简单的Android UDP通讯工具
android eclipse udp通讯 实例 主线程不可以有网络通讯
Android开发的Udp实时消费机服务端源码,展示了Android环境下Udp通讯编程,包括Sock的端口监听、数据包发送、Android UI布局等。详细介绍:https://blog.csdn.net/zhangjin7422/article/details/116708207
实现了两台Android设备在同一局域网内通过UDP进行实时的聊天通信。实测支持颜文字,emoji。 操作简单,输入需要连接的对方的ip地址,即可马上通讯。 --------------------- 作者:Alan_Mo 来源:CSDN 原文:...
1 使用工具eclipse开发的Android udp通讯应用的源码,可以使用udp协议发送和接收数据 2 为了测试udp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试的,放心下载!
android和java用UDP通讯 解决android不能接受后端数据的bug 把ip和端口改成自己的就行文件包括android 和 服务端
android Udp多播通讯.实现局域网内通过udp多播进行数据交互.
Android Socket UDP通讯,发送端和接收端 手机对手机或者手机对PC端, 两种通讯方式:点对点,或者广播通讯
简单的Android Socket ...客户端通过UDP广播获取到服务器端的IP地址,通过TCP/IP协议与服务器建立连接。代码实现心跳检测,当服务器断网或是结束进程,客户端可重新连接(重连部分自己实现);代码有点凌乱,仅供参考!
基于AS3.0 Aodbe Air开发的 UDP通讯。Flash源文件。 可以发布桌面应用,android手机端和IOS
1 使用工具eclipse开发,Android平台,tcp和udp通讯应用源码,可以使用udp或tcp协议发送和接收数据 2 为了测试udp或tcp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试...
能够进行UDP简单的通讯,具体用处希望各位自己进行扩展。
局域网android设备发现功能,包括udp发现和蓝牙发现,可进行连接通信 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
本项目是一个测试安卓和电脑UDP通讯的例子源码,项目自带一个winform的客户端,运行之前需要做两件事,第一件事是必须知道电脑的ip地址,如果是内网可以用cmd的ipconfig命令看一下电脑的ipv4地址,如果是模拟器的话...
基于udp协议的android 通信 1 将两台手机连上同一个wifi 2 分别将两个应用装到两台手机上,启动 3 将server界面上显示的ip地址输入到sender界面的editText内 4 在sender的输入框内输入文字,点击发送 5 server会...
udp 客户端 服务端通讯,中间嵌套 tcp 的通讯
android之同一wifi下两台设备通过UDP进行通讯android之同一wifi下两台设备通过UDP进行通讯android之同一wifi下两台设备通过UDP进行通讯android之同一wifi下两台设备通过UDP进行通讯
Android UDP通信之Handler、Activity、UI更新
本项目是一个测试安卓和电脑UDP通讯的例子源码,项目自带一个winform的客户端,运行之前需要做两件事,第一件事是必须知道电脑的ip地址,如果是内网可以用cmd的ipconfig命令看一下电脑的ipv4地址,如果是模拟器的话...