15.JavaSE-网络

网络的相关概念

网络

概念:两台或多台设备通过一定物理设备连接起来构成了网络。

根据网络的覆盖范围不同,对网络进行分类:

局域网 :覆盖范围最小,仅仅覆盖一个教室或一个机房

城域网 :覆盖范围较大,可以覆盖一个城市

广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表

网络通信

概念:将数据通过网络从一台设备传输到另一台设备的过程。java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信

ip地址

概念:用于唯一标识某个域内网络中的每台计算机/主机。

ipv4

ip地址的表示形式:点分十进制xxx.xxx.xxx.xxx,一个十进制数的范围:0~255, 共4个字节。

ip地址的组成=网络地址(网段)+主机地址,比如:192.168.16.69

ipv4分类

ipv6

由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展,那么ipv6就诞生了。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。lPv6是互联网工程任务组设计的用于替代lPv4的下一代lP协议,其地址数量号称可以为全世界的每一粒沙子分配一个地址。

ipv6共8位16个字节,每段使用16进制表示(两个字节表示一位)。

域名
  1. www.baidu.com
  2. 好处:为了方便记忆,解决记ip的困难
  3. 概念:将ip地址映射成域名
端口号
  1. 概念:用于标识计算机上某个特定的网络程序

  2. 表示形式:以整数形式,范围0~65535

  3. 0~1024已经被占用,比如ssh 22, ftp 21, smtp 25 http 804.

    常见的网络程序端口号:tomcat :8080 mysql:3306 oracle:1521 sqlserver:1433

网络通讯协议

TCP/IP (Transmission ControlProtocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议 ,又叫网络通讯协议 ,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

网络协议模型

tcp

tcp协议:传输控制协议

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

UDP协议:用户数据协议

  1. 将数据、源、目的封装成数据包,不需要建立连接, 故是不可靠的
  2. 每个数据包的大小限制在64K内,不适合传输大量数据
  3. 发送数据结束时无需释放资源(因为不是面向连接的),速度快

InetAddress类

相关方法
  1. 获取本机InetAddress对象:getLocalHost

  2. 根据指定主机名/域名获取ip地址对象:getByName

  3. 获取InetAddress对象的主机名:getHostName

  4. 获取InetAddress对象的地址:getHostAddress

java 复制代码
public class InetAddress_ {
    public static void main(String[] args) throws UnknownHostException {
        //获取主机对象
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost); //DESKTOP-SNBR0RM/192.168.83.1
        //根据主机名获取InetAddress对象
        InetAddress name = InetAddress.getByName("DESKTOP-SNBR0RM");
        System.out.println(name);//DESKTOP-SNBR0RM/192.168.83.1
        //根据域名获取ip地址InetAddress对象
        InetAddress host = InetAddress.getByName("www.qq.com");
        System.out.println(host);//www.qq.com/183.194.238.19
        //获取host对象的主机名
        System.out.println(host.getHostName());//www.qq.com
        //获取host对象的ip地址
        System.out.println(host.getHostAddress());//183.194.238.19
    }
}

Socket

所谓Socket,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。

  2. 通信的两端都要有Socket,是两台机器间通信的端点

  3. 网络通信其实就是Socket间的通信。

  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输.

  5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

tcp网络编程

基于客户端与服务端的网络通信,底层使用的是TCP/IP协议,基于Socket的TCP编程。

SocketServer_.java

java 复制代码
public class SocketServer_ {
    public static void main(String[] args) throws IOException {
        //创建一个socket服务端,监听端口9999(要求端口未被占用),等待客户端连接
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("等待客户端连接...");
        //等待客户端链接, 每一个客户端连接客户端都会accept(),都会创建一个socket对象。
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();
        //使用处理流包装输入输出对象
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));
        String line = br.readLine();
        System.out.println("client:" + line);
        System.out.println("server: hello client");
        bw.write("hello client");
        bw.newLine();//插入一个换行符,表示写入内容结束。需要另一端必须使用readLine读取
        bw.flush(); //如果使用字符流,必须使用flush方法刷新,否则数据不会写入数据通道
        //关闭连接
        bw.close();
        br.close();
        socket.close();
        serverSocket.close();
    }
}

SocketClient_.java

java 复制代码
public class SocketClient_ {
    public static void main(String[] args) throws IOException {
        //创建客户端连接,连接到服务器
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        OutputStream outputStream = socket.getOutputStream();
        InputStream inputStream = socket.getInputStream();
        //使用处理流包装输入输出
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream));
        System.out.println("cline: hello server");
        bw.write("hello server");
        bw.newLine();//插入一个换行符,表示写入内容结束。需要另一端必须使用readLine读取
        bw.flush(); //如果使用字符流,必须使用flush方法刷新,否则数据不会写入数据通道
        String line = br.readLine();
        System.out.println("server:" + line);

        //关闭连接
        br.close();
        bw.close();
        socket.close();
    }
}

传输二进制文件

SocketTransferFileServer_.java

java 复制代码
public class SocketTransferFileServer_ {
    public static void main(String[] args) throws IOException {
        String saveFilePath = "E:\\javacode\\j2se\\javanet\\src\\girl.jpg";
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();

        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFilePath));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        byte[] buf = new byte[16384];
        int readNum;
        while ((readNum = bis.read(buf)) != -1){
            System.out.println(readNum);
            bos.write(buf, 0, readNum);
        }
        System.out.println(readNum);
        System.out.println("写入完成");
        bw.write("收到图片");
        bw.newLine();
        bw.flush();
        socket.shutdownOutput();
        socket.shutdownInput();
        //关闭服务
        bos.close();
        socket.close();
        serverSocket.close();
    }
}

SocketTransferFileClinet_.java

java 复制代码
public class SocketTransferFileClinet_ {
    public static void main(String[] args) throws IOException, InterruptedException {
        String filePath = "C:\\Users\\light\\Pictures\\idea\\t01270ab8ddc1fb926e.jpg";
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        byte[] buf = new byte[16384];
        int readNum;
        while ((readNum = bis.read(buf)) != -1){
            System.out.println(readNum);
            bos.write(buf, 0, readNum);
        }
        socket.shutdownOutput(); //网络传输完成之后紧跟这必须必须进行socket.shutdownOutput(),表示发送已完成
        System.out.println("发送完成");
        String s = br.readLine();
        if ("收到图片".equals(s)){
            System.out.println(s);
        }
        bis.close();
        socket.close();
    }
}

netstat命令

  1. netstat -an可以查看当前主机网络情况,包括端口监听情况和网络连接情况,-b参数表示那个程序监听这个端口
  2. netstat -an | more可以分页显示
  3. findstr 可以过滤信息

    第一列表示协议,第二列表示本机/服务端监听端口,第三轮表示客户端连接情况,第四列表示状态

当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口是TCP/IP协议来随机分配的。

UDP网络编程

基本介绍
  1. 类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。

  2. UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

  4. UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

基本流程
相关推荐
const_qiu2 小时前
第二章 2.4:搭建 Monorepo 骨架 + 共享包 @autix/contracts
java·人工智能·arcgis
兰亭妙微UI设计公司2 小时前
兰亭妙微软件界面设计公司的解锁按钮设计10大密码
开发语言·前端·javascript
星恒讯工业路由器2 小时前
5G RedCap、eRedCap与LTE Cat-1bis:中低速物联网的“三国杀“与选型指南
网络·智能路由器·工业路由器·工业物联网·5g redcap·lte cat-1bis·eredcap
人邮异步社区2 小时前
C语言好学,还是Python好学?
c语言·开发语言·python
艾芯微科技2 小时前
ETA1637S2G|钰泰同步升压 LED 背光驱动 SOT23-6,0.1% 超低占空比 PWM 调光
网络·单片机·嵌入式硬件·集成测试·51单片机
栈帧之外2 小时前
【C++】红黑树实现
开发语言·c++
程序员老陆2 小时前
C++中同一个回调函数被多个设备并发调用:并发问题不在“函数”,而在“状态”
开发语言·c++·程序设计
wangchunyu1143 小时前
JDK8新特性实战(Lambda、Stream、Optional)
java·开发语言
鱼宵3 小时前
工厂模式实战:消灭魔法数字,把写死的 new 收进一个厂里
开发语言·python