1. 网络编程的常识

(1) 七层网络模型

image.png

(2) 相关的协议(笔试题)

1. 协议的概念

  • 协议让计算机之间进行通讯的一套规则

image.png

2. TCP协议

image.png
image.png
image.png

3. UDP协议

image.png

(3) IP地址相关(重点)

image.png

(4) (重点)端口号

image.png

2. 基于TCP协议的编程模型(重点)

(1) C/S架构的简介

image.png

(2) 编程模型

image.png

(3)相关类和方法的解析

1. ServerSocket类

image.png

2. Socket类

image.png

  1. package com.lagou.task19;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintStream;
  6. import java.net.Socket;
  7. import java.util.Scanner;
  8. /**
  9. * @author 西风月
  10. * @date 2020/8/29
  11. * @description
  12. */
  13. public class ClientStringTest {
  14. public static void main(String[] args) {
  15. Socket s = null;
  16. PrintStream ps = null;
  17. Scanner sc = null;
  18. BufferedReader br = null;
  19. try {
  20. //1. 创建Socket类型的对象并提供服务器的通信地址
  21. s = new Socket("127.0.0.1", 6666);
  22. System.out.println("连接服务器成功!");
  23. //2. 使用输入输出流进行通信
  24. ps = new PrintStream(s.getOutputStream());
  25. br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  26. while(true) {
  27. System.out.println("请输入要发送的数据:");
  28. sc = new Scanner(System.in);
  29. String s1 = sc.next();
  30. //实现客户端向服务器发送字符串"hello"
  31. ps.println(s1);
  32. //实现接受服务器发来的字符串内容并打印
  33. String s2 = br.readLine();
  34. System.out.println("服务器回发的消息是:" + s2);
  35. if("bye".equalsIgnoreCase(s1)) {
  36. System.out.println("聊天结束!");
  37. break;
  38. }
  39. }
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. } finally {
  43. //3. 关闭Socket并释放资源
  44. if(br != null) {
  45. try {
  46. br.close();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. if(sc != null) {
  52. sc.close();
  53. }
  54. if(null != s) {
  55. try {
  56. s.close();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. if(null != ps) {
  62. ps.close();
  63. }
  64. }
  65. }
  66. }
  1. package com.lagou.task19;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. /**
  9. * @author 西风月
  10. * @date 2020/8/29
  11. * @description
  12. */
  13. public class ServerStringTest {
  14. public static void main(String[] args) {
  15. ServerSocket ss = null;
  16. Socket s = null;
  17. try {
  18. //1. 创建ServerSocket类型的对象并提供端口号
  19. ss = new ServerSocket(6666);
  20. //2. 等待客户端的连接请求,调用accept方法
  21. while(true) {
  22. System.out.println("等待客户端的连接请求!");
  23. s = ss.accept(); //当没有客户端连接时,则服务器阻塞在accept方法的调用这里
  24. System.out.println("客户端" +s.getInetAddress() + "连接成功~");
  25. //每当有一个客户端连接成功,则需要启动一个新的线程为之提供服务
  26. new ServerThread(s).start();
  27. }
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. } finally {
  31. //4. 关闭Socket并释放有关的资源
  32. if(null != ss) {
  33. try {
  34. ss.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }
  41. }
  1. package com.lagou.task19;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintStream;
  6. import java.net.Socket;
  7. import java.util.SortedMap;
  8. /**
  9. * @author 西风月
  10. * @date 2020/8/30
  11. * @description
  12. */
  13. public class ServerThread extends Thread {
  14. private Socket s;
  15. public ServerThread(Socket s) {
  16. this.s = s;
  17. }
  18. @Override
  19. public void run() {
  20. BufferedReader br = null;
  21. PrintStream ps = null;
  22. try {
  23. br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  24. ps = new PrintStream(s.getOutputStream());
  25. while(true) {
  26. //3. 使用输入输出流进行通信
  27. //实现对客户端发来字符内容的接受并且打印
  28. String s1 = br.readLine();
  29. System.out.println("客户端" +s.getInetAddress() + "发来的字符串是:" + s1);
  30. if("bye".equalsIgnoreCase(s1)) {
  31. System.out.println("客户端" +s.getInetAddress() + "下线了!");
  32. break;
  33. }
  34. ps.println("I Recevice!");
  35. System.out.println("服务器发送数据成功!");
  36. }
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. } finally {
  40. if(null != s) {
  41. try {
  42. s.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. if(ps != null) {
  48. ps.close();
  49. }
  50. if(null != br) {
  51. try {
  52. br.close();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }
  59. }

3. 基于udp协议的编程模型(熟悉)

(1)编程模型

image.png

(2) 相关类和方法的解析

1. DatagramSocket类

image.png

2. DatagramPacket类

image.png

3. InetAddress类

image.png

package com.lagou.task19;

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

/**
 * @author 西风月
 * @date 2020/8/30
 * @description
 */
public class ReceiveTest {
    public static void main(String[] args) {
        DatagramSocket ds = null;
        try {
            //1. 创建DatagramSocket类型的对象并提供端口号
            ds = new DatagramSocket(8888);
            //2. 创建DatagramPackage类型的对象并提供缓冲区接数据
            byte[] bArr = new byte[20];
            DatagramPacket dp = new DatagramPacket(bArr, bArr.length);
            //3. 通过Socket接收数据内容并放到Packet里面,调用receive方法
            System.out.println("等待数据中.....");
            ds.receive(dp);
            System.out.println("接收的数据是:" + new String(bArr) + "!");
            //回发消息
            byte[] bArr2 = "I Receive!".getBytes();
            DatagramPacket dp2 = new DatagramPacket(bArr2, bArr2.length, dp.getAddress(), dp.getPort());
            ds.send(dp2);
            System.out.println("回发消息成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 关闭Socket并释放有关资源
            if(ds != null) {
                ds.close();
            }
        }
    }
}
package com.lagou.task19;

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

/**
 * @author 西风月
 * @date 2020/8/30
 * @description
 */
public class SendTest {
    public static void main(String[] args) {
        DatagramSocket ds = null;
        try {
            //1. 创建DatagramSocket类型的对象
            ds = new DatagramSocket();
            //2. 创建DatagramSocket类型对象并提供接收方的通信地址和端口
            byte[] bArr = "hello".getBytes();
            DatagramPacket dp = new DatagramPacket(bArr, bArr.length, InetAddress.getLocalHost(), 8888);
            //3. 通过 Socket发送Packet,调用send方法
            ds.send(dp);
            System.out.println("发送数据成功!");
            //4. 接受回发消息
            byte[] bArr2 = new byte[20];
            DatagramPacket dp2 = new DatagramPacket(bArr2, bArr2.length);
            ds.receive(dp2);
            System.out.println("接收到的回发消息内容是:" + new String(bArr2, 0, dp2.getLength()));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4. 关闭Socket并释放有关的资源
            if(ds != null) {
                ds.close();
            }
        }
    }
}

4. URL类(熟悉)

(1) 基本概念

image.png

(2)常用的方法

image.png

(3)URLConnection类

image.png

package com.lagou.task19;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * @author 西风月
 * @date 2020/8/30
 * @description
 */
public class URLTest {
    public static void main(String[] args) {
        URL url = null;
        try {
            url = new URL("https://www.lagou.com");
            System.out.println("获取到的协议名称是:"+ url.getProtocol());
            System.out.println("获取到的主机名称是:" + url.getHost());
            System.out.println("获取到的端口号是:" + url.getPort());
            //获取URLConnection类的实例
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream i = urlConnection.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(i));
            String str = null;
            while((str = br.readLine()) != null) System.out.println(str);
            br.close();
            //断开连接
            urlConnection.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //省略不写....
        }
    }
}

5. 总结

  • 网络编程
    • 网络编程的常识
    • tcp协议的编程模型
      • image.png
    • udp协议的编程模型
  • URL类的概念