JAVA--网络编程(UDP)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA--网络编程(UDP)相关的知识,希望对你有一定的参考价值。

上午给大家简单介绍了一下TCP网络通信的知识,现在就为大家补充完整网络编程的知识,关于UDP的通信知识。

  UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

  这种文字性的描述,我就不再赘述,相关方面的文字介绍百度上多的很,我就直接给大家介绍代码了。

一、基于UDP网络编程代码:

  服务器端

技术分享
public class TestUDPServer {

    /**服务器端代码
     * @param args
     * 对于UDP和TCP的端口号,首先我们可以任意设置,但必须保证范围在65536以内
     * UDP和TCP的端口号没有关联,也就是说,UDP和TCP各有65536个端口
     */
    public static void main(String[] args) throws Exception{
        byte [] buf = new byte[1024];//设置存放数据的字符数组
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        DatagramSocket ds = new DatagramSocket(5888);//设置端口号
        while(true){
            ds.receive(dp);//接收客户端发过来的请求数据
            System.out.println(new String(buf, 0, dp.getLength()));
            //new String(buf, 0, dp.getLength()):String的构造方法,把一个字节数组转化为一个String类数据
        }
    }
}
技术分享

  客户端

技术分享
public class TestUDPClient {

    /**客户端代码实例
     * @param args
     * SocketAddress:网络上的地址,不但包括IP,还包括端口号等等
     * InetAddress:IP地址的超级
     * InetSocketAddress:IP地址+端口号
     */
    public static void main(String[] args) throws Exception{
        byte [] buf = new byte[1024];
        buf = (new String("Hello")).getBytes();//将String类型的数据转换为字符数组
        DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1",5888));
        DatagramSocket ds = new DatagramSocket(9999);//设置客户端发送数据的端口号
        ds.send(dp);//向服务器发送数据
        ds.close();
    }
}
技术分享

关于代码的细节讲解,我已经在其中进行注释,大家如果需要学习,可以直接拷贝,以上代码均是完整的,可以直接运行。

二、基于UDP的数据传输:

  服务器端

技术分享
public class TestUDPServer1 {

    public static void main(String[] args) throws Exception{
        byte [] buf = new byte[1024];//设置存放数据的字符数组
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        DatagramSocket ds = new DatagramSocket(5888);//设置端口号
        while(true){
            ds.receive(dp);//接收客户端发过来的请求数据
            ByteArrayInputStream bais = new ByteArrayInputStream(buf);
            DataInputStream dis = new DataInputStream(bais);
            System.out.println(dis.readLong());
        }
    }
}
技术分享

  客户端

技术分享
public class TestUDPClient1 {

    public static void main(String[] args) throws Exception{
        Long L = 10000L;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);//DataOutputStream:可以直接写一个Long类型的数据
        dos.writeLong(L);
        byte [] buf = baos.toByteArray();
        DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1",5888));
        DatagramSocket ds = new DatagramSocket(9999);//设置客户端发送数据的端口号
        ds.send(dp);//向服务器发送数据
        ds.close();
    }
}
技术分享

  你一定有这样一个疑问,这有什么用处呢?好吧,我简单给你介绍一下,关于这种Long类型数据的传输在网络游戏中用处极多,为什么这么说呢?比如你在极品飞车中,系统要把你实时的在3维空间中的位置信息发送到别的玩家系统中,因为游戏要求传输速度必须快,所以基于UDP的数据传输在游戏开发过程中用处最多。

  以上只是一些基本的UDP编程代码,只为给大家简单介绍,让大家有一点的了解。

以上是关于JAVA--网络编程(UDP)的主要内容,如果未能解决你的问题,请参考以下文章

java 25 - 4 网络编程之 UDP协议传输的代码优化

java网络原理《狂神说》实现UDP双方通信(含代码)

java网络编程TCP/UDP笔记

java 网络编程----UDP基础级的示例

Java UDP 编程

JAVA网络编程知识学习