网络编程

70 阅读4分钟

image.png

1.网络通信三要素

image.png

1.IP地址

1.1.1 IP地址的概述

image.png IPV6 image.png

ip域名

image.png 公网IP,内网IP,特殊IP地址,IP常用命令

image.png

小结

image.png

1.1.2 获取ip地址的常用方法

image.png 案例实现

image.png

2.端口

2.1端口的概述、分类以及注意事项

image.png

2.2 小结

image.png

3.通信协议

3.1 通信协议概述以及网络标准参考模型

image.png

image.png

3.2两个通信协议TCP和UDP

image.png

3.3 UDP协议

image.png

3.4TCP协议

3.4.1 TCP协议:三次握手建立可靠连接

image.png

3.4.2 TCP协议:四次挥手断开连接

image.png

3.5 UDP协议和TCP协议小结及应用场景

image.png

3.6小结

image.png

2. UDP通信

2.1 Java中如何实现UDP通信

image.png

2.2 常用方法

image.png

2.3 使用UDP实现通信的实现方法(一发一收)

image.png 代码实现

image.png

2.4 小结

image.png

2.5 使用UDP实现通信的实现方法(多发多收)

实现步骤 image.png

image.png

image.png

image.png

3. TCP通信

3.1 JAVA中如何实现TCP通信

image.png

3.2 Tcp通信-客户端开发

image.png image.png 代码实现

image.png

package com.java04_network.network_programing.tcp01;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("-----服务端启动成功-----");
        //1.创建ServerSocket的对象,同时为服务端注册端口
        ServerSocket serverSocket=new ServerSocket(8888);

        //2.使用serverSocket对象,调用一个accept方法,等待客户端连接请求
        Socket socket=serverSocket.accept();

        //3.从socket通信管道中得到一个字节输入流
        InputStream is=socket.getInputStream();

        //4.把原始的字节输入流包装成数据输入流
        DataInputStream dis=new DataInputStream(is);

        //5.使用数据输入流读取客户端发来的消息
        String rs=dis.readUTF();
        System.out.println(rs);
        //其实我们也可以获取客户端的ip地址
        System.out.println(socket.getRemoteSocketAddress());

        dis.close();
        socket.close();

    }


}

3.3 TCP通信服务端程序的开发

image.png

image.png

代码实现

image.png

package com.java04_network.network_programing.tcp01;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 目标:完成TCP通信快速入门-客户端开发:实现1发1收
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //4.开始写数据出去
        dos.writeUTF("哈哈哈哈哈");
        dos.close();

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

3.4 TCP 通信多发多收消息

当客户端的Socket关闭后,服务端中的Soket将会抛出异常 image.png 代码实现

image.png Client

package com.java04_network.network_programing.tcp02;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 目标:完成TCP通信快速入门-客户端开发:实现1发1收
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("192.168.120.254", 9527);

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说");
            String msg=sc.nextLine();
          //一旦用户输入exit就退出客户端程序
            if ("exit".equals(msg)){
                System.out.println("欢迎您下次光临,退出成功");
                dos.close();
                socket.close();
                break;
            }

        //4.开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }

    }
}

Server

package com.java04_network.network_programing.tcp02;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("-----服务端启动成功-----");
        //1.创建ServerSocket的对象,同时为服务端注册端口
        ServerSocket serverSocket=new ServerSocket(8888);

        //2.使用serverSocket对象,调用一个accept方法,等待客户端连接请求
        Socket socket=serverSocket.accept();

        //3.从socket通信管道中得到一个字节输入流
        InputStream is=socket.getInputStream();

        //4.把原始的字节输入流包装成数据输入流
        DataInputStream dis=new DataInputStream(is);

        while (true) {
            try {
                //5.使用数据输入流读取客户端发来的消息
                String rs=dis.readUTF();
                System.out.println(rs);
            } catch (IOException e) {
                System.out.println(socket.getRemoteSocketAddress()+"离线了");
                dis.close();
                socket.close();
                break;
            }

            //其实我们也可以获取客户端的ip地址
            System.out.println(socket.getRemoteSocketAddress());
        }

    }


}

3.5 实现TCP与多个客户端进行通信

3.5.1 上述3.4中的TCP通信可以进行与多个客户端进行通信吗?

image.png

3.5.2 利用多线程与多个客户端进行通信

image.png 代码实现如下

image.png Client

package com.java04_network.network_programing.tcp03;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 目标:完成TCP通信快速入门-客户端开发:实现1发1收
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 9527);

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说");
            String msg=sc.nextLine();
          //一旦用户输入exit就退出客户端程序
            if ("exit".equals(msg)){
                System.out.println("欢迎您下次光临,退出成功");
                dos.close();
                socket.close();
                break;
            }

        //4.开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }

    }
}

Serve

package com.java04_network.network_programing.tcp03;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
  public static void main(String[] args) throws IOException {
      System.out.println("-----服务端启动成功-----");
      //1.创建ServerSocket的对象,同时为服务端注册端口
      ServerSocket serverSocket=new ServerSocket(8888);



      while (true) {
          //2.使用serverSocket对象,调用一个accept方法,等待客户端连接请求
          Socket socket=serverSocket.accept();
          System.out.println("有人上线了"+socket.getRemoteSocketAddress());
          //3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理。
          new ServerReaderThread(socket).start();

      }

  }
}
**ServerReadThread**
```java
package com.java04_network.network_programing.tcp03;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ServerReaderThread extends Thread{
    private Socket socket;//创建一个socket对象用来接收传参过来的

    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //创建一个socket输入流
            InputStream is=socket.getInputStream();

            //将其变为包装类
            DataInputStream dis=new DataInputStream(is);

            //获取数据读入客户端传输的信息
            while (true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                } catch (IOException e) {
                    System.out.println("有人下线了" + socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}