Android UDP通信的简单实例和用法归纳,以及与TCP对比、常见问题
2017-04-19 10:34
399 查看
UDP的数据发送是按照包来发送的。也就是说,你要先把你的数据包装成一个DatagramPacket,然后发送出去。
UDP的开销小,因此用于短连接会非常方便。但缺点就是丢包,(可以辅助以一个TCP协议加以维持丢包重发)。
下面是实例代码,其实无论客户端或服务端都是差不多的,毕竟UDP更偏向于单向发送。
Android客户端:(需要注意的是安卓端需要开启相关的权限,你可以在文末附上的那篇文章里找到相关的解决方法)
PC上的服务器:
我们可以总结这个步骤流程:
1.创建一个DatagramSocket实例:
作为接收方,你必须指定这个监听的端口。
2.1发送步骤
打包数据并发送,需要知道接收方的IP和它所监听的端口:
3.关闭Socket
socket.close();
相比起TCP,UDP实现起来逻辑更简单(收发方逻辑几乎是相同的),开销也更小,在一般通讯时,主要利用UDP来发送消息是个不错的选择;不过我们还需要一点辅助手段来处理UDP丢包的问题。
可以到这里查看关于TCP的实现,并进行对比:
常见问题等也见下面这篇文章的最后一段:
>Android
TCP通信的简单实例以及常见问题[超时/主线程阻塞]<
UDP的开销小,因此用于短连接会非常方便。但缺点就是丢包,(可以辅助以一个TCP协议加以维持丢包重发)。
下面是实例代码,其实无论客户端或服务端都是差不多的,毕竟UDP更偏向于单向发送。
Android客户端:(需要注意的是安卓端需要开启相关的权限,你可以在文末附上的那篇文章里找到相关的解决方法)
import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et=(EditText)findViewById(R.id.et); bt=(Button)findViewById(R.id.btn); bt2=(Button)findViewById(R.id.btn2); System.out.println("启动"); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(sendMyMessage).start();//新线程,防止堵塞主线程 } }); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try{ socket.close(); finish(); } catch (Exception e){ e.printStackTrace(); } finally { finish(); } } }); } private DatagramSocket socket; private DatagramPacket packet; private final String IP="192.168.1.103"; private final int ServerPORT=12345; private final int ClientPORT=1234; private EditText et; private Button bt; private Button bt2; Runnable sendMyMessage=new Runnable() { @Override public void run() { try{ socket = new DatagramSocket(ClientPORT);//本地发送窗口 //InetAddress serverIP=InetAddress.getByName(IP); byte[] buf = "yes.".getBytes();//将你的数据转化为byte packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP),ServerPORT);//数据打包,服务器地址和接收窗口 socket.send(packet);/发送消息 /*接受服务器回传消息 packet = new DatagramPacket(buf,buf.length); socket.receive(packet);*/ socket.close();//发送完就可以关闭了,防止端口占用 }catch (Exception e){ e.printStackTrace(); } } }; }
PC上的服务器:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPTarget { public static void main(String[] args){ DatagramSocket socket; DatagramPacket packet; byte[] buf = new byte[1024]; try { socket = new DatagramSocket(12345);//注意这个12345是ServerPORT,也就是服务器监听的端口 packet = new DatagramPacket(buf, buf.length); while(true){ socket.receive(packet);//接受数据包 System.out.println(packet.getAddress().getHostAddress()+":"+packet.getPort());//获取客户端的IP和端口 System.out.println(new String(packet.getData(), 0, packet.getLength())); } //socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }测试结果如下:
我们可以总结这个步骤流程:
1.创建一个DatagramSocket实例:
DatagramSocket socket=new DatagramSocket();作为发送方,如果只是单纯的发送,你完全可以不指定这个Socket的监听端口,因为你根本不打算收到回传消息。
作为接收方,你必须指定这个监听的端口。
2.1发送步骤
打包数据并发送,需要知道接收方的IP和它所监听的端口:
byte[] buf = "yes.".getBytes();//这是数据 packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP),ServerPORT);//数据打包,并发往服务器地址和接收窗口 socket.send(packet);//发送2.2接收步骤
socket = new DatagramSocket(ServerPORT);//监听端口 packet = new DatagramPacket(buf, buf.length); socket.receive(packet);//接收 System.out.println(new String(packet.getData(), 0, packet.getLength()));//拆包
3.关闭Socket
socket.close();
相比起TCP,UDP实现起来逻辑更简单(收发方逻辑几乎是相同的),开销也更小,在一般通讯时,主要利用UDP来发送消息是个不错的选择;不过我们还需要一点辅助手段来处理UDP丢包的问题。
可以到这里查看关于TCP的实现,并进行对比:
常见问题等也见下面这篇文章的最后一段:
>Android
TCP通信的简单实例以及常见问题[超时/主线程阻塞]<
相关文章推荐
- Android TCP通信的简单实例以及常见问题[超时/主线程阻塞]
- Android学习历程15-SurfaceView的简单用法(实例:幸运抽奖以及控制中奖物品)
- 【网络】常见通信协议HTTP、TCP、UDP的简单介绍
- 常见通信协议HTTP、TCP、UDP的简单介绍
- 基于Tcp&UDP协议的简单Socket通信实例(JAVA)
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)(解决不可连的问题,解决方案在最后面)
- Linux网络通信实例(TCP和UDP)
- [ v1.3 基本搞定 ] Delphi UDP + TCP 通信问题
- 一个简单UDP通信程序的问题
- Android 简单动画的制作以及遇到的问题
- Android 开发之系统应用Launcher详解,简单添加和删除快捷方式及常见问题
- android 开发之socket编程 UDP和TCP通信实现
- TCP、UDP通信 Big或Little Edian字节顺序(大小端)问题的解决
- PC与Android模拟器UDP/TCP 通信的端口问题
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- C++ 简单封装socket类包含TCP和UDP基本通信能力
- linux简单的TCP与UDP的socket程序以及机器大小端的判断程序
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 编译Android源码时常见问题以及解决方法
- PC与Android模拟器UDP/TCP 通信的端口问题