JAVA基础--UDP编程

今天学习到的是关于Java编程基础的UDP编程,其实我们可以看到目前很多招聘的要求都会写上这么一句.熟悉了解UDP/TCP编程.那么UDP/TCP编程到底是什么呢?我们今天将会开展一段体验UDP的旅程.
如果大家没听过UDP,那么相信大家对计算机网络这一块的了解估计也没有多少.那么我要先给大家讲解一下关于计算机网络的基本概念
首先网络编程三要素:

  1. IP地址.我们只要理解为是个人电脑的地址区分.IP地址是由32位二进制组成的,被切分为4份,每一份为8位,所以基本上我们日常看到的都是0~255就是这么一个原因.
    IP地址分类:
    A类:网络号+3个主机号 可以容纳2^24个IP地址,一般是政府单位使用
    B类:2个网络号+3个主机 可以容纳2^16个IP地址,一般是企业单位使用
    C类:3个网络号+主机号 可以容纳2^8个IP地址,一般是私人单位使用
    D类:好吧,其实D类是从C类分离出来的…
    查看本机IP:ipconfig
    那么有个问题,你觉得你什么时候会查不到本机的IP地址呢?
    答案:没有网卡的时候…

  2. 编号(端口):用于标识进程的逻辑地址,通过端口找到指定进程。其实就是我们所要监听的目标应用.有效值为0~65535;1-1024是系统使用或者保留端口,我们一般使用后面的,没错8090 8080这种是我们经常默认使用的.

  3. 协议 :定义通信规则,符合协议则可以通信,不符合不能通信。这个可以理解为我们互相于

IP类API:
InetAddress(IP类)

常用的方法:
getLocalHost(); 获取本机的IP地址
getByName(“IP或者主机名”) 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象。 (用于获取别人的IP地址对象)

getHostAddress()  返回一个IP地址的字符串表示形式。
getHostName()  返回计算机的主机名。

UDP协议提供的服务不同于TCP协议的端到端服务,它是面向非连接的,属不可靠协议,UDP套接字在使用前不需要进行连接。实际上,UDP协议只实现了两个功能:

1)在IP协议的基础上添加了端口;

2)对传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。

JavaAPI:
DatagramPacket类:包装需要发送或者接收到的数据;
DatagramSocket类:send()方法和receive()方法来发送和接收数据;

特点:
1. 将数据极封装为数据包,面向无连接。
2. 每个数据包大小限制在64K中
3.因为无连接,所以不可靠
4. 因为不需要建立连接,所以速度快
5.udp 通讯是不分服务端与客户端的,只分发送端与接收端。

发送端的使用步骤:
1. 建立udp的服务。
2. 准备数据,把数据封装到数据包中发送。 发送端的数据包要带上ip地址与端口号。
3. 调用udp的服务,发送数据。
4. 关闭资源。

发送端:

 package udp;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.SocketException;

    public class ChatSender {

        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
           try {
            //获取到发送服务
          DatagramSocket datagramSocket = new DatagramSocket();
            //准备数据
          BufferedReader reader = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
            String line=null;
            DatagramPacket packet=null;
            while((line=reader.readLine())!=null){
                //数据封装到包中
                packet= new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("10.12.70.150"),9090);
                datagramSocket.send(packet);

            }
             datagramSocket.close();

           } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }

    }

接收端的使用步骤
1. 建立udp的服务
2. 准备空 的数据 包接收数据。
3. 调用udp的服务接收数据。
4. 关闭资源

    package udp;

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.Socket;
    import java.net.SocketException;

    public class ChatReceive {

        /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {

            //建立服务
            DatagramSocket socket = new DatagramSocket(9090);
            //准备一个空包,定义包的初始化,然后将从socket接受的包赋值过来
            byte[] buf=new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf,buf.length);
            socket.receive(packet);
            //发送端的地址
            String hostAddress = packet.getAddress().getHostAddress();
            String say = new String(buf,0,packet.getLength());
            System.out.println(hostAddress+"说:"+say);
            socket.close();
        }

    }

知识点补充:
1. 对于广播,其实我们可以在发送端使用”网络号.255”来处理,让具有这个一个接收端的在同一个网络号的机子都能收到,就是我们日常所谓的广播啦.
2. receive();方法是一个堵塞型方法,就是说这方法一直会等待信息的到来,假若信息不来了,他就一直堵塞,会容易引起问题,所以一般我们会使用DatagramSocket类的setSoTimeout()方法来制定receive()方法的最长阻塞时间,并指定重发数据报的次数.对该问题进行优化

有一个问题是笔者在这次实验中的一个问题,我在Eclipse打印台输出的数据貌似都是乱码,无论是我改了UTF-8还是GBK都貌似没结果..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值