`

android >UDP 通讯

 
阅读更多

首先是发送 

 

 

 

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通讯工具

    这个“Android UDP通讯工具”可能是一个应用程序,允许开发者或者用户通过UDP进行网络通信,例如实现语音聊天、多人在线游戏或者其他需要快速数据交换的场景。 UDP通讯工具的核心原理主要包括以下几个部分: 1. **...

    Android Udp通讯源码

    Android开发的Udp实时消费机服务端源码,展示了Android环境下Udp通讯编程,包括Sock的端口监听、数据包发送、Android UI布局等。详细介绍:https://blog.csdn.net/zhangjin7422/article/details/116708207

    android UDP socket通讯,演示demo

    在Android平台上进行网络通信时,UDP(User Datagram Protocol)socket是一种常用的方式,它提供了一种无连接、不可靠但高效的数据传输服务。本演示DEMO将深入解析如何在Android应用中实现UDP socket通信,帮助...

    udp聊天通信

    实现了两台Android设备在同一局域网内通过UDP进行实时的聊天通信。实测支持颜文字,emoji。 操作简单,输入需要连接的对方的ip地址,即可马上通讯。 --------------------- 作者:Alan_Mo 来源:CSDN 原文:...

    android和java用UDP通讯 解决android不能接受后端数据的bug

    在Android和Java应用之间进行UDP通讯,需要分别在客户端(Android)和服务器端(Java)实现发送和接收数据的逻辑。 #### 客户端(Android) 1. **创建DatagramSocket**:在Android应用中,首先需要在合适的线程...

    android udp通讯

    在Android平台上进行UDP通信是移动应用开发中常见的一种网络编程任务。UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输层协议,适用于需要快速发送小数据包且对数据完整性和顺序不敏感的...

    Android UDP broadcast Example

    在Android开发中,UDP(User Datagram Protocol)广播是一种常见的通信方式,它允许设备在同一网络内...通过实践和理解这些知识点,开发者可以创建出能够利用UDP广播功能的应用,例如局域网内的即时通讯、设备发现等。

    基于Android平台的udp通讯apk源码及windows测试工具

    1 使用工具eclipse开发的Android udp通讯应用的源码,可以使用udp协议发送和接收数据 2 为了测试udp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试的,放心下载!

    android-udp.zip_Android 多播_android_android udp_android udp_udp

    android Udp多播通讯.实现局域网内通过udp多播进行数据交互.

    局域网android设备发现功能,包括udp发现和蓝牙发现,可进行连接通信

    本文将深入探讨如何利用UDP(User Datagram Protocol)和蓝牙技术实现局域网内的Android设备发现与连接通信。 首先,让我们了解一下UDP发现。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,但因其低延迟和...

    Android socket局域网的UDP广播自动连接及TCP/ip通讯与心跳检测

    简单的Android Socket ...客户端通过UDP广播获取到服务器端的IP地址,通过TCP/IP协议与服务器建立连接。代码实现心跳检测,当服务器断网或是结束进程,客户端可重新连接(重连部分自己实现);代码有点凌乱,仅供参考!

    android udp

    - 实时聊天应用:UDP可以用于构建简单的即时通讯应用,因为延迟比可靠性更重要。 - 文件传输:虽然不保证所有数据都能到达,但在大文件传输中,偶尔丢失一两个数据包可能不会影响整体效果。 - 游戏网络同步:实时...

    android udp socket通讯

    在Android平台上,UDP(User Datagram Protocol)是一种无连接的、不可靠的数据传输协议,常用于实时数据通信或者对网络延迟敏感的应用,如在线游戏、视频会议等。与TCP(Transmission Control Protocol)不同,UDP...

    android udp通信 简单例程

    压缩包中的两个文件"VC代码:udp通信:PC机成功发送接收android端信息.rar"和"AndroidUdp1.3成功发送接收PC端数据.rar"分别包含了PC端和Android端的UDP通信示例代码。PC端通常使用C++或Java实现,而Android端则是...

    Flash UDP 通讯 连接 Air Android

    基于AS3.0 Aodbe Air开发的 UDP通讯。Flash源文件。 可以发布桌面应用,android手机端和IOS

    TCP-UDP通讯Android应用源码及windows测试工具.rar

    1 使用工具eclipse开发,Android平台,tcp和udp通讯应用源码,可以使用udp或tcp协议发送和接收数据 2 为了测试udp或tcp的接收和发送,提供了一个windows平台的测试工具,用于跟Android应用互通数据 源码是经过测试...

    android UDP/TCP混用

    **UDP通讯** UDP是一种无状态的协议,它不建立连接,每个数据包都是独立发送的,没有确认机制,因此速度快但可能会丢失数据。在Android中,我们通常使用`DatagramSocket`和`DatagramPacket`来实现UDP通信。客户端...

    Android例子源码简单实现手机与电脑的UDP通讯.zip

    本项目是一个测试安卓和电脑UDP通讯的例子源码,项目自带一个winform的客户端,运行之前需要做两件事,第一件事是必须知道电脑的ip地址,如果是内网可以用cmd的ipconfig命令看一下电脑的ipv4地址,如果是模拟器的话...

    Android TCP/UDP Demo

    总的来说,理解并掌握Android环境下的TCP和UDP通信是移动开发中的重要技能,这有助于实现各种网络功能,如即时通讯、文件传输等。通过`TCPUtil`这样的工具类,开发者可以更方便地进行网络编程,提高代码的复用性和可...

    android UDP通讯

    基于udp协议的android 通信 1 将两台手机连上同一个wifi 2 分别将两个应用装到两台手机上,启动 3 将server界面上显示的ip地址输入到sender界面的editText内 4 在sender的输入框内输入文字,点击发送 5 server会...

Global site tag (gtag.js) - Google Analytics