网络编程

网络编程

学些的教程地址:狂神说Java 网络编程

本篇笔记的md文件:百度网盘,提取码:0ku7,如有需要可以下载使用,但不可用于付费商用


一、概述

1. 计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

——百度百科


2. 网络编程目的

  • 无线电台等广播,传播信息
  • 网络通信、数据交换

3. 想要达到的效果需要什么

  1. 定位网络上的一台主机:IP,如:127.0.0.1。
  2. 定位主机上的某个资源:端口:8080
  3. 如何传输数据:
    1. javaweb 网页编程 B/S;
    2. 网络编程 TCP/IP C/S

二、网络通信的要素

如何实现网络的通信

通信双方地址:

  • IP
  • 端口号
  • 127.0.0.1:8080

规则:网络通信的协议

TCP / IP 参考模型

image-20210309130729159

TCP 协议:交互的,就像打电话

UDP 协议:广播性质的,只负责发送,不管对方接不接收


三、IP

1. IP 地址

  • 唯一定位一台网络上计算机

  • 127.0.0.1:本机ip地址 (或:localhost)

  • IP 地址分类

    • IPv4 / IPv6

      • IPv4 :4个字节组成,32位。如:127.0.0.1。每个字节代表0~255。约42亿个
      • IPv6:8个无符号整数!,128位。如:2011:2011:2011:2011:2011:2011:2011:2011!
    • 公网 (互联网) - 私网(局域网)

      • ABCD类地址
      • 192.168.xxx.xxx,专门给组织内部使用
  • 域名:记忆 IP 问题

    • IP - 域名

2. InetAddress

此类表示Internet协议(IP)地址。 ——Jdk1.8 API

常用方法
  • getAllByName:给定主机的名称
  • getByName:参数是IP字符串或域名,返回InetAddress对象
  • getCanonicalHostName:返回规范的IP地址
  • getHostName:返回域名,或者自己主机名或IP地址

四、端口

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

  • 不同的进程有不同的端口号,用来区分软件

  • 端口范围:0~65535

  • TCP,UDP:65535 * 2,也就是说TCP有65536个,UDP有63356个。同一个协议下端口号不能冲突

  • 端口分类

    • 公有端口:0~1023

      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telent:23
    • 程序注册端口:1024~49151,分配给用户或者程序

      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 动态、私有:49152~65535

常用查询语句

netstat -ano #查看所有的端口
netstat -ano|findstr"5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
#Ctrl + shift + ESC 调出任务管理器

五、通信协议

协议:约定,就好比我们说的都是普通,这就是协议

网络通信协议:速率、传输码率、代码结构、传输控制。。。

采用分层策略


1. TCP/IP协议簇

  • TCP: 用户传输协议
  • UDP:用户数据协议

其中IP:网络互连协议。TCP和IP实际上是一层协议

image-20210309130729159

2. TCP与UDP对比

TCP:类比为打电话

  • 需要互连,稳定

  • 三次握手、四次挥手

  • 客户端、服务端(主从)

UDP:类比为发短信

  • 不连接、不稳定

  • 客户端、服务端:没有明确界定

  • 不管有没有准备好,都可以发给你

  • DDOS:洪水攻击


3. TCP 客户端向服务端通信

ServerSocket:服务连接

本示例实现客户端向与服务端通信

示例:先启动服务器端,再启动客户端,在客户端的控制台输入文本信息回车,服务器端就能接收并打印接收到的文本。

​ 客户端输入exit关闭服务器端。客户端输入exit()关闭客户端。如果客户端连不到服务器端抛出异常并捕获输出:服务器中断!

服务端
public static void main(String[] args) {
    InputStream is = null;
    ByteArrayOutputStream baos = null;
    try {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("开始监听!");
        while (true) {
            Socket accept = serverSocket.accept();
            is = accept.getInputStream();
            int len = 0;
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            if ("exit".equals(baos.toString())) {
                System.out.println("侦听停止,退出服务器端!");
                break;
            } else {
                System.out.println("> " + baos.toString());
            }
            accept.close();
        }
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}
客户端
public static void main(String[] args) {
    BufferedReader br = null;
    OutputStream os = null;
    try {
        System.out.println("启动客户端");
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 9999;
        while (true) {
            System.out.print("> ");
            br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
            if("exit()".equals(str)) {
                System.out.println("退出客户端");
                break;
            }
            Socket socket = new Socket(address, port);
            os = socket.getOutputStream();
            os.write(str.getBytes());
            socket.close();
        }
    } catch (ConnectException e) {
        System.out.println("服务器中断!");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}

4. TCP 文件上传

本示例实现客户端向与服务端发送文件

示例:先启动服务器端,再启动客户端,客户端将本地的文件发送给服务器端,服务端将文件保存至磁盘中

需要先准备一个文件

服务端
public static void main(String[] args) {
    ServerSocket socket = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try {
        // 1. 创建服务
        socket = new ServerSocket(9000);
        // 2. 监听客户端的连接,一直处于阻塞状态,等待客户端连接
        Socket accept = socket.accept();
        // 3. 获取输入流
        is = accept.getInputStream();
        // 4. 文件输出流
        fos = new FileOutputStream(new File("d:/b/234.jpg"));
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        fos.flush();
        accept.close();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}
客户端
public static void main(String[] args) {
    Socket socket = null;
    InputStream is = null;
    OutputStream os = null;
    try {
        socket = new Socket("127.0.0.1", 9000);
        is = new FileInputStream(new File("d:/a/123.jpg"));
        os = socket.getOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}

5. UDP 发送消息

不需要连接服务器,只需要知道对方地址就可以

DatagramSocket:数据报连接

没有界定的客户端和服务器端,都可以发送数据,也都可以接收数据

发送端
public static void main(String[] args) {
    DatagramSocket socket = null;
    try {
        // 1. 创建一个Socket
        socket = new DatagramSocket(8090);

        // 2. 创建发送的包
        String msg = "你好, UDP!";
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 9090;

        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, address, port);

        // 3. 发送包
        socket.send(packet);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}

此时不需要接收端,都能执行,并不需要对方响应

接收端
public static void main(String[] args) {
    DatagramSocket socket = null;

    try{
        // 创建数据报连接
        socket = new DatagramSocket(9090);
        // 创建缓存数组
        byte[] buffer = new byte[1024];
        // 创建数据包
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        // 阻塞监听数据包
        socket.receive(packet);
		// 打印接收到的信息:主机名和数据
        System.out.println(packet.getAddress().getHostName());
        System.out.println(packet.getPort());
        System.out.println(new String(packet.getData()));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // IO 流关闭
    }
}

6. URL

https://www.tqazy.com

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS 域名解析:

协议://ip地址:端口/项目名/资源

Java 类:URL


1. 常用方法
  • getProtocol:获取协议
  • getHost:获取主机IP
  • getPort:获取端口
  • getPath:获取文件地址
  • getFile:获取文件全路径
  • getQuery:获取参数

2. 下载文件

这是一个下雨白噪音的.m4a

public static void main(String[] args) throws Exception {
    // 1.下载地址
    URL url = new URL("https://rainymood.com/audio1112/0.m4a");

    // 2.连接到这个资源 HTTP
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

    InputStream is = urlConnection.getInputStream();

    FileOutputStream fos = new FileOutputStream("d:/123.m4a");

    byte[] buffer = new byte[1024];
    int len = 0;

    while ((len = is.read(buffer)) != -1) {
        fos.write(buffer, 0, len);
    }
    fos.flush();
}

本文完。

这里的网络编程只是最简单最基础的部分,更多的以后我用到了学到了会继续更新

祝君有所收获,完结撒花!

如果您想关注更多,可以点击以下链接:

回到学习路线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值