• 初识网络编程


    一、概述

    • 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现

    • TCP和UDP:

      • TCP:打电话 -->连接 -->接了 -->通话

      • UDP:发送完即可 -->接收

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

    • 网络编程的目的:无线电台...传播交流信息,数据交换,通信

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

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

      • 找到了这个主机,如何传输数据呢

    javaweb : 网页编程 B/S

    网络编程:TCP/IP C/S


    二、网络通信的要素

    如何实现网络的通信:

    通信双方地址:

    • IP

    • 端口号

    规则:网络通信的协议

    http,ftp,smtp,tcp,udp...

    TCP/IP参考模型:

    小结:

    • 网络编程中有两个主要的问题:

      • 如何准确定位到网络上的一台或者多台主机

      • 找到主机之后如何进行通信

    • 网络编程中的要素

      • IP和端口号 IP

      • 网络通信写协议 UDP TCP

    • 万物皆对象


    三、IP

    ip地址:InetAddress

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

    • 127.0.0.1:本机localhost

    • ip地址的分类

      • IP地址分类 ipv4/ipv6

        • ipv4 127.0.0.1 由四个字节组成,0~255,可有42亿个,30亿都在北美,亚洲4亿,2011年就用尽

        • ipv6 fe80::915d:470e:d522:4339%16 128位,8个无符号整数

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

        • 192.168.xx.xx 专门给组织内部使用的

        • ABCD类地址

    • 域名:记忆IP问题

    //测试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);
    ​
                System.out.println("=============");
                //查询网站ip地址
                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) {
                throw new RuntimeException(e);
            }
        }
    }

    四、端口

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

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

    • 被规定0~65535

    • TCP,UDP:65535*2 单个协议下端口号不能冲突

    • 端口分类

      • 公有端口:0~1023

        • HTTP : 80

        • HTTPS : 443

        • FTP : 21

        • SSH : 22

        • Telent:23

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

        • Tomcat:8080

        • MySQL:3306

        • Oracle:1521

      • 动态、私有:49152~65535

    netstat -ano #查看所有的端口
    netstat -ano|findstr "5900" #查看指定的端口
    tasklist|fiindstr "8696" #查看指定端口的进程
    ctrl+shift+esc #打开任务管理器
    public class TestInetSocketAddress {
        public static void main(String[] args) {
            InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
            System.out.println(inetSocketAddress);
            InetSocketAddress inetSocketAddress2 = new InetSocketAddress("localhost", 8080);
            System.out.println(inetSocketAddress2);
    ​
            System.out.println(inetSocketAddress.getAddress());
            System.out.println(inetSocketAddress.getHostName());//地址
            System.out.println(inetSocketAddress.getPort());//端口
        }
    }

    五、通信协议

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

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

    问题:非常的复杂

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

    重要:

    • TCP:用户传输协议

    • UDP:用户数据报协议

    出名的协议

    • TCP:用户传输协议

    • IP:网络互联协议

    TCP和UDP的对比:

    • TCP:打电话

      • 连接,稳定

      • 三次握手,四次挥手

        最少需要三次,保证稳定连接
        A:你瞅啥?
        B:瞅你咋地?
        A:干一场!
        ​
        A:我要走了
        B:你真的要走了吗?
        B:你真的真的要走了吗?
        A:我真的真的要走了

      • 客户端、服务端

      • 传输完成,释放连接,效率低

    • UDP:发短信

      • 不连接,不稳定

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

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

      • 导弹

      • DDOS:洪水攻击!


    六、TCP

    客户端

    • 连接服务器Socket

    • 发送消息

    服务器

    • 建立服务的端口 ServerSocket

    • 等待用户的链接 accept

    • 接受用户的消息

    package day01;
    ​
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    ​
    /**
     * @Author: Grace
     * @Date: 2023/9/27 18:41
     * @Description:
     */
    //服务端
    public class TcpServerDemo01 {
        public static void main(String[] args) {
            ServerSocket serverSocket =null;
            ByteArrayOutputStream byteArrayOutputStream = null;
            InputStream inputStream=null;
            Socket accept=null;
    ​
            try {
                //1.我得有一个地址
                 serverSocket = new ServerSocket(9999);
                //2.等待客户端连接过来
                while(true) {
                    accept = serverSocket.accept();
                    inputStream = accept.getInputStream();
               /* byte[] bytes = new byte[1024];
                int len;
                while((len= inputStream.read(bytes))!=-1){
                    String s = new String(bytes, 0, len);
                    System.out.println(s);
                }*/
                    //管道流
                    byteArrayOutputStream = new ByteArrayOutputStream();
                    byte[] bytes = new byte[1024];
                    int len;
                    while ((len = inputStream.read(bytes)) != -1) {
                        byteArrayOutputStream.write(bytes, 0, len);
                    }
    ​
                    System.out.println(byteArrayOutputStream.toString());
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                if(byteArrayOutputStream!=null) {
                    try {
                        byteArrayOutputStream.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if(inputStream!=null){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if(accept!=null){
                    try {
                        accept.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if(serverSocket!=null){
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
    ​
    ​
            }
        }
    }
    package day01;
    ​
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    ​
    /**
     * @Author: Grace
     * @Date: 2023/9/27 18:41
     * @Description:
     */
    //客户端
    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) {
                throw new RuntimeException(e);
            } finally {
                if(socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if (os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }

    七、TCP文件上传

    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("紫萍.jpg"));
            //4。写出文件
            byte[] bytes = new byte[1024];
            int len;
            while ((len = fis.read(bytes))!=-1){
                os.write(bytes,0,len);
            }
    ​
            //5.关闭资源
            fis.close();
            os.close();
            socket.close();
    ​
        }
    }
    package day01;
    ​
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    ​
    /**
     * @Author: Grace
     * @Date: 2023/9/27 19:14
     * @Description:
     */
    public class TcpServerDemo02 {
        public static void main(String[] args) throws Exception {
            //1.创建服务
            ServerSocket serverSocket = new ServerSocket(9000);
            //2.监听客户端的连接
            Socket accept = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
            //3.获取输入流
            InputStream is = accept.getInputStream();
            //4.文件输出
            FileOutputStream fos = new FileOutputStream(new File("receive"));
            byte[] bytes = new byte[1024];
            int len;
            while((len = is.read(bytes))!=-1){
                fos.write(bytes,0,len);
            }
            //5.关闭资源
            fos.close();
            is.close();
            accept.close();
            serverSocket.close();
        }
    }

  • 相关阅读:
    使用idea 把一个git分支的部分提交记录合并到另一个git分支上
    力扣第763题 划分字母区间 c++ 哈希 + 双指针 + 小小贪心
    Jmeter之内置函数__property和__P的区别
    学科语文方面的论文怎么选题?
    Vue--router和route的区别
    web技术分享| 【高德地图】实现自定义的轨迹回放
    【微信小程序AR】基于Kivicube零代码实现微信小程序AR
    OpenCV [c++](图像处理基础示例程序汇总)
    图解LeetCode——998. 最大二叉树 II(难度:中等)
    康拓123发卡软件支持PN532读卡器
  • 原文地址:https://blog.csdn.net/yujiyai/article/details/133362453