博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Androidの网络通信之TDP
阅读量:7229 次
发布时间:2019-06-29

本文共 3533 字,大约阅读时间需要 11 分钟。

我们知道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必须处于同一个局域网。。。

 

转载地址:http://mrbfm.baihongyu.com/

你可能感兴趣的文章
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>
Python(生成执行文件)
查看>>
redis安装配置 - ttlsa教程系列之redis
查看>>
Linux --DHCP服务器配置;DHCP服务器中继
查看>>
IE版本多的可爱_已迁移
查看>>
eclipse查看jar包中class的中文注释乱码问题的解决
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
mariadb安装
查看>>
vue+vuex+axios+echarts画一个动态更新的中国地图
查看>>
5.8 volumetric post-processing--game programming gems5 笔记
查看>>
8086的地址空间
查看>>
Android开发动画效果被遮掉的解决方法
查看>>
Apache2.2.17源码编译安装以及配置虚拟主机
查看>>
2017年开发语言排名
查看>>
读二进制表的显示 Binary Watch
查看>>
我的友情链接
查看>>
linux基础:10、基础命令(4)
查看>>
linux中强大的screen命令
查看>>