网络编程三要素

243 阅读3分钟
  1. 确定对方电脑IP地址。(设备在网络中的地址,唯一标识。)
  2. 确定接收数据的端口号。(应用程序在设备中的唯一标识)。
  3. 使用的协议是什么。(数据在网络中的传输规则)

IPV4 地址分类形式

  • 公网地址(万维网使用) 和 私有地址(局域网使用)
  • 192.168. 开头的就是私有地址 , 范围为 192.168.0.0--192.168.255.255 , 专门为组织机构内部使用,以此节省IP.

127.0.0.1 和 路由器分配的 IP 地址是不同的

image.png

image.png

InetAddress 类的使用

image.png

    public static void main(String[] args) throws UnknownHostException {

//        IP 对象
        InetAddress address = InetAddress.getByName("192.168.6.100");
        System.out.println(address);
        InetAddress address1 = InetAddress.getByName("zhangmeng");
        System.out.println(address1);
        // 没有这台电脑 找不到的话 就会等十几秒 输出 IP地址 
        System.out.println(address.getHostName());
        System.out.println(address1.getHostName());
    }

udp 协议 (发送数据不检查网络 )

  • 用户数据报协议。
  • 面向无连接的通信协议。
  • 速度快,有大小限制 一次最多发送64K,数据不安全,容易丢失数据。
  • 应用举例 : 语音通话,在线视频。

TCP 协议 (发送数据会检查网络)

  • 传输控制协议
  • 面向连接的通信协议
  • 速度慢,没有大小限制,数据安全。
  • 应用举例 : 文字聊天,发送邮件,下载软件。

使用 udp 协议发送数据

public static void main(String[] args) throws IOException {

    // 创建对象 : 空参 所有可用端口中随机一个进行使用
    DatagramSocket datagramSocket = new DatagramSocket();

    //发送数据
    String msg = "你好!socket";
    byte[] bytes = msg.getBytes();
    InetAddress zhangmeng = InetAddress.getByName("zhangmeng");
    int port = 10086;
    DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,zhangmeng,port);
    // 发送数据
    datagramSocket.send(datagramPacket);
    // 释放资源
    datagramSocket.close();
}

使用 udp 协议接收数据

public static void main(String[] args) throws IOException {
    // 找快递公司
    DatagramSocket datagramSocket = new DatagramSocket(10086);
    DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
    
    // receive 是阻塞的方法  建议使用异步线程
    datagramSocket.receive(datagramPacket);

    // 解析数据包
    InetAddress address = datagramPacket.getAddress();
    System.out.println("从哪台电脑发来 ?"  + address);
    System.out.println("哪个端口号?" + datagramPacket.getPort());
    System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
    System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
}

udp 通信模拟多人聊天室

public class Receive {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(10086);
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        DatagramPacket datagramPacket;
        while (true) {
            datagramPacket = new DatagramPacket(new byte[1024], 1024);
            datagramSocket.receive(datagramPacket);
            String msg = new String(datagramPacket.getData());
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            System.out.println( "从" + datagramPacket.getPort() + "发来的信息:" + msg);
        }
        datagramSocket.close();

    }
}
public class Send {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();

        BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String s = read.readLine();
            // 给 10086 发送数据
            byte[] bytes = s.getBytes();
            InetAddress zhangmeng = InetAddress.getByName("zhangmeng");
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, zhangmeng, 10086);
            datagramSocket.send(dp);
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            System.out.println(s);
            if (s.equals("拜拜")) break;
        }
        datagramSocket.close();
    }
}

UDP 通信方式

  • 单播 :发送端只给一台电脑发送数据
  • 组播 : 发送端 一个 ,但是接收端的电脑可以是一组。
  • 广播 : 给局域网内所有电脑发送。(修改地址为 255.255.255.255 即可)

组播编写

image.png

  • send.
public class MulticastSocketDemo {
    public static void main(String[] args) throws IOException {
        MulticastSocket multicastSocket = new MulticastSocket();
        InetAddress multicastAddress = InetAddress.getByName("224.0.0.1");
//       将当前电脑添加到组播组中 加和不加都是组播
//        multicastSocket.joinGroup(multicastAddress);

//        像一组电脑发送数据
        String msg = "你好!socket";
        byte[] bytes = msg.getBytes();
        int port = 10086;
        // 数据包 由单播地址 改为组播即可
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,multicastAddress,port);
        // 发送数据
        multicastSocket.send(datagramPacket);
        // 释放资源
        multicastSocket.close();
    }
}
  • receive1
public class MulticastSocketReceiveMessage {
    public static void main(String[] args) throws IOException {
        // 找快递公司
        MulticastSocket datagramSocket = new MulticastSocket(10086);
        InetAddress byName = InetAddress.getByName("224.0.0.2");
        datagramSocket.joinGroup(byName);
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        datagramSocket.receive(datagramPacket);

        // 解析数据包
        InetAddress address = datagramPacket.getAddress();
        System.out.println("从哪台电脑发来 ?"  + address.getHostName());
        System.out.println("哪个端口号?" + datagramPacket.getPort());
        System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
        System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
    }
}
public class MulticastSocketReceiveMessage1 {
    public static void main(String[] args) throws IOException {
        // 找快递公司
        MulticastSocket datagramSocket = new MulticastSocket(10086);
        InetAddress byName = InetAddress.getByName("224.0.0.1");
        datagramSocket.joinGroup(byName);
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        datagramSocket.receive(datagramPacket);

        // 解析数据包
        InetAddress address = datagramPacket.getAddress();
        System.out.println("从哪台电脑发来 ?"  + address.getHostName());
        System.out.println("哪个端口号?" + datagramPacket.getPort());
        System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
        System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
    }
}
public class MulticastSocketReceiveMessage2 {
    public static void main(String[] args) throws IOException {
        // 找快递公司
        MulticastSocket datagramSocket = new MulticastSocket(10086);
        InetAddress byName = InetAddress.getByName("224.0.0.1");
        datagramSocket.joinGroup(byName);
        DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
        datagramSocket.receive(datagramPacket);

        // 解析数据包
        InetAddress address = datagramPacket.getAddress();
        System.out.println("从哪台电脑发来 ?"  + address.getHostName());
        System.out.println("哪个端口号?" + datagramPacket.getPort());
        System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
        System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
    }
}

实验结果截图 。 同一组的电脑收到了 广播

image.png