Java UDP通讯的实现

▪ DatagramSocket:用于发送或接收数据报包

      当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

      DatagramSocket有两种常用的构造函数。一种是无需任何参数的,常用于客户端;另一种需要指定端口,常用于服务器端。如下所示:

      DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。

      DatagramSocket(int port) :创建数据报套接字并将其绑定到本地主机上的指定端口。

常用方法:

      Ø send(DatagramPacket p) :从此套接字发送数据报包。

      Ø receive(DatagramPacket p) :从此套接字接收数据报包。

      Ø close() :关闭此数据报套接字。

▪ DatagramPacket:数据容器(封包)的作用

      此类表示数据报包。 数据报包用来实现封包的功能。

常用方法:

      Ø DatagramPacket(byte[] buf, int length) :构造数据报包,用来接收长度为 length 的数据包。

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

      Ø getAddress() :获取发送或接收方计算机的IP地址,此数据报将要发往该机器或者是从该机器接收到的。

      Ø getData() :获取发送或接收的数据。

      Ø setData(byte[] buf) :设置发送的数据。

UDP通信编程基本步骤:

      1. 创建客户端的DatagramSocket,创建时,定义客户端的监听端口。

      2. 创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口。

      3. 在服务器端定义DatagramPacket对象,封装待发送的数据包。

      4. 客户端将数据报包发送出去。

      5. 服务器端接收数据报包。

UDP:单向通信之客户端

mport java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
 
public class Client {
    public static void main(String[] args) throws Exception {
        byte[] b = "北京尚学堂".getBytes();
        //必须告诉数据报包要发到哪台计算机的哪个端口,发送的数据以及数据的长度
        DatagramPacket dp = new DatagramPacket(b,b.length,new 
InetSocketAddress("localhost",8999));
        //创建数据报套接字:指定发送信息的端口
        DatagramSocket ds = new DatagramSocket(9000);
        //发送数据报包
        ds.send(dp);
        //关闭资源
        ds.close();
    }
}

UDP:单向通信之服务器端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
public class Server {
    public static void main(String[] args) throws Exception {
        //创建数据报套接字:指定接收信息的端口
        DatagramSocket ds = new DatagramSocket(8999);
        byte[] b = new byte[1024];
        //创建数据报包,指定要接收的数据的缓存位置和长度
        DatagramPacket dp = new DatagramPacket(b, b.length);
        //接收客户端发送的数据报
        ds.receive(dp); // 阻塞式方法
        //dp.getLength()返回实际收到的数据的字节数
        String string = new String(dp.getData(), 0, dp.getLength());
        System.out.println(string);
        //关闭资源
        ds.close();
    }
}

通过字节数组流ByteArrayInputStream、ByteArrayOutputStream与数据流DataInputStream、DataOutputStream联合使用可以传递基本数据类型。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值