Java网络编程

一、网络编程三要素

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


二、UDP通信程序

在这里插入图片描述

发送数据

/**
 * @date 2023/7/19
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
         * 1. 创建DatagramSocket对象(快递公司)
         * 细节:
         * 绑定端口 我们以后就是通过这个端口往外发送数据
         * 空参:所有可用的端口中随机一个进行使用
         * 有参:指定端口号进行绑定
         */
        DatagramSocket ds = new DatagramSocket();

        // 2. 打包数据
        String str = "小帅,你好威啊!";
        byte[] message = str.getBytes();
        // 发送给本机
        InetAddress address = InetAddress.getByName("127.0.0.1");
        // 发给10086 端口
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(message, message.length, address, port);

        // 3.发送数据
        ds.send(dp);
        // 4. 释放资源
        ds.close();
    }
}


在这里插入图片描述

接收数据

/**
 * @date 2023/7/19
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
         * 1. 创建DatagramSocket对象(快递公司)
         * 细节:
         * 绑定端口 我们以后就是通过这个端口往外发送数据
         * 空参:所有可用的端口中随机一个进行使用
         * 有参:指定端口号进行绑定
         */
        DatagramSocket ds = new DatagramSocket();

        // 2. 打包数据
        String str = "小帅,你好威啊!";
        byte[] message = str.getBytes();
        // 发送给本机
        InetAddress address = InetAddress.getByName("127.0.0.1");
        // 发给10086 端口
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(message, message.length, address, port);

        // 3.发送数据
        ds.send(dp);
        // 4. 释放资源
        ds.close();
    }
}

tip:
启动时,先启动接收端,在启动发送端。
receive()方法时阻塞方法。

UDP的三种通信方式

  • 单播
  • 组播
  • 广播
单播

之前写的代码就是单播 \color{#FF0000}{之前写的代码就是单播} 之前写的代码就是单播

组播

组播地址: 224.0.0.0 − 239.255.255.255 \color{#FF0000}{组播地址:224.0.0.0-239.255.255.255} 组播地址:224.0.0.0239.255.255.255
其中: 224.0.0.0 − 224.0.0.255 为预留的组播地址 \color{#FF0000}{其中:224.0.0.0-224.0.0.255为预留的组播地址} 其中:224.0.0.0224.0.0.255为预留的组播地址
接收端代码实现:


/**
 * @date 2023/7/19
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        // 1. 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10086);

        // 2. 将当前本机,添加到224.0.0.1的这一组中
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        // 3. 创建DatagramPacket数据包对象
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        // 4. 接收数据
        ms.receive(dp);

        // 5. 解析数据包
        byte[] data = dp.getData();
        int len = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String hostName = dp.getAddress().getHostName();
        System.out.println("ip为: " + ip + "主机为: " + hostName + "的人,发送了数据: " + new String(data, 0, len));
        // 5. 释放资源
        ms.close();
    }
}

发送端代码实现:

/**
 * @date 2023/7/19
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        // 1.创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket();
        // 2.打包数据
        String str = "小帅,你好威啊!";
        byte[] message = str.getBytes();
        // 注意:地址为组播地址
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(message, message.length, address, port);
        // 3.发送数据
        ms.send(dp);
        // 4.释放资源
        ms.close();
    }
}

广播

广播地址: 255.255.255.255 \color{#FF0000}{广播地址:255.255.255.255} 广播地址:255.255.255.255
代码实现:
就是把单播发送端的IP改为255.255.255.255就可以了,其他代码和单播的一样

InetAddress address = InetAddress.getByName("255.255.255.255");

三、TCP通信程序

在这里插入图片描述

在这里插入图片描述


服务端代码实现(接收数据):

/**
 * @date 2023/7/19
 * @deprecated TCP协议接收数据
 */
public class TcpServer {
    public static void main(String[] args) throws IOException {
        // 1.创建Socket对象
        ServerSocket serverSocket = new ServerSocket(10086);

        // 2.监听客户端的连接
        Socket socket = serverSocket.accept();

        // 3.从连接通道中获取输入流读取数据
        // InputStream inputStream = socket.getInputStream();
        // InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        int len;
        while ((len = br.read()) != -1){
            System.out.print((char) len);
        }

        // 4.释放资源
        socket.close();
        serverSocket.close();

    }
}

客户端代码实现(发送数据):

/**
 * @date 2023/7/19
 * @deprecated TCP协议发送数据
 */
public class TcpClient {
    public static void main(String[] args) throws IOException {
        // 1.创建Socket对象
        // 细节:在创建对象的同时会连接服务端
        //      如果连接不上,代码会报错
        Socket socket = new Socket("127.0.0.1", 10086);

        // 2.可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        // 写数据
        os.write("小帅,你好威啊".getBytes());

        // 3.释放资源
        socket.close();
    }
}

TCP通讯程序(三次握手)

在这里插入图片描述

TCP通讯程序(四次挥手)

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值