Androidの网络通信之TDP
我们知道TCP协议是面向连接的,是可靠的一种传输协议。但是今天我们讲的是UDP,这是一种不可靠的传输,只负责发送数据包不保证接收方是否安全收到,也没有数据流。
这两种都算是底层传输层的协议。
但是和TCP相比虽然不够安全不够可靠,但是拥有速度上优势,TCP需要经过诸多的头部检验校准排序,而UDP则不用。
打个不恰当的比喻,UDP就像发短信TCP就像打电话,TCP需要三次握手就才能建立链接。
两个人要接通电话,打的人和接的人要都有信号都没停机都没关机才能相同,而且接收方忙的话,你还要听一段铃声才能等到接收方的声音。
而发短信就不用了,比如你想告诉你女朋友,直接发短信给她,无论她在上班还是在干嘛还是在干嘛,发完你就可以干你自己的事了。而你要打电话告诉她则需要等待她找到手机按下接听键才能相互通话。
先介绍两个UDP相关的类
DatagramSocket 这个是UDP套接字,一般服务器端可以绑定一个本机端口,而客户端发送方则不需要。
DatagramPacket 这个是数据报包,服务器端直接按缓存读,客户端则需要指定Ip地址和端口
这次我们做个android手机端跟PC端通信
PC端:
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpRecv { public static void main(String[] args) throws Exception{ //绑定本机断开 DatagramSocket ds = new DatagramSocket(8080); byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //接收数据包 ds.receive(dp); //取出数据报内容 String str = new String(dp.getData(),0,dp.getLength()); System.out.println(str); //打印发送方的地址 System.out.println("ip:"+dp.getAddress().getHostAddress()+"port:"+dp.getPort()); ds.close(); } }
手机端:
package com.bvin.test.udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import android.app.Activity; import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; public class MainActivity extends Activity { /** Called when the activity is first created. */ EditText et ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); et = new EditText(this); setContentView(et); WifiManager wMan = (WifiManager)getSystemService(Context.WIFI_SERVICE); if(!wMan.isWifiEnabled()){ wMan.setWifiEnabled(true); } WifiInfo wifiInfo = wMan.getConnectionInfo(); Log.e("ip", intToIp(wifiInfo.getIpAddress()));//本机ip(仅wifi环境) } //把获取的整形转换成字符型 private String intToIp(int i) { return (i & 0xFF ) + "." + ((i >> 8 ) & 0xFF) + "." + ((i >> 16 ) & 0xFF) + "." + ( i >> 24 & 0xFF) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub menu.add("发送"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub if(item.getItemId()==0){ DatagramSocket ds; try { //套接字 ds = new DatagramSocket(); //发送内容 String str = et.getText().toString(); //构建数据报(内容+地址) DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.102"),8080); //把数据报发送出去 ds.send(dp); //关闭套接字 ds.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return super.onOptionsItemSelected(item); } }
首先运行PC接收端,在接收到发送方数据之前将会一直阻塞。而手机端会有个输入框,有个发送菜单,将会把输入框的内容给发送到PC端,虽然UDP不算可靠,但是在局域网还是挺可靠。
tip:手机和PC必须处于同一个局域网。。。