【网路编程】UDP协议及UDP小练习之聊天室

目录

一、InetAddress类的使用

二、UDP协议之发送数据(单播)

三、UDP协议之接收数据

四、UDP小练习之聊天室

五、UDP之单播、组播、广播

(一)组播之发送数据、接收数据

(二)广播之发送数据、接收数据


一、InetAddress类的使用

        获取InetAddress对象,是用来获取一台设备的相关信息。

getByName():确定主机名称的IP地址

getHostName():获取IP地址的主机名

getHostAddress():返回文本显示中的IP地址字符串

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyInetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //1.获取InetAddress对象
        //ip的对象,一台电脑
        //确定主机名称的IP地址。主机名称可以是机器名称也可以是IP地址
        InetAddress address=InetAddress.getByName("LAPTOP-4R4O0SD4");
        System.out.println(address);
        //获取IP地址的主机名
        String name=address.getHostName();
        System.out.println(name);
        //返回文本显示中的IP地址字符串
        String ip=address.getHostAddress();
        System.out.println(ip);
    }
}

二、UDP协议之发送数据(单播)

package a02UDPdemo;

import java.io.IOException;
import java.net.*;
/*
UDP面向无连接的通信协议
速度快、一次最多发送64K、数据不安全、容易丢失数据
看视频、语音通话、视频会议、

TCP面向连接的通信协议
速度慢。没有大小限制、数据安全
下载安装包、文字聊天、发送邮件
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据

        //1.创建DatagramSocket对象(快递公司)
        //细节:绑定端口,就是通过这个端口往外发送数据
        //空参:所有可用端口随机选择一个
        //有参:指定端口号
        DatagramSocket datagramSocket=new DatagramSocket();
        String str="udp发送数据";
        byte []bytes =str.getBytes();//发送的数据
        InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//要发送到的设备
        int port=10086;//要发送到主机的端口号
        //2.打包数据(DatagramPacket)
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
        //3.发送数据
        datagramSocket.send(datagramPacket);
        //4.释放资源
        datagramSocket.close();
    }
}

 

三、UDP协议之接收数据

package a02UDPdemo;

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

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接收数据

        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //接收的时候一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte [] bytes =new byte[1024];//用于接收数据的数组大小
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
        //该方法是阻塞的,程序执行到receive,会在这里死等,等待发送端发送数据
        System.out.println(1111);
        datagramSocket.receive(datagramPacket);
        System.out.println(2222);//如果发送端没有发送数据,就不会打印2222
        //3.解析数据包
        byte[] data= datagramPacket.getData();
        int len=datagramPacket.getLength();
        int port=datagramPacket.getPort();
        InetAddress address=datagramPacket.getAddress();
        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
        //4.释放资源
        datagramSocket.close();

    }
}

小贴士:先运行send在运行receive 

四、UDP小练习之聊天室

按照下面的要求实现程序:

UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

 UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * 按照下面的要求实现程序
 * UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
 * UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象
        DatagramSocket datagramSocket=new DatagramSocket();
        while (true) {
            //2.打包数据
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入您想输入的话");
            String str= scanner.nextLine();
            if("886".equals(str)){
                break;
            }
            byte []bytes=str.getBytes();
            int port=10086;
            InetAddress address=InetAddress.getByName("127.0.0.1");
            DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
            //3.发送数据
            datagramSocket.send(datagramPacket);
        }
        //4.释放资源
        datagramSocket.close();

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

/**
 * 按照下面的要求实现程序
 * UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
 * UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        while (true) {
            datagramSocket.receive(datagramPacket);
            //3.解析数据包
            String ip=datagramPacket.getAddress().getHostAddress();
            String name=datagramPacket.getAddress().getHostName();
            int port= datagramPacket.getPort();
            byte data[]=datagramPacket.getData();
            int length=datagramPacket.getLength();
            //4.打印数据
            System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        }
//        //4.释放资源
//        datagramSocket.close();
    }
}

 

 可以开启多个启动运行来模拟多个设备发送数据,如下图所示,开启三个send类来模拟三个用户,一个receive类模拟聊天室接收数据。先运行send类在运行receive类。

 

五、UDP之单播、组播、广播

(一)组播之发送数据、接收数据

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * UDP发送方式分为:单播、组播、广播
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        组播发送端代码
        组播地址:224.0.0.0~239.255.255.255
        其中224.0.0.0~224.0.0.255为预留的组播地址
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket();
        //2.创建DatagramPacket对象
        String str="您好";
        byte []bytes=str.getBytes();
        int port=10000;
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
        //3.调用MulticastSocket发送数据方法发送数据
        multicastSocket.send(datagramPacket);
        //4.释放资源
        multicastSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo1 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo2 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo3 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.2");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}

 

 其中ReceiveMessageDemo3并不会收到发来的数据。因为它指定的组播地址不是send类指定的组播地址。

(二)广播之发送数据、接收数据

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

/**
 * UDP发送方式分为:单播、组播、广播
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        广播发送端代码
        组播地址:255.255.255.255
         */
        //1.创建DatagramSocket对象
        DatagramSocket datagramSocket=new DatagramSocket();
        String str="udp发送数据";
        byte []bytes =str.getBytes();//发送的数据
        InetAddress inetAddress=InetAddress.getByName("255.255.255.255");//要发送到的设备
        int port=10086;//端口号
        //2.打包数据(DatagramPacket)
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
        //3.发送数据
        datagramSocket.send(datagramPacket);
        //4.释放资源
        datagramSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        广播接收端代码
         */
        //1.创建DatagramSocket对象
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte [] bytes =new byte[1024];//用于接收数据的数组大小
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
        datagramSocket.receive(datagramPacket);
        //3.解析数据包
        byte[] data= datagramPacket.getData();
        int len=datagramPacket.getLength();
        int port=datagramPacket.getPort();
        InetAddress address=datagramPacket.getAddress();
        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
        //4.释放资源
        datagramSocket.close();
    }
}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊爱吃软糖吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值