JAVA---UDP

目錄

UDP傳輸

實列一:

 發送端:

接收端:

示例二:

發送類

接收類

主程序


UDP傳輸

  • DatagramSocket與DatagramPacket
  • 建立發送端,接收端
  • 建立數據包
  • 調用Socket的發送接收方法
  • 關閉Socket

發送端與接收端是兩個獨立的運行程序

實列一:

 發送端:

/*
需求:通過UDP傳輸方式,將一段文字數據發送出去
思路:
1.建立udpsocket服務
2.提供數據,並將數據封裝到數據包中
3.通過socket服務的發送功能,將數據包發出去
4.關閉資源
*/

class UdpSend
{
    public static void main(String[] args) throws Excption
    {
        //1.創建udp服務,8888爲指定發送端口號,不是目的端口號
        DatagramSocket ds = new DatagramSocket(8888);
        
        //2.確定數據,並封裝成數據報
        byte[] buf ="udp ni hao".getBytes();
        DatagramPacket dp =
            new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10001);

        //3.通過socket服務,將已有的數據包發送出去,通過send方法
        ds.send(dp);

        //4.關閉資源
        ds.close();ds.close();
    }
}

接收端:

/*
需求:定義一個應用程序,用於接收udp協議傳輸的數據並處理
思路:
1.定義udpsocket服務,通常會監聽一個端口,其實就是給這個接收網絡應用程序定義數字標識,方便於明確哪些數據過來該應用程序可以處理
2.定義一個數據包,因爲要存儲接收到的字節數據,因爲數據包對象中有更多功能可以提取字節數據中的不同數據信息
3.通過socket服務的receive方法將收到的數據存入已定義好的數據包中
4.通過數據包對象的特有功能,將這些不同的數據取出,打印在控制檯上
5.關閉資源
*/

class UdpRece
{
    public static void main(Stirng[] args) throws Exception
    {
        //1.創建udpSocket,建立端點,
        DatagramSocket ds = new DatagramSocket(10001);

        //2.定義數據包,用於存儲數據
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf,buf.length);

        //3.通過服務的recive方法將收到數據存入數據包中
        ds.receive(dp);

        //4.通過數據包的方法獲取其中的數據
        String ip = dp.getAddress().getHostAddress();

        String data = new String(dp.getData(),0,dp.getLength());

        int port = dp.getPort();

        System.out.println(ip+"::"+data+"::"+port);

        //5.關閉資源
        ds.close();
    }
}

示例二:

上述只能發送指定的數據,如果發送鍵盤輸入的數據呢,而且是發送和接收互不干擾

發送類

/*
編寫一個聊天程序
有收數據部分,和發數據的部分
這兩部分需要同時執行,那就需要用到多線程技術,一個線程控制收,一個線程控制發

因爲收和發動作是不一致的,所以要定義兩個run方法,而且這兩個方法要封裝到不同的類中
*/

class Send implements Runnable
{
    private DatagramSocket ds;
    public Sent(DatagramSocket ds)
    {
        this.ds=ds;
    }
    public void run()
    {
        try
        {
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            string line=null;
            while(line=bufr.readLine()!=null)
            {
                if("bye".equals(line))
                    break;
                //255標識廣播,只要監聽10002這個端口就能收到本發送端的信息
                DatagramPacket dp = new DatagramPacket (buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);

                ds.send(dp);
            }
        }
        catch(Exception e)
        {
            throw new RuntimeException("發送失敗");
        }
    }
}

接收類

class Rece implements Runnable
{
    private DatagramSocket ds;
    public Rece(DatagramSocket ds)
    {
        this.ds=ds;
    }
    public void run()
    {
        try
        {
            
            while(true)
            {
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);

                ds.receive(dp);
            
                String ip = dp.getAddress().getHostAddress();

                String data = new String(dp.getData(),0,dp.getLength());

                System.out.println(ip+"::"+data);
            }
        }
        catch(Exception e)
        {
            throw new RuntimeException("接收失敗");
        }
    }
}

主程序

class ChatDemo
{
    public static void main(String[] args)throws Exception
    {
        DatagramSocket sendSocket = new DatagramSocket();
        DatagramSocket receSocket = new DatagramSocket(10002);

        new Thread(new send(sendSocket)).start();
        new Thread(new Rece(receSocket )).start();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章