Java网络编程01

21/04/09


网络

概念

  • 有点和线构成,表示诸多对象间的相互联系

计算机网络

  • 为实现资源共享和信息传递,用过通信线路连接起来的若干主机(Host)
  • 互联网:(Internet)点与点相连
  • 万维网:(WWW - World Wide Web)端与端相连
  • 物联网:(Iot - Internet of things)物与物相连
  • **网络编程:**让计算机与计算机之间建立连接、进行通信

网络模型

OSI模型&TCP/IP模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTWxnyYz-1617950341453)(C:\Users\Cheng\AppData\Roaming\Typora\typora-user-images\image-20210409121038745.png)]

通信协议

TCP/UDP

  • TCP协议:
    Transmission Control Protocol传输控制协议
  • 是一种面向连接、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次捂手,断开连接的过程需要四次挥手
  • UDP协议:
    User Datagram Protocol用户数据报协议
  • 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB

IP与端口

了解IP

  • IP协议:
    Internet Protocol Address互联网协议地址/网络协议地址
  • 分配给互联网设备的数字标签(唯一标识)
  • IP地址分为两种:
  • IPV4:
    4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位整数可以转换为一个0~255的十进制整数
  • 格式: D.D.D.D
  • 例如: 255.255.255.255
  • IPV6:
    16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每6位整数可以转换为一个0~65535的十进制数
  • 格式: X.X.X.X.X.X.X.X
  • 例如: FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF

IPV4的应用分类

  • A类: 政府机构,1.0.0.1~126.255.255.254
  • B类: 中型企业,128.0.0.1~191.255.255.254
  • C类: 个人用户,192.0.0.1~223.255.255.254
  • D类: 用于组播,224.0.0.1~239.255.255.254
  • E类: 用于实验,240.0.0.1~255.255.255.254
  • 回环地址: 127.0.0.1,指本机,一般用于测试使用
  • 查看IP命令: ipconfig
  • 测试IP命令: ping D.D.D.D

网络编程

InetAddress类

  • 概念: 表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法
  • 方法:
  • public static InetAddress getLocalHost() //获得本机主机地址对象
  • public static InetAddress getByName(String host) //根据主机名称获得地址对象
  • public static InetAddress[] getAllByName(String host) //获得所有相关地址对象
  • public String getHostAddress() //获取IP地址字符串
  • public String getHostName() //获取IP地址主机名
  • getPort() //获取端口号
package com.net;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class TestInetAddress {
    public static void main(String[] args) {
        try {
            //      127.0.0.1   查询本机ip
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");

            InetAddress inetAddress3 = InetAddress.getByName("localhost");

            InetAddress inetAddress4 = InetAddress.getLocalHost();
            System.out.println(inetAddress1);
            System.out.println(inetAddress3);
            System.out.println(inetAddress4);

            //      查询网站地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);

            //      常用方法
            //System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostAddress());//Ip
            System.out.println(inetAddress2.getHostName());//域名或电脑名
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}
输出结果:
/127.0.0.1
localhost/127.0.0.1
DESKTOP-LKAPH2R/10.120.60.214
www.baidu.com/110.242.68.4
110.242.68.4
110.242.68.4
www.baidu.com

进程完成,退出码 0

Port(端口)

  • 端口号: 在通信实体上进行网络通讯的程序的唯一标识

端口表示计算机上的一个程序的进程:

  • 不同的进程有不同的端口号!用来区分软件!
  • 被规定在0~65535
  • TCP,UDP:65535*2 单个写一下,端口号不能冲突
  • 端口分类:
  • 共有端口0~1023
  • HTTP:80
  • HTTPS:443
  • FTP:21
  • Telent:23
  • 程序注册端口:1024~49151,分配用户或者程序
  • Tomcat:8080
  • MySQL:3306
  • Oracle:1521
  • 动态、私有的:49152~65535

基于TCP的网络编程(Socket)

  • Socket编程:
  • Socket(套接字)是网络中的一个通信节点
  • 分为客户端Socket与服务端ServerSocket
  • 通信要求: IP地址 + 端口号

Socket编程开发步骤

  • 建立通信连接(会话):
  • 创建ServerSocket,指定端口号
  • 调用accept等待客户端接入
  • 客户端请求服务器:
  • 创建Socket,指定服务器IP + 端口号
  • 使用输出流,发送请求数据给服务器
  • 使用输入流,接收响应数据到客户端(等待)
  • 服务器响应客户端:
  • 使用输入流,接收请求数据到服务器(等待)
  • 使用输出流,发送响应数据给客户端

服务器和客户端相互请求问好案例

客户端

package com.net;

import sun.nio.cs.UTF_32;

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

/*
 * 客户端
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建客户端(套接字),连接指定的IP + 端口号
        Socket client = new Socket("127.0.0.1",6666);

        //2.获取输入输出流
        InputStream inputStream = client.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        OutputStream outputStream = client.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,"UTF-8");
        PrintWriter printWriter = new PrintWriter(outputStreamWriter);

        //3.发送数据
        printWriter.println("你好,我是客户端!");
        printWriter.flush();//刷新缓冲区

        //4.接收响应数据
        String message = bufferedReader.readLine();
        System.out.println("服务器客户端用户:"+ message);

        //5.关闭流和客户端
        bufferedReader.close();
        printWriter.close();
        client.close();
    }
}

服务器端

package com.net;

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

/*
 * 服务器端
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建服务器端(套接字)
        ServerSocket server = new ServerSocket(6666);
        System.out.println("服务器已启动");

        //2.调用accept等待客户端
        Socket client = server.accept();

        //3.通过客户端获取输入输出流
        InputStream inputStream = client.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        OutputStream outputStream = client.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        PrintWriter printWriter = new PrintWriter(outputStreamWriter);

        //4.读取数据
        String message = bufferedReader.readLine();
        System.out.println("客户端用户:"+ message);

        //6.关闭流、客户端和服务器端
        bufferedReader.close();
        printWriter.close();
        client.close();
        server.close();
    }
}

TCP文件上传实现

客户端

package com.net;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端接收文件
public class FileServer {
    public static void main(String[] args) throws Exception {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(8888);

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

        //3.获取输入流
        InputStream is = socket.getInputStream();

        //4.文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));

        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!= -1){
            fos.write(buffer,0,len);
        }

        //5.关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();

    }
}

服务器端

package com.net;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端接收文件
public class FileServer {
    public static void main(String[] args) throws Exception {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(8888);

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

        //3.获取输入流
        InputStream is = socket.getInputStream();

        //4.文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));

        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!= -1){
            fos.write(buffer,0,len);
        }

        //5.关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();

    }
}

IO流知识巩固

byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!= -1){
            fos.write(buffer,0,len);
        }
----------------------------------------------
byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!= -1){
            fos.write(buffer,0,len);
        }