Java UDP通信示例

本文主要是讲解Java udp的使用,话不多说直接上代码!

package Main;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Udp {
    private static DatagramSocket ds = null;
    static String send;
    static String address = "192.168.0.121";
    static DatagramPacket dp;
    static Scanner sc;

    public static void send(String s) {
        try {
            dp = new DatagramPacket(s.getBytes(), 0, s.getBytes().length);
            dp.setAddress(InetAddress.getByName(address));
            dp.setPort(10000);
        } catch (UnknownHostException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            ds.send(dp);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        init();
        while (true) {
            send = sc.next();
            send(send);
        }
    }

    private static void init() {
        // TODO Auto-generated method stub
        sc = new Scanner(System.in);
        try {
            ds = new DatagramSocket(8999);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我这里主要是定义了两个类,一个类就叫”UDP”(名字有点古怪,凑合看吧^_^),也就是上面这代码。这个类是用来发送的UDP数据(DatagramePacket)的。
接下来就是用来接收数据的类了

package UDP;

import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Harry {
    private static byte[] bytes=null;
    static DatagramPacket packet=null;
    static DatagramSocket ds=null;
    private static String show="";
    public static void receive(){
        try {
            ds=new DatagramSocket(10000);
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        while (true) {
            re();
            System.out.println(show);
        }
    }

    public static void main(String[] args) {
        receive();
    }
    public static void re(){
        bytes=new byte[1024];
        packet=new DatagramPacket(bytes, 0,bytes.length);
        try {
                ds.receive(packet);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        show=new String(packet.getData(),0,packet.getData().length);
    }
}

我给它起了一个好听的名字:”harry”,这个类里面就是用到了DatagramSocket 对象ds的receive()方法,这个方法就是用来接收发来的数据的。
不管是发的类还是接收的类,为了让他们能够一直发送或者一直接收,我就将他们的核心代码都放在了while(true){}中了。
说一个小插曲,之前把bytes=new byte[1024];这句放在了while(true){}代码段之前,结果接收到的数据总是含有上一段接收的数据的”残留“,比如上一次发的”hhhh“,第二次发”ha“,显示出来是”hahh“,这主要是因为byte数组没有清空,然后导致后面的连个”h“的内容还是保留着的,修改之后结果让人满意。还是设计的时候自己考虑不周啊。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值