android >UDP 通讯
16lz
2021-01-23
首先是发送
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;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stub return null;} @Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.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 exceptionsocket.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 使用内容解析者往短信数据库里插入一条数据
- Android Handler不同界面发送数据
- Android之SharedPreferences轻量数据存储
- android中数据存储的contentprovider的使用方法
- android 模拟器获取root权限的方法
- android 利用Gson生成json数据
- Android中json操作数据的使用
- Android 模拟器检测记录
- Android 数据存储与读取:文件