首页 > 编程笔记 > Java笔记 阅读:13

JAVA Socket实现UDP编程(非常详细,附带实例)

在网络编程中,套接字(Socket)为网络上两台计算机之间的通信提供了一种机制。

两台计算机之间的通信通过套接字创建一条通信信道,程序员使用这条通信信道在两台计算机之间发送数据。在客户机/服务器工作模式下,将端口号与 IP 地址的组合称为网络套接字。

Java 中的套接字分为 TCP 套接字(由 Socket 类实现)和 UDP 套接字(由 DatagramSocket 类实现)两种形式。在客户机/服务器工作模式下,每个 Socket 可以进行读和写两种操作。本节重点讲解 UDP 套接字。

Socket 通信模型如下图所示:

图 1 Socket通信模型

由图 1 可知,Socket 通信分为 4 个步骤:

Java DatagramSocket类

java.net 包中的 DatagramSocket 类用于发送和接收数据报的套接字,即 UDP Socket。DatagramSocket类是数据报传递服务的发送点或接收点。在 DatagramSocket 上发送或接收的每个数据报包(Datagram Packet)都被单独寻址和路由。从一台机器发送到另一台机器的多个数据报包可能会以不同的方式路由,并且可能以任何顺序到达。

DatagramSocket 类的构造方法如下:
DatagramSocket 类常用的方法如下。

Java DatagramPacket类

java.net 包中的 DatagramPacket 类用来表示数据报包,数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。

DatagramPacket 类的构造方法如下:
DatagramPacket 类常用的方法如下:
【实例】循环从键盘上输入字符串并发送到本地主机的 1000 端口上,直到输入“exit”结束。
import java.net.*;
import java.util.Scanner;
public class UDPSendDemo {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要发送到本地主机1000端口上的数据:");
        String str = sc.nextLine();
        DatagramPacket dp = null;
        while (!str.equals("exit")) {
            dp = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("localhost"), 1000);
            ds.send(dp);
            System.out.println("请输入要发送到本地主机1000端口上的数据:");
            str = sc.nextLine();
        }
        ds.close();
    }
}
运行结果为:

请输入要发送到本地主机1000端口上的数据:hello
请输入要发送到本地主机1000端口上的数据:welcome
请输入要发送到本地主机1000端口上的数据:you
请输入要发送到本地主机1000端口上的数据:exit


【实例】循环接收发送到本地主机 1000 端口上的数据,直到收到“exit”结束。
import java.net.*;

public class UDPReceiveDemo {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket(1000);
        byte[] buf = new byte [1024];
        // 构建长度为 1024 的缓存区,用于接收数据
        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        while ( true ){
            ds.receive(dp);
            String s = new String(dp.getData(), 0, dp.getLength());
            System.out.printf("从%s: %d 接收的数据:%s\n",
                dp.getAddress().getHostAddress(), dp.getPort(),s);
            if (s.equals("exit")){
                break;
            }
        }
    }
}

相关文章