IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java网络编程(狂神学习笔记) 2021-09-22 -> 正文阅读

[Java知识库]Java网络编程(狂神学习笔记) 2021-09-22

网络编程

1.1 概述

计算机网络:

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

网络编程的目的:

无线电台…传播交流信息,数据交换。通信

想要达到这个效果需要什么:

  1. 如何准确的定位网络上的一台主机192.168.16.124: 端口,定位到这个计算机上的某个资源

  2. 找到了这个主机,如何传输数据呢?

javaweb:网页编程 B/S
网络编程: TCP/P C/S

1.2 网络通信要素

如何实现网络的通信?
通信双方地址:
●ip
●端口号
●192.168.16,124:5900
规则:网络通信的协议

TCP/IP参考模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sl6TxOtq-1632295602135)(%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0.assets/20200922102351932.png)]

小结:

  1. 网络编程中有两个主要的问题
    • 如何准确的定位到网络上的一台或者多台主机
    • 找到主机之后如何进行通信
  2. 网络编程中的要素
    • IP和端口号
    • 网络通信写协议
  3. 万物皆对象

1.3 IP地址

IP地址在 JavaInetAddress 类中

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

  • 本机127.0.0.1: localhost.

  • IP地址的分类

    • IPV4/ IPV6协议

    Pv4 127.0.0.1, 4个字节组成,0~255, 42亿~ ; 30亿在北美,亚洲4亿。2011年用尽

    IPv6 2001:3CA1:010F:001A:121B:0000:0000:0010 128位。 8个无符号整数

  • 公网(互联网)-私网(局域网)

    • 192.168.xx.xx 一般来说是局域网,给组织内部使用
    • ABCD类地址(以下地址为IPv4地址)
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k41BTUja-1632295602140)(%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0.assets/20201031104203169.png)]
  • 域名:记忆IP问题!

    • IP: www.vip.com
package com.kuang.ip;

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

public class TestInetAddress {

    public static void main(String[] args) {
        try {
            //查询本机地址
            InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress1);
            InetAddress inetAddress2 = InetAddress.getByName("localhost");
            System.out.println(inetAddress2);

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

            //查询网站ip
            InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress4);

            //常用方法
            System.out.println(inetAddress4.getAddress());
            System.out.println(inetAddress4.getCanonicalHostName());//规范名字
            System.out.println(inetAddress4.getHostAddress());//ip
            System.out.println(inetAddress4.getHostName());//域名,或者自己电脑的名字

        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

运行结果

/127.0.0.1
localhost/127.0.0.1
LAPTOP-0SJUQ8J4/192.168.56.1
www.baidu.com/61.135.185.32
[B@4554617c
61.135.185.32
61.135.185.32
www.baidu.com

1.4 端口

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

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

  • 一般被规定为0~65535

  • TCP, UDP 每个协议都有65535,所以总共有 65535 * 2个端口。在单个协议下端口号不能冲突

  • 端口分类

    • 公有端口 0~1023

      HTTP:80
      HTTPS:443
      FTP:21
      Telent: 23

  • 程序注册端口:1014~49151,分配给用户或者程序

    Tomcat:8080
    MySQL:3306
    Oracle:1521

  • 动态、私有端口:49152~65535

netstat -ano #查看所有端口
netstat -ano|findstr "5900" #查看指定端口
tasklist|findstr "8696" #查看指定端口的进程
package com.kuang.ip;

import java.net.InetSocketAddress;

public class TestInetSocketAddress {
    public static void main(String[] args) {

        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
        System.out.println(inetSocketAddress);

        System.out.println(inetSocketAddress.getAddress());
        System.out.println(inetSocketAddress.getHostName());//地址
        System.out.println(inetSocketAddress.getPort());//端口

    }
}

运行结果

/127.0.0.1:8080
/127.0.0.1
eureka7001.com
8080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nbkI4ei-1632295602145)(%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0.assets/20201031111639328.png)]

1.5 通信协议(TCP/IP)

协议:约定,就好比我们现在说的是普通话

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

问题:非常的复杂?———大事化小:分层!

TCP/IP协议簇:实际上是一组协议

重要:

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

出名的协议:

  • TCP :用户传输协议
  • IP:网络互连协议

TCP和UDP对比

TCP:打电话

  • 连接,稳定
  • 三次握手 四次挥手
A:你瞅啥?

B:瞅你咋地?

A:干一场!
A:我要走了!

B:你真的要走了吗?

B:你真的真的要走了吗?

A:我真的要走了!
  • 客户端、服务端
  • 传输完成,释放连接,效率低

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGZwE8U6-1632295602151)(%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0.assets/20201031112225802.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrCzImxs-1632295602155)(%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0.assets/20201031112750897.png)]

UDP: 发短信

  • 不连接,不稳定
  • 客户端、服务端:没有明确的界限
  • 不管有没有准备好,都可以发给你…
  • 导弹
  • DDOS:洪水攻击! (饱和攻击)

1.6 TCP实现聊天

TCP

客户端

连接服务器Socket
发送消息

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClientDemo01 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        try {
            //1.要知道服务器的地址 端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
             socket = new Socket(serverIP,port);
            //3.发送消息 IO流
             os = socket.getOutputStream();
            os.write("逍遥醉酒".getBytes());

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

服务器

服务器

建立服务的端口 ServerSocket
等待用户的链接 accept
接收用户的消息

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

public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            //1.我要有一个地址
             serverSocket = new ServerSocket(9999);
            //2.等待客户端连接过来
             socket = serverSocket.accept();
            //3.读取客户端的信息
             is = socket.getInputStream();
            //管道流
             baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件上传

客户端

import sun.nio.cs.ext.ISCII91;
import sun.security.util.Length;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
        //1.创建socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
        //2.创建输出流
        OutputStream os = socket.getOutputStream();
        //3.读取文件
        FileInputStream files = new FileInputStream(new File("qun.jpg"));
        //4.写文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len=files.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        
        //通知服务器,我已经发送完毕
        socket.shutdownOutput();

        //确定服务器接受完毕,才能断开连接
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2=inputStream.read(buffer2))!=-1){
            baos.write(buffer2,0,len2);
        }
        System.out.println(baos.toString());
        
        //5.关闭资源   
        baos.close();
        inputStream.close();
        files.close();
        os.close();
        socket.close();
    }
}

服务端

package com.tree.lesson02;
import sun.misc.OSEnvironment;

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

public class TcpServerDemo02 {
    public static void main(String[] args) throws IOException {
        //1.创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //2.监听客户端的连接
        Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //3.获取输入流
        InputStream is = socket.getInputStream();
        //4.文件输出
        FileOutputStream files = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            files.write(buffer,0,len);
        }
        
        OutputStream os = socket.getOutputStream();
        os.write("我接受完毕了,你可以断开了".getBytes());
        
        files.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

1.7 UDP

发送消息

发送端

public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //2.建个包
        String msg = "逍遥自在";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
        //3.发送包
        socket.send(packet);
        //关闭流
        socket.close();
    }
}

接收端

public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
        //1.开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //2.接受数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);//阻塞接收

        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //3.关闭连接
        socket.close();
    }
}
咨询

循环发送

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));

            socket.send(packet);
            if ("bye".equals(data)){
                break;
            }
        }
        socket.close();
    }
}

循环接收

public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);

        while (true){
            //准备接收包裹
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
            socket.receive(packet);//阻塞式接收包裹

            //断开连接
            byte[] data = packet.getData();
            String receiveData = new String(data, 0, data.length);
            System.out.println(receiveData);
            if (receiveData.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

小结

利用UDP协议发送数据,只需要“需要发送的数据+对方IP+对方Port”。
接收数据则只需要设置自己的Port即可。

1.8 URL

https://www.baidu.com/

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

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

方法解析

import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");
        System.out.println(url.getProtocol());//协议
        System.out.println(url.getHost());//主机ip
        System.out.println(url.getPort());//端口
        System.out.println(url.getPath());//文件
        System.out.println(url.getFile());//全路径
        System.out.println(url.getQuery());//参数
    }
}

运行结果

http
localhost
8080
/helloworld/index.jsp
/helloworld/index.jsp?username=kuangshen&password=123
username=kuangshen&password=123

通过url下载网络资源

public class UrlDownLoad {
    public static void main(String[] args) throws Exception {
        //1.下载地址
        URL url = new URL("https://win-web-rc01-sycdn.kuwo.cn/303bdee656bd4a7ae6a0cfa8538f1157/614ad690/resource/n3/60/82/1536711583.mp3");
        //2.连接
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream outputStream = new FileOutputStream("逍遥.mp3");
        byte[] bytes = new byte[1024];
        int len;
        while ((len=inputStream.read(bytes))!=-1){
            outputStream.write(bytes,0,len);
        }
        outputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:01:22  更:2021-09-26 10:02:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:02:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码