• 网络编程入门


    网络编程

    1.1概述

    网络编程的目的:

    实现信息交互

    达到目的需要什么条件?

    1. 如何准确定位一台主机:IP

    2. 如何定位计算机上资源:端口

    3. 如何传输数据:

      java web: B/S架构

      应用:C/S架构

    1.2网络通讯的要素

    1.通信双方的地址:

    • IP
    • 端口号

    2.网络通信协议

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyhxaGwg-1587999171269)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413205720049.png)]

    1.3 IP

    ip地址:

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

    • 分类

      1. IPV4 :4个字节组成, 0~255, 约42亿个(亚洲只有4亿,不公平)
      2. IPV6 :128位 , 8个无符号整数fe80::c0c0:ba57:fe79:a2a913
      3. 公网:用于互联网
      4. 私网:用于局域网
        1. 192.168.xxx.xxx属于局域网
      5. 域名:用于记忆IP(越短越贵,超贵)
    • package com.mrh.net;
      
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      
      /**
       * TestInetAddress
       * 测试IP
       * 2020/4/13 21:18
       **/
      public class TestInetAddress {
          public static void main(String[] args) {
              try{
                  //根据域名或IP查询地址
                  InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
                  System.out.println(inetAddress1);
                  //www.baidu.com/183.232.231.174
      
                  System.out.println(inetAddress1.getHostAddress());
                  //183.232.231.174
      
                  System.out.println(inetAddress1.getHostName());
                  //www.baidu.com
      
              } catch (UnknownHostException e) {
                  e.printStackTrace();
              }
          }
      }
      

    1.4 端口

    端口标识计算机上得一个程序的进程

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

    • 0~65535

    • 端口分类

      • 公用端口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” #查看指定端口进程
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4t714x5-1587999171271)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413214805088.png)]

    1.5 通信协议

    协议:约定的规则

    TCP/IP协议簇

    • TCP : 用户传输协议
    • UDP:数据报传输协议
    • IP:网络互连协议
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GRj7YLY-1587999171272)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413215244643.png)]

    TCP UDP对比

    TCP:打电话

    • 连接,稳定
    • 传输完成,释放连接,效率低
    • 三次握手,四次挥手
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8flK62Xv-1587999171273)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220117551.png)]
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MH0oUDi-1587999171275)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200413220139037.png)]
    • 客户端,服务端

    UDP:发短信

    • 不链接,不稳定
    • 客户端,服务端没有明确界限
    • 不管有没有准备都可以发给你
    • 不安全(饱和攻击)

    1.6 TCP

    TCP实现聊天

    package com.mrh.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    /**
     * TestSocketAddress
     * 测试客户端
     * 2020/4/13 21:38
     **/
    public class TestClientDemo1 {
        public static void main(String[] args) throws IOException {
    
            //1.要知道服务器地址
            InetAddress inetAddress = InetAddress.getByName("localhost");
            int port = 9999;
            //2.创建一个socket连接
            Socket socket = new Socket(inetAddress, port);
            //3.发送消息 IO流
            OutputStream os = socket.getOutputStream();
            os.write("你好,我是帅比".getBytes());
    
            //关闭流
            if(os != null) {
                os.close();
            }
            if(socket != null) {
                socket.close();
            }
    
        }
    }
    
    package com.mrh.net;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * TestServerDemo1
     * 2020/4/13 22:05
     * 测试服务端
     **/
    public class TestServerDemo1 {
        public static void main(String[] args) throws IOException {
    
            //1.要有一个地址
            ServerSocket serverSocket = new ServerSocket(9999);
            //等待客户端
            Socket socket = serverSocket.accept();
            //读取客户端信息
            InputStream is = socket.getInputStream();
            //管道流
            ByteArrayOutputStream 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());
    
            //关闭流
            if(baos != null) {
                baos.close();
            }
            if(is != null) {
                is.close();
            }
            if(socket != null) {
                socket.close();
            }
            if(serverSocket != null) {
                serverSocket.close();
            }
    
        }
    }
    
    

    文件上传

    Tomcat

    服务端

    • 自定义
    • Tomcat

    客户端

    • 自定义
    • 浏览器

    1.7 UDP

    UDP实现聊天

    package com.mrh.net;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    /**
     * TalkReceive
     * 接收线程
     * 2020/4/16 21:48
     **/
    public class TalkReceive implements Runnable{
        DatagramSocket socket = null;
        private int myPort;
        private String msgFrom;
    
        public TalkReceive(int myPort, String msgFrom) throws SocketException {
            this.myPort = myPort;
            this.msgFrom = msgFrom;
            socket = new DatagramSocket(myPort);
        }
    
        @Override
        public void run() {
    
            while (true){
                try {
                    byte[] container = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(container,0,container.length);
                    socket.receive(packet);
    
                    byte[] data = packet.getData();
                    String receiveData = new String(data,0,data.length);
    
                    System.out.println(msgFrom +": "+ receiveData);
    
                    if("bye".equals(receiveData)){
                        break;
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    
    package com.mrh.net;
    
    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.net.SocketException;
    
    /**
     * TalkSend
     * 发送线程
     * 2020/4/16 21:26
     **/
    public class TalkSend implements Runnable{
        DatagramSocket socket = null;
        BufferedReader reader = null;
    
        private int myPort;
        private int toPort;
        private String toIp;
    
        public TalkSend(int myPort, int toPort, String toIp) throws SocketException {
            this.myPort = myPort;
            this.toPort = toPort;
            this.toIp = toIp;
    
            socket = new DatagramSocket(myPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        }
    
        @Override
        public void run() {
    
            while (true){
                try {
                    String 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("bye".equals(data)){
                        break;
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    

    1.8 URL

    https://www.baidu.com/

    统一资源定位器:定位互联网上的某一资源

    DNS域名解析 : 域名–>ip

    1.协议://ip:端口/项目/资源
    

    下载网络资源

    package com.mrh.net;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    /**
     * URLDemo01
     * 下载网络资源
     * 2020/4/16 22:15
     **/
    public class URLDemo01 {
        public static void main(String[] args) throws IOException {
            //1.下载地址
            URL url = new URL("https://m10.music.126.net/20200416230043/5e6b78442733cd0c96f06481229c7948/yyaac/0052/005b/020f/788cff545371798931095e7e20a8d781.m4a");
    
            //2.连接网络资源
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    
            InputStream inputStream = urlConnection.getInputStream();
    
            FileOutputStream fos = new FileOutputStream("1.m4a");
    
            //输出数据
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer))!= -1){
                fos.write(buffer,0,buffer.length);
            }
    
            //关闭流
            fos.close();
            inputStream.close();
            urlConnection.disconnect(); // 断开连接
    
            /*System.out.println(url.getFile());
            System.out.println(url.getHost());
            System.out.println(url.getPath());
            System.out.println(url.getFile());*/
    
        }
    }
    
    因为我喜欢追寻过程中的自己
  • 相关阅读:
    C#中class的访问级别
    Install-Package 那点事儿
    Gherkin学习笔记
    mysql-connector-c 安装
    shell实现死循环
    每天一个小算法(6)---- 通过两个栈实现一个队列
    每天一个小算法(5)----找到链表倒数第K个结点
    每天一个小算法(4)----在O(1)时间删除指定结点
    每天一个小算法(3)----倒序打印链表
    每天一个小算法(2)----合并两个有序链表
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359784.html
Copyright © 2020-2023  润新知