Socket通信学习实例四之UDP通信

25 篇文章 0 订阅
10 篇文章 0 订阅

Socket通信学习系列
Socket网络编程学习基础
Socket通信学习实例一之TCP通信
Socket通信学习实例二之即时通信
Socket通信学习实例三之断点上传
Socket通信学习实例四之UDP通信
Socket通信学习实例五之模拟Http

本篇文章介绍下基于UDP协议的Socket通信

这里写图片描述

这里写图片描述

Java中的UDP网络通信用到的类

DatagramSocket
DatagramSocket有如下构造方法:

  • DatagramSocket()
    构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  • DatagramSocket(int port)
    创建数据报套接字并将其绑定到本地主机上的指定端口。
  • DatagramSocket(int port, InetAddress laddr)
    创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.
    如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.

发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.

发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.

DatagramPacket
DatagramPacket类有如下构造方法:

  • DatagramPacket(byte[] buf, int length)
    构造 DatagramPacket,用来接收长度为length的数据包。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。

接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.

InetAddress
Java中对IP地址进行包装的类,
DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.

基本实现流程

服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。
客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName(”172.168.1.120”)).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。*(Stringstr=”hello”;bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

代码分析

服务端代码

public SocketUDPTest() throws IOException {

        /*
         * 接收客户端发送的数据
         */

        //创建一个DatagramSocket对象,并指定监听端口
        DatagramSocket socket = new DatagramSocket(SocketTool.PORT);
        //创建一个byte类型的数组,用于存放接收到得数据
        byte[] data = new byte[1024];
        //创建数据报,用于接收客户端发送的数据
        DatagramPacket packet = new DatagramPacket(data, data.length);
        System.out.println("1.服务端 " + SocketTool.getIP() + " 已经启动,等待客户端发送数据");
        //接收客户端发送的数据,此方法在接收到数据报之前会一直阻塞
        socket.receive(packet);
        //读取客户端发送的数据
        //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长
        String result = new String(data, 0, packet.getLength());
        System.out.println("2.服务端收到客户端发送的消息:" + result);

        /*
         * 向客户端响应数据
         */

        //从数据报中获取客户端的地址、端口号
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        //创建要包含到数据报中的信息
        byte[] data2 = "Hello World!".getBytes();
        //创建数据报,包含响应的数据信息
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
        //响应客户端
        socket.send(packet2);
        //关闭Socket
        socket.close();
    }

客户端代码

private void sendUDPSocket() throws IOException {

        /*
         * 向服务器端发送数据
         */

        //定义服务器的地址、端口号
        InetAddress address = InetAddress.getByName(SocketTool.HOST);
        int port = SocketTool.PORT;
        //创建要包含到数据报中的信息
        byte[] sendData = "Hello Socket From UDP!".getBytes();
        //创建数据报,包含要发送的数据信息
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
        //创建DatagramSocket对象
        DatagramSocket socket = new DatagramSocket();
        //向服务器端发送数据报
        socket.send(sendPacket);

        /*
         * 接收服务器端响应的数据
         */

        //创建一个byte类型的数组,用于存放接收到得数据
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        //接收服务端响应的数据,此方法在接收到数据报之前会一直阻塞
        socket.receive(receivePacket);
        //读取服务端响应的数据
        String result = new String(receiveData, 0, receivePacket.getLength());
        Log.i(TAG, "3.客户端收到服务端响应的消息:" + result);
        //关闭Socket
        socket.close();
    }

由于比较简单,直接看注释就可以,界面部分参考demo,这里不详细分析了

完整示例:
SocketSamples

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值