用UDP实现单向发送数据

最好先运行接收方.java文件,再运行发送方的。以免因为接收方还没开始接收数据,发送方就先发导致数据丢失

发送方

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
* UDP传输的发送端:
1 建立udp的socket对象
2.将要发送的数据封装成数据包
3.通过udp的socket对象,将数据包发送出
4.释放资源
* */
public class SendData {//这里只实现单方向传数据A->B

    public static void main(String[] args) throws IOException {
        //建立udp的socket对象,并指定本主机要用哪个端口(1-65535)发送数据
        DatagramSocket socket = new DatagramSocket(69);

        //用键盘循环输入要发送的内容
        BufferedReader bufferin = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = bufferin.readLine()) != null) {
            byte[] bytes = s.getBytes();//把字符串->字节
            //在给定主机名的情况下,返回其IP地址的对应对象
            InetAddress targerIP = InetAddress.getByName("127.0.0.1");//目的IP
            //将要发送的数据封装成数据包,目的端口8888
            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, targerIP, 8888);
            //再把数据报输到socke的send方法里,发送出去,
            socket.send(packet);
            if (s.equals("886")) {//发送方发送886,说明数据发送完毕,接收方也可以停止接收
                break;
            }
        }
        socket.close();
    }
}

接收方

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;

/*
* 1.建立udp的socket对象.
2.创建用于接收数据的数据报包,通过socket对象的receive方法接收数据
3.通过数据包对象的功能来完成对接收到数据进行解析.
4.可以对资源进行释放
* */
public class ReceiveData {
    public static void main(String[] args) throws IOException {
        //建立udp的socket对象,输入本主机用来接收数据的端口
        DatagramSocket socket = new DatagramSocket(8888);
        // 创建充当缓冲区的字节数组
        byte[] bytes = new byte[1024];
        //让数据报包的缓冲区指针指向bytes
        DatagramPacket receivePacket = new DatagramPacket(bytes, 0, bytes.length);
        //接收数据,送到缓冲区
        while (true) {
            socket.receive(receivePacket);//receive是阻塞方法,在接收到数据报前一直阻塞
            // 解析数据报包
            byte[] data = receivePacket.getData();//得到缓冲区所有数据,相当于data=bytes
            int length = receivePacket.getLength();//返回缓冲区发送或接收到的数据长度
            int offset = receivePacket.getOffset();//返回缓冲区发送或接收到的数据偏移量
            String s = new String(data, offset, length);
            //另解,直接用bytes打印结果
            // String s = new String(bytes, 0, bytes.length);bytes的有效数据长度应该换成上面的length
            System.out.println(s);

            //从数据报包里获取源ip和源端口,如果是在发送方获得目的IP和目的端口号
           /* 方式1
            InetAddress sourceIP = receivePacket.getAddress();
            int port = receivePacket.getPort();
            System.out.println("接收到了来自"+ sourceIP +"/" + port +":"+s);
            方式2 获得IP+端口
            SocketAddress socketAddress = receivePacket.getSocketAddress();
            System.out.println("接受到了来自" + socketAddress + ":" + s);
            */

            if (s.equals("886")) {//如果发送方发送886,接收停止
                break;
            }
        }
        //关闭资源
        socket.close();
    }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值