1. 网络编程的目的?
      1. 直接或间接的通过网络协议与其他计算机实现数据交换、进行通讯
    2. 网络编程的两个主要问题
      1. 如何准确的定位网络上的一台或多台主机 :定位主机上特定的应用
        1. ip确定网络上唯一的主机 对应Java类 InetAddress
        2. 端口号确定特定的应用
      2. 找到主机后 如何进行高效的可靠的数据传输
        1. 解: 通过网络通信协议
    3. 网络通信协议
      1. 通信协议同层可以传递
      2. 上层可以调下层进行传递
      3. 不可以跃层传递

    image.png

    1. TCP协议
      1. 采用TCP协议前 先创建TCP链接 形成数据传输通道
      2. 传输前 采用’三次握手’方式 建立点对点通信 是可靠的
      3. TCP协议的两个应用进程: 客户端、服务端
      4. 在链接中可进行大量的数据传输
      5. 传输完毕 释放已建立的链接 效率低
    2. UDP协议

      1. 将数据、源、目的封装成数据包 不需要建立链接
      2. 每个数据报大小限制在64k内
      3. 发送不管对方是否准备好接收 接收方收到也不确认 不可靠的
      4. 可以广播发送
      5. 发送结束时无需释放资源 开销小 速度快
    3. TCP网络编程示例

      1. Socket类 = ip+端口号 理解为客户端应用 通过他链接到服务器 实现数据传输、通信
      2. TCP示例 如客户端访问服务端
      3. 浏览器访问tomcat ```java **
      • @author:LYY 创建时间:2022/5/11 */ public class TCPTest {

        /**

        • TCP编程案例二
        • 客户端发送文件到服务端 服务端接收保存并返回收到信息给客户端 客户端打印收到信息到控制台
        • 自定义服务端 */ @Test void test04() throws IOException {

          OutputStream outputStream = null; FileOutputStream fileOutputStream = null; InputStream inputStream = null; Socket socket = null; ServerSocket serverSocket = null; try {

          1. // 创建服务端Socket
          2. serverSocket = new ServerSocket(8999);
          3. // 获取服务端链接
          4. socket = serverSocket.accept();
          5. // 获取输入流 获取客户端发送的文件
          6. inputStream = socket.getInputStream();
          7. // 获取输出流 保存客户端发送的文件到服务器(硬盘)
          8. fileOutputStream = new FileOutputStream("美图.jpg");
          9. byte[] bytes = new byte[1024];
          10. // 记录每次读取的字节数量
          11. int len;
          12. while ((len = inputStream.read(bytes)) != -1) {
          13. // 将文件流写到硬盘
          14. fileOutputStream.write(bytes, 0, len);
          15. }
          16. // 返回客户端消息
          17. outputStream = socket.getOutputStream();
          18. outputStream.write("文件接收完成!".getBytes());

          } catch (IOException e) {

          1. e.printStackTrace();

          } finally {

          1. // 释放资源
          2. if (outputStream != null) {
          3. try {
          4. outputStream.close();
          5. } catch (IOException e) {
          6. e.printStackTrace();
          7. }
          8. }
          9. if (fileOutputStream != null) {
          10. try {
          11. fileOutputStream.close();
          12. } catch (IOException e) {
          13. e.printStackTrace();
          14. }
          15. }
          16. if (inputStream != null) {
          17. try {
          18. inputStream.close();
          19. } catch (IOException e) {
          20. e.printStackTrace();
          21. }
          22. }
          23. if (socket != null) {
          24. try {
          25. socket.close();
          26. } catch (IOException e) {
          27. e.printStackTrace();
          28. }
          29. }
          30. if (serverSocket != null) {
          31. serverSocket.close();
          32. }

          } }

        /**

        • TCP编程案例二
        • 客户端发送文件到服务端 服务端接收保存并返回收到信息给客户端 客户端打印收到信息到控制台
        • 自定义客户端 */ @Test void test03() { Socket socket = null; OutputStream outputStream = null; FileInputStream fileInputStream = null; try {

          1. // 创建Socket对象
          2. socket = new Socket(InetAddress.getByName("192.168.1.52"), 8999);
          3. // 获取输入流 将要发送的文件转换为字节流
          4. fileInputStream = new FileInputStream("preview.jpg");
          5. // 获取输出流 发送文件
          6. outputStream = socket.getOutputStream();
          7. byte[] bytes = new byte[1024];
          8. int read;
          9. // 读文件的字节流
          10. while ((read = fileInputStream.read(bytes)) != -1) {
          11. // 发送文件
          12. outputStream.write(bytes, 0, read);
          13. }
          14. // 告诉服务端 发送数据结束
          15. socket.shutdownOutput();
          16. // 获取输入流 准备获取服务端发送的消息
          17. InputStream inputStream = socket.getInputStream();
          18. bytes = new byte[1024];
          19. // 记录每次读取的字节
          20. int len;
          21. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
          22. while ((len = inputStream.read(bytes))!=-1) {
          23. byteArrayOutputStream.write(bytes,0,len);
          24. }
          25. System.out.println(byteArrayOutputStream.toString());

          } catch (IOException e) {

          1. e.printStackTrace();

          } finally {

          1. if (socket != null) {
          2. try {
          3. socket.close();
          4. } catch (IOException e) {
          5. e.printStackTrace();
          6. }
          7. }
          8. if (outputStream != null) {
          9. try {
          10. outputStream.close();
          11. } catch (IOException e) {
          12. e.printStackTrace();
          13. }
          14. }
          15. if (fileInputStream != null) {
          16. try {
          17. fileInputStream.close();
          18. } catch (IOException e) {
          19. e.printStackTrace();
          20. }
          21. }

          } }

    1. /**
    2. * TCP编程案例一
    3. * 客户端发送数据到服务端 服务端将接收到的数据显示在控制台
    4. * 自定义客户端
    5. */
    6. @Test
    7. void test01() {
    8. OutputStream outputStream = null;
    9. Socket socket = null;
    10. try {
    11. // 客户端TCP指向服务器端
    12. socket = new Socket(InetAddress.getByName("192.168.1.52"), 8999);
    13. // 获取输出流
    14. outputStream = socket.getOutputStream();
    15. // 将消息写出到服务器端
    16. outputStream.write("我是客户端发送的消息!".getBytes());
    17. } catch (IOException e) {
    18. e.printStackTrace();
    19. } finally {
    20. // 关闭输出流
    21. if (outputStream != null) {
    22. try {
    23. outputStream.close();
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. }
    27. }
    28. // 关闭Socket(网通通信)
    29. if (socket != null) {
    30. try {
    31. socket.close();
    32. } catch (IOException e) {
    33. e.printStackTrace();
    34. }
    35. }
    36. }
    37. }
    38. /**
    39. * TCP通信编程案例一
    40. * 自定义服务器端
    41. * 接收客户端消息 并写出到控制台
    42. */
    43. @Test
    44. void test02() throws IOException {
    45. ByteArrayOutputStream byteArrayOutputStream = null;
    46. InputStream inputStream = null;
    47. Socket accept = null;
    48. ServerSocket serverSocket = null;
    49. try {
    50. // 创建服务器客户端
    51. serverSocket = new ServerSocket(8999);
    52. // 获取到客户端链接
    53. accept = serverSocket.accept();
    54. // 从客户获取到输入流 获取到客户端发送的内容
    55. inputStream = accept.getInputStream();
    56. // ByteArrayOutputStream 处理接收字节流输出字符串时容易出现乱码的问题
    57. byteArrayOutputStream = new ByteArrayOutputStream();
    58. byte[] bytes = new byte[1024];
    59. // 记录每次读取到的字节数
    60. int len;
    61. // 读客户端发送的数据(字节流)
    62. while ((len = inputStream.read(bytes)) != -1) {
    63. byteArrayOutputStream.write(bytes, 0, len);
    64. };
    65. // toString方法调用ByteArrayOutputStream中的数组 并将数组中保存的所有字节(byte)创建成String返回
    66. System.out.println(byteArrayOutputStream.toString());
    67. } catch (IOException e) {
    68. e.printStackTrace();
    69. } finally {
    70. // 释放资源
    71. if (byteArrayOutputStream != null) {
    72. try {
    73. byteArrayOutputStream.close();
    74. } catch (IOException e) {
    75. e.printStackTrace();
    76. }
    77. }
    78. if (inputStream != null) {
    79. try {
    80. inputStream.close();
    81. } catch (IOException e) {
    82. e.printStackTrace();
    83. }
    84. }
    85. if (accept != null) {
    86. try {
    87. accept.close();
    88. } catch (IOException e) {
    89. e.printStackTrace();
    90. }
    91. }
    92. if (serverSocket != null) {
    93. serverSocket.close();
    94. }
    95. }
    96. }

    }

    1. 7. UDP编程示例
    2. ```java
    3. /**
    4. * @author:LYY 创建时间:2022/5/11
    5. * UDP编程示例
    6. */
    7. public class UDPTest {
    8. /**
    9. * 发送端
    10. */
    11. @Test
    12. void seedTest() {
    13. DatagramSocket datagramSocket = null;
    14. try {
    15. // UDP编程对象
    16. datagramSocket = new DatagramSocket();
    17. byte[] bytes = "测试信息!".getBytes();
    18. // 数据打包对象
    19. DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length,InetAddress.getByName("127.0.0.1"),8999);
    20. // 发送数据
    21. datagramSocket.send(datagramPacket);
    22. } catch (SocketException e) {
    23. e.printStackTrace();
    24. } catch (IOException e) {
    25. e.printStackTrace();
    26. } finally {
    27. // 释放资源
    28. if (datagramSocket != null) {
    29. datagramSocket.close();
    30. }
    31. }
    32. }
    33. /**
    34. * 接收端
    35. */
    36. @Test
    37. void receiver() {
    38. DatagramSocket datagramSocket = null;
    39. try {
    40. // UDP对象
    41. datagramSocket = new DatagramSocket(8999);
    42. // 定义接收字节数据的数组
    43. byte[] bytes = new byte[64];
    44. DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
    45. // 接收数据 数据保存到datagramPacket中
    46. datagramSocket.receive(datagramPacket);
    47. // 取出数据
    48. byte[] data = datagramPacket.getData();
    49. // 将字节转换成String
    50. String s = new String(data, 0, datagramPacket.getLength());
    51. System.out.println(s);
    52. } catch (SocketException e) {
    53. e.printStackTrace();
    54. } catch (UnknownHostException e) {
    55. e.printStackTrace();
    56. } catch (IOException e) {
    57. e.printStackTrace();
    58. } finally {
    59. if (datagramSocket != null) {
    60. datagramSocket.close();
    61. }
    62. }
    63. }
    64. }