• Day17-Java进阶-网络编程(IP, 端口, 协议)&TCP和UDP&三次握手和四次挥手


    1. 网络编程介绍

    1.1 初始网络编程

    1.2 网络编程三要素

    1.2.1 IP

    InetAddress 的使用

    1. package com.itheima.Inetaddress;
    2. import java.net.InetAddress;
    3. import java.net.UnknownHostException;
    4. public class InetAddressDemo1 {
    5. /*
    6. static InetAddress getByName(String host) 确定主机名称的IP地址, 主机名称可以是机器名称, 也可以是IP地址
    7. String getHostName() 获取此IP地址的主机名
    8. String getHostAddress() 返回文本显示中的IP地址字符串
    9. */
    10. public static void main(String[] args) throws UnknownHostException {
    11. // 1. 获取InetAddress的对象 -- IP的对象 --> 一台电脑的对象
    12. InetAddress address = InetAddress.getByName("联想小新笔记本");
    13. System.out.println(address);
    14. String name = address.getHostName();
    15. System.out.println(name);
    16. String ip = address.getHostAddress();
    17. System.out.println(ip);
    18. }
    19. }

    1.2.2 端口号

    1.2.3 协议

    (1) UDP协议 (发送数据)

    1. package com.itheima.udp;
    2. import java.io.IOException;
    3. import java.net.*;
    4. public class SendMessageDemo {
    5. /*
    6. 发送数据
    7. 1. 创建DatagramSocket对象(快递公司)
    8. 细节:
    9. 绑定端口, 以后通过这个端口往外发送
    10. 空参: 所有可用的端口中随机一个进行使用
    11. 有参: 指定端口号进行绑定
    12. 2. 打包数据
    13. 3. 发送数据
    14. 4. 释放资源
    15. */
    16. public static void main(String[] args) throws IOException {
    17. // 1. 创建DatagramSocket对象(快递公司)
    18. DatagramSocket ds = new DatagramSocket();
    19. // 2. 打包数据
    20. String str = "你好威呀!!!";
    21. byte[] bytes = str.getBytes();
    22. InetAddress address = InetAddress.getByName("127.0.0.1");
    23. int port = 10086;
    24. DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
    25. // 3. 发送数据
    26. ds.send(dp);
    27. // 4. 释放资源
    28. ds.close();
    29. }
    30. }

    因UDP协议是面向无连接的, 只顾发出, 不考虑是否被正确接收.

    (2) UDP协议 (接收数据)

    1. package com.itheima.udp;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. import java.net.InetAddress;
    6. import java.net.SocketException;
    7. public class ReceiveMessageDemo {
    8. /*
    9. 接收数据:
    10. 1. 创建DatagramSocket对象(快递公司)
    11. 细节:
    12. 1. 接收的时候, 一定要绑定端口
    13. 2. 绑定的端口, 一定要跟发送的端口保持一致
    14. 3. 解析数据包
    15. 4. 释放资源
    16. */
    17. public static void main(String[] args) throws IOException {
    18. // 1. 创建DatagramSocket对象(快递公司)
    19. DatagramSocket ds = new DatagramSocket(10086);
    20. // 2. 接收数据包
    21. byte[] bytes = new byte[1024];
    22. DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    23. // 该方法时阻塞的, 程序在执行到这一步时, 会一直在这里死等, 等发送端发送消息
    24. System.out.println(111111);
    25. ds.receive(dp);
    26. System.out.println(2222);
    27. // 3. 解析数据包
    28. byte[] data = dp.getData();
    29. int len = dp.getLength();
    30. InetAddress address = dp.getAddress();
    31. int port = dp.getPort();
    32. System.out.println("接收到数据" + new String(data, 0, len));
    33. System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
    34. // 4. 释放资源
    35. ds.close();
    36. }
    37. }

    (3) UDP协议 (聊天室)
    1. package com.itheima.udpdemo2;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.DatagramSocket;
    5. public class ReceiveMessageDemo {
    6. /*
    7. 按照下面的要求实现程序
    8. UDP发送数据: 数据来自于键盘录入, 直到输入的数据是886, 发送数据结束
    9. UDP接收数据: 因为接受端不知道发送端什么时候停止发送, 故采用死循环接收
    10. */
    11. public static void main(String[] args) throws IOException {
    12. // 1. 创建DatagramSocket的对象
    13. DatagramSocket ds = new DatagramSocket(10086);
    14. // 2. 接收数据包
    15. byte[] bytes = new byte[1024];
    16. DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    17. while (true) {
    18. ds.receive(dp);
    19. // 3. 解析数据包
    20. byte[] data = dp.getData();
    21. int len = dp.getLength();
    22. String ip = dp.getAddress().getHostAddress();
    23. String name = dp.getAddress().getHostName();
    24. // 4. 打印数据
    25. System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));
    26. }
    27. }
    28. }

    1.3 UDP三种通讯方式

    ① 单播: 一对一

    ② 组播: 一对多

    ③ 广播: 可以给局域网中所有的电脑发送数据

    1. package com.itheima.udpdemo3;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.InetAddress;
    5. import java.net.MulticastSocket;
    6. public class SendMessageDemo {
    7. /*
    8. 组播发送端代码
    9. */
    10. public static void main(String[] args) throws IOException {
    11. // 1. 创建MulticastSocket的对象
    12. MulticastSocket ms = new MulticastSocket();
    13. // 2. 打包数据
    14. String str = "你好你好!";
    15. byte[] bytes = str.getBytes();
    16. InetAddress address = InetAddress.getByName("224.0.0.1");
    17. int port = 10000;
    18. DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
    19. // 3. 发送数据
    20. ms.send(dp);
    21. // 4. 释放资源
    22. ms.close();
    23. }
    24. }
    1. package com.itheima.udpdemo3;
    2. import java.io.IOException;
    3. import java.net.DatagramPacket;
    4. import java.net.InetAddress;
    5. import java.net.MulticastSocket;
    6. public class ReceiveMessageDemo1 {
    7. /*
    8. 组播接收端代码
    9. */
    10. public static void main(String[] args) throws IOException {
    11. // 1. 创建MulticastSocket的对象
    12. MulticastSocket ms = new MulticastSocket(10000);
    13. // 2. 将当前本机, 添加到224.0.0.1的这一组当中
    14. InetAddress address = InetAddress.getByName("224.0.0.1");
    15. ms.joinGroup(address);
    16. // 3. 创建DatagramPacket数据包对象
    17. byte[] bytes = new byte[1024];
    18. DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
    19. // 4. 接受数据
    20. ms.receive(dp);
    21. // 5. 解析数据包
    22. byte[] data = dp.getData();
    23. int len = dp.getLength();
    24. String ip = dp.getAddress().getHostAddress();
    25. String name = dp.getAddress().getHostName();
    26. // 打印数据
    27. System.out.println("ip为: " + ip + ", 主机名为: " + name + "的人, 发送了数据: " + new String(data, 0, len));
    28. // 6. 释放资源
    29. ms.close();
    30. }
    31. }

    1.4 TCP 通信程序

    1. package com.itheima.tcpdemo;
    2. import java.io.IOException;
    3. import java.io.OutputStream;
    4. import java.net.Socket;
    5. public class Client {
    6. /*
    7. TCP协议, 发送数据
    8. 1. 创建Socket对象
    9. 细节:
    10. 在创建对象的同时会连接服务器
    11. 若连接不上, 代码会报错
    12. */
    13. public static void main(String[] args) throws IOException {
    14. // 1. 创建Socket对象
    15. Socket socket = new Socket("127.0.0.1",10000);
    16. // 2. 可以从连接通道中获取输出流
    17. OutputStream os = socket.getOutputStream();
    18. // 写出数据
    19. os.write("你好你好啊".getBytes()); // 一个字符占3个字节, 共12个字节
    20. // 3. 释放资源
    21. os.close();
    22. socket.close();
    23. }
    24. }
    1. package com.itheima.tcpdemo;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.net.ServerSocket;
    7. import java.net.Socket;
    8. public class Server {
    9. /*
    10. TCP协议, 接收数据
    11. */
    12. public static void main(String[] args) throws IOException {
    13. // 1. 创建Socket对象
    14. ServerSocket ss = new ServerSocket(10000);
    15. // 2. 监听客户端的连接
    16. Socket socket = ss.accept();
    17. // 3. 从连接通道中获取输入流读取数据(字节流)
    18. /*InputStream is = socket.getInputStream();
    19. // 将字节流转换成字符流isr
    20. InputStreamReader isr = new InputStreamReader(is);
    21. // 包一个缓冲流提升读取效率
    22. BufferedReader br = new BufferedReader(isr);*/
    23. BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    24. int b;
    25. while ((b = br.read()) != -1){
    26. System.out.print((char) b);
    27. }
    28. // 4. 释放资源
    29. socket.close(); // 相当于断开跟客户端的连接
    30. ss.close(); // 相当于关闭服务器
    31. }
    32. }

    1.5 三次握手和四次挥手

  • 相关阅读:
    Seata(1.4.2)环境搭建-SpringCloudAlibaba微服务
    C语言入门课程学习笔记3
    React Native读取系统属性
    最大流之上下界可行流
    php获取数组中键值最大数组项的索引值的方法
    Spring Cache和redis结合使用
    内网穿透的应用-如何通过TortoiseSVN+内网穿透,实现公网提交文件到内网SVN服务器?
    SpringBoot日志链路追踪实现
    【数字人】3、LIA | 使用隐式空间来实现视频驱动单张图数字人生成(ICLR 2022)
    阿里云 E-MapReduce 全面开启 Serverless 时代
  • 原文地址:https://blog.csdn.net/weixin_68063226/article/details/137431396