zoukankan      html  css  js  c++  java
  • java网络编程【b站狂神课程笔记】

    1.1 概述

    类似于平信信件

    其中涉及计算机网络基本概念,网络编程的目的就是传播交流信息、数据交换、通信;达到的效果是需要如何准确定位到网络上的一台主机(IP、端口、资源),对主机进行数据传输

    与JAVAWEB网页编程的B/S架构不同,网络编程是C/S编程

    1.2 网络通信的要素

    如何实现网络的通信?

    1. 通信双方的ip端口号
    2. 规则:TCP/IP 、OSI

    小结:

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

    1.3 IP

    ip地址:InetAddress

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

    • 127.0.0.1 本机localhost

    • ip地址的分类

      • ipv4 / ipv6

        • IPV4 127.0.0.1 四个字节组成 已被用尽

        • IPV6 128位、8个无符号整数组成

          2834:4bba:aacb:0013:1241:1aaa:1341:6254

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

    • 域名:记忆IP问题

    获取相关信息

    package com.company.lesson01;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    // 测试IP
    public class TestInetAddress {
        public static void main(String[] args) {
            try {
                // 查询本机地址
                InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
                System.out.println(inetAddress1);
                InetAddress inetAddress3 = InetAddress.getByName("localhost");
                System.out.println(inetAddress3);
                InetAddress inetAddress4 = InetAddress.getLocalHost();
                System.out.println(inetAddress4);
    
                // 查询网络地址
                InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
                System.out.println(inetAddress2);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    

    1.4 端口

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

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

    • 被规定 0 - 65535

    • TCP,UDP

    • 端口分类

      • 公有端口 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 "****" # 查看指定端口
        tasklist|findstr "****" # 查看指定端口的进程
        
    package com.company.lesson01;
    
    import java.net.InetSocketAddress;
    
    public class TestInetSocketAddress {
        public static void main(String[] args) {
            InetSocketAddress socketAddress1 = new InetSocketAddress("127.0.0.1", 8080);
            InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
            System.out.println(socketAddress1);
            System.out.println(socketAddress2);
    
            System.out.println(socketAddress1.getAddress());
            System.out.println(socketAddress1.getHostName());
            System.out.println(socketAddress1.getPort());
        }
    }
    

    1.5 通信协议

    协议:约定俗称的语音、符号

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

    TCP/IP协议簇

    • TCP: 用户传输协议
    • UDP: 用户数据报协议
    • IP: 网络互连协议

    TCP / UDP对比

    TCP: 连接稳定、三次握手四次挥手、客户端与服务端、传输需要释放效率低

    UDP: 不连接不稳定、客户端服务端无明确界限、无需准备、 DDOS洪泛攻击

    1.6 TCP

    客户端

    1.连接服务器 Socket
    2.发送消息

    package com.company.lesson02;
    
    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("hello world".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();
                    }
                }
            }
        }
    }
    

    服务器

    1. 建立服务的端口 ServerSocket
    2. 等待用户的链接 accept
    3. 接收用户的消息
    package com.company.lesson02;
    
    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) throws IOException {
    
            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();
                    }
                }
            }
        }
    }
    

    1.7 文件上传

    客户端

    package com.company.lesson02;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    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 fis = new FileInputStream(new File("pic.jpg"));
            //4. 写出文件
            byte[] buffer = new byte[1024];
            int len;
            while((len = fis.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
    
            // 通知服务器已经结束
            socket.shutdownOutput(); // 已经传输完毕
    
            // 确定服务器接收完毕,才能断开连接
            InputStream inputStream = socket.getInputStream();
            // String byte[]
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
            byte[] buffer2 = new byte[2014];
            int len2;
            while((len2 = inputStream.read(buffer2)) != -1){
                baos.write(buffer2, 0, len2);
            }
    
            System.out.println(baos.toString());
    
            // 5. 关闭资源
            fis.close();
            baos.close();
            inputStream.close();
            os.close();
            socket.close();
        }
    }
    

    服务端

    package com.company.lesson02;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpServerDemo02 {
        public static void main(String[] args) throws Exception{
            //1. 创建服务
            ServerSocket serverSocket = new ServerSocket(9000);
            //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);
            }
    
            // 通知客户端接收完毕
            OutputStream os = socket.getOutputStream();
            os.write("接收完毕,断开操作".getBytes());
    
            // 5. 关闭资源
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();
        }
    }
    

    1.8 Tomcat

    服务端

    • 自定义 S
    • Tomcat服务器 S : JAVA后台开发

    客户端

    • 自定义 C
    • 浏览器 B

    1.9 UDP

    发送消息

    发送端

    package com.company.lesson03;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    // 不需要连接服务器
    public class UdpClientDemo01 {
        public static void main(String[] args) throws Exception {
            //1. 建立一个socket
            DatagramSocket socket = new DatagramSocket();
            // 2. 建包
            String msg = "hello world";
            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();
        }
    }
    

    接收端

    package com.company.lesson03;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class UdpServerDemo01 {
        public static void main(String[] args) throws Exception {
            // 开放端口
            DatagramSocket 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().getHostAddress());
            System.out.println(new String(packet.getData(), 0, packet.getLength()));
    
            // 关闭资源
            socket.close();
        }
    }
    

    案例:咨询

    发送方

    package com.company.chat;
    
    import javax.swing.plaf.synth.SynthTextAreaUI;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    import java.net.SocketException;
    
    public class UdpSender {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(8888);
            // 准备数据 从控制台读取 system.in
            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(data.equals("bye")) {
                    break;
                }
            }
            socket.close();
        }
    }
    

    接收方

    package com.company.chat;
    
    import javax.xml.crypto.Data;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    import java.time.chrono.IsoChronology;
    
    public class UdpReceiver {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(6666);
    
            while(true){
                // prepare receive the packet
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet); // 阻塞式接收
    
                // 断开连接 bye
                byte[] data = packet.getData();
                String receiveData = new String(data, 0, data.length);
                System.out.println(receiveData);
                if (receiveData.equals("bye")) break;
            }
            socket.close();
        }
    }
    

    多线程:双方同时收发

    接收方

    package com.company.chat;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class TalkReceive implements Runnable {
        DatagramSocket socket = null;
        private int port;
        private String msgFrom;
        public TalkReceive(int port, String msgFrom){
            this.port = port;
            this.msgFrom = msgFrom;
            try {
                socket = new DatagramSocket(port);
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void run() {
            try {
                while(true){
                    // prepare receive the packet
                    byte[] container = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                    socket.receive(packet); // 阻塞式接收
    
                    // 断开连接 bye
                    byte[] data = packet.getData();
                    String receiveData = new String(data, 0, data.length);
                    System.out.println(msgFrom + ":" + receiveData);
                    if (receiveData.equals("bye")) break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            socket.close();
        }
    }
    

    发送方

    package com.company.chat;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetSocketAddress;
    import java.util.concurrent.ExecutionException;
    
    public class TalkSend implements Runnable {
        DatagramSocket socket = null;
        BufferedReader reader = null;
        private int fromPort;
        private String toIP;
        private int toPort;
    
        public TalkSend(int fromPort, String toIP, int toPort) {
            this.fromPort = fromPort;
            this.toIP = toIP;
            this.toPort = toPort;
            try{
                socket = new DatagramSocket(fromPort);
                reader = new BufferedReader(new InputStreamReader(System.in));
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            while (true){
                String data = null;
                try {
                    data = reader.readLine();
                    byte[] datas = data.getBytes();
                    DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort));
    
                    socket.send(packet);
                    if(data.equals("bye")) {
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    

    多线程

    package com.company.chat;
    
    public class TalkStu {
        public static void main(String[] args) {
            // 开启两个线程
            new Thread(new TalkSend(7878, "localhost", 9988)).start();
            new Thread(new TalkReceive(8899, "teac")).start();
        }
    }
    
    package com.company.chat;
    
    public class TalkTeac {
        public static void main(String[] args) {
            new Thread(new TalkSend(5555, "localhost", 8899)).start();
            new Thread(new TalkReceive(9988, "Stu")).start();
        }
    }
    

    2.0 URL

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

    DNS域名解析


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

    下载网络资源

    package com.company.lesson03;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class UrlDown {
        public static void main(String[] args) throws Exception {
            // 1. download Address
            URL url = new URL(""); // 网络资源地址
            // 2. connect HTTP
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();
    
            FileOutputStream fos = new FileOutputStream("fileName.txt"); // 下来的命名
    
            byte[] buffer = new byte[1024];
            int len;
            while((len = inputStream.read(buffer)) != -1){
                fos.write(buffer, 0, len); // 写出数据
            }
            fos.close();
            inputStream.close();
            urlConnection.disconnect(); // 断开连接
        }
    }
    
  • 相关阅读:
    AcRxClass::addX
    string.format("%s",name)
    strcmp 与 _tcscmp
    acedinitget
    判断实体的类型 相关操作
    accmcolor
    CAD类型转换
    图的存储结构及遍历
    并查集(Union/Find)
    设计模式--缺醒适配器模式
  • 原文地址:https://www.cnblogs.com/coderzjz/p/14303583.html
Copyright © 2011-2022 走看看