八、基于UDP协议的Socket编程

概述

基于TCP的网络通信是安全的,是双向的,如同拨打10086电话,需要先有服务端,建立双向连接后,才开始数据通信,而UDP的网络通信就不一样了,只需要指明对方地址,然后将数据送出去,并不会实现连接。这样的网络通信时不安全的,所以只应用在聊天系统、咨询系统等场合下。

1、数据报

数据报式表示通信的一种报文类型,使用数据报进行通信时无需事先建立连接,它是基于UDP协议进行的。
java中有两个可使用数据报实现通信的类:即DatagramPacket与DatagramSocket。
DatagramPacket类起到数据容器的作用,DatagramSocket类用于发送和接受DatagramPacket。DatagramPacket类不提供发送或接受数据的方法,而DatagramSocket类提供send()和receive()方法,用于通过套接字发送和接受数据报。

2、TCP协议与UDK协议的区别:

八、基于UDP协议的Socket编程_第1张图片
image

3、基于UDP协议的Socket网络编程步骤

利用UDP通信的两个端点是平等的,也就是说通信的两个程序关系是对等的,没有主次之分,甚至它们的代码都可以完全一样,这一点要与基于TCP的Socket编程区分开来。


八、基于UDP协议的Socket编程_第2张图片
image

用生活中的寄快递例子来类比这个:

礼物——数据(字符串)

包裹——DatagramPacket

快递点——DatagramSocket

寄礼物——send()

收礼物——receive()

实例

客户端:

public class LoginClient {
    public static void main(String[] args) {
        String info = "心形巧克力";
        byte[] infos = info.getBytes();
        //对方地址和邮编
        InetAddress is;
        //快递点
        DatagramSocket socket = null;
        try {
            is = InetAddress.getByName("localhost");
            //包裹包装礼物
            DatagramPacket dp = new DatagramPacket(infos, info.length(), is, 5000);
            socket = new DatagramSocket();
            //通过快递点向外寄出礼物
            socket.send(dp);
            
            byte[] replys = new byte[20];
            DatagramPacket dp1 = new DatagramPacket(replys, replys.length);
            socket.receive(dp1);
            String reply = new String(dp1.getData(), 0, dp1.getData().length);
            System.out.println("服务器说:" + reply);
            
            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            socket.close();
        }
        
    }

}

服务器:

public class LoginServer {
    public static void main(String[] args) {
        // 准备了一个空包
        byte[] infos = new byte[20];
        DatagramPacket dp = new DatagramPacket(infos, infos.length);
        // 快递点
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(5000);
            //我在快递点取礼物
            socket.receive(dp);
            //拆礼物
            String info = new String(dp.getData(), 0, dp.getData().length);
            System.out.println("客户端说:" + info);
            
            //给客户端一个响应
            String reply = "一件羽绒服";
            byte[] replys = reply.getBytes();
            //客户端的地址
            SocketAddress sa = dp.getSocketAddress();
            //打一个包裹
            DatagramPacket dp1 = new DatagramPacket(replys, 0, reply.length(), sa);
            socket.send(dp1);
            
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }

    }

}

运行结果:

客户端说心形巧克力

注:这一段代码能模仿着上面敲出来就行了。

你可能感兴趣的:(八、基于UDP协议的Socket编程)