网络编程

网络编程

1.1、概述

网络编程_第1张图片
计算机网络:

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

网络编程的目的:

无线电台,传播交流信息

数据交换,通信

想达到的效果:

  1. 如何定位网络主机

    ip,端口,定位到计算机某个资源

  2. 如何传输数据

javaweb: 网页编程 B/S 架构

网络编程: TCP/IP C/S架构 客户端

1.2、网络通信的要素

通信双方的地址:

  • ip
  • 端口号

规则: 网络通信的协议
TCP/IP参考模型:

网络编程_第2张图片
小结:

  1. 网络编程中有两个主要的问题

    • 如何准确的定位到网络上的一台或者多台主机。
    • 找到主机之后如何进行通信
  2. 网络编程中的要素

    • IP和端口号 ip

    • 网络通信协议 udp,tcp

  3. 万物皆对象

1.3、IP

ip地址: InetAddress

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

  • 127.0.0.1: 本机localhost

  • ip地址的分类

    • ipv4 / ipv6
      • IPV4 127.0.0.1 ,4个字节组成。, 255,42亿 ; 30亿都在北美,亚洲4亿。
      • ipv6 128位。8个无符号整数!

网络编程_第3张图片

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

    • ABCD类地址

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

IPv4 地址:就是自己电脑的本地IP地址

package com.liang.lessonIp;

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

//测试ip
public class TestnetAddress {
    public static void main(String[] args) {
        try {
            //查询本机地址
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            InetAddress localhost = InetAddress.getByName("localhost");
            InetAddress host = InetAddress.getLocalHost();
            System.out.println(localhost);
            System.out.println(host);
            System.out.println(inetAddress);
            //查询网站ip地址
            InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress2);

            //常用方法
            System.out.println(inetAddress2.getAddress());
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
    }
}

1.4、端口

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

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

  • 被规定 0~65535

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

  • 端口分类

    • 公有端口 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 “8080” 查看指定端口

    Ctrl+shift+esc

package com.liang.lessonIp;

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.getPort());
    }
}

1.5、通信协议

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

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

问题: 非常的复杂?

大事化小: 分层!

TCP/IP协议簇重要:

。TCP : 用户传输协议

。UDP: 用户数据报协议

TcP udp 对比
TCP: 打电话

  • 连接,稳定

  • 三次握手四次挥手

最少需要三次,保证稳定连接!
A: 你瞅啥?
B: 瞅你咋地?
A: 干一场!

四次挥手,断开连接

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

  • 客户端、服务端

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

    UDP : 发短信

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

    1.6、TCP

    先起服务端再起客户端

    客户端:

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

    package com.liang.lessonIp;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    //客户端
    public class TcpClientDemo1 {
    
        public static void main(String[] args) {
            Socket socket = null;
            OutputStream os = null;
            //1.要知道服务器地址
            try {
                InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //2.创建一个socket连接
                 socket = new Socket(inetAddress, port);
                //3.发送消息io流
                 os = socket.getOutputStream();
                os.write("hello world+++梁伟浩".getBytes());
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }finally {
                if (os!=null){
                    try {
                        os.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                if (socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
    
    
        }
    }
    
    

    服务器:

1.建立服务的端口 ServerSocket

2.等待用户的链接 accept

3.接收用的消息

package com.liang.lessonIp;

import javax.swing.text.StyledEditorKit;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpClientDemo2 {
    public static void main(String[] args) throws IOException {
        //1.我有一个地址
            ServerSocket serverSocket = new ServerSocket(9999);
       //2.等待客户端链接
        Socket accept = serverSocket.accept();
        //3.读取客户端信息
        InputStream is = accept.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());

        //关闭资源
        is.close();
        accept.close();
        serverSocket.close();
        baos.close();

    }
}

输出:
D:\JavaEnvironment\jdk1.8\bin\java.exe "-javaagent:D:\工作软件\idea2022\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=52945:D:\工作软件\idea2022\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JavaEnvironment\jdk1.8\jre\lib\charsets.jar;D:\JavaEnvironment\jdk1.8\jre\lib\deploy.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\cldrdata.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\dnsns.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\jaccess.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\jfxrt.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\localedata.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\nashorn.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunec.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\JavaEnvironment\jdk1.8\jre\lib\ext\zipfs.jar;D:\JavaEnvironment\jdk1.8\jre\lib\javaws.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jce.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jfr.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jfxswt.jar;D:\JavaEnvironment\jdk1.8\jre\lib\jsse.jar;D:\JavaEnvironment\jdk1.8\jre\lib\management-agent.jar;D:\JavaEnvironment\jdk1.8\jre\lib\plugin.jar;D:\JavaEnvironment\jdk1.8\jre\lib\resources.jar;D:\JavaEnvironment\jdk1.8\jre\lib\rt.jar;D:\IdeaStudySpace\JavaStudy\target\classes;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-web\2.0.0.RELEASE\spring-boot-starter-web-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter\2.0.0.RELEASE\spring-boot-starter-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot\2.0.0.RELEASE\spring-boot-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-autoconfigure\2.0.0.RELEASE\spring-boot-autoconfigure-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-logging\2.0.0.RELEASE\spring-boot-starter-logging-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\JavaEnvironment\downloadMaven\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\JavaEnvironment\downloadMaven\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\JavaEnvironment\downloadMaven\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\JavaEnvironment\downloadMaven\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\JavaEnvironment\downloadMaven\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\JavaEnvironment\downloadMaven\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-json\2.0.0.RELEASE\spring-boot-starter-json-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-databind\2.9.4\jackson-databind-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\core\jackson-core\2.9.4\jackson-core-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.4\jackson-datatype-jdk8-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.4\jackson-datatype-jsr310-2.9.4.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.4\jackson-module-parameter-names-2.9.4.jar;D:\JavaEnvironment\downloadMaven\org\springframework\boot\spring-boot-starter-tomcat\2.0.0.RELEASE\spring-boot-starter-tomcat-2.0.0.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-core\8.5.28\tomcat-embed-core-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-el\8.5.28\tomcat-embed-el-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.28\tomcat-embed-websocket-8.5.28.jar;D:\JavaEnvironment\downloadMaven\org\hibernate\validator\hibernate-validator\6.0.7.Final\hibernate-validator-6.0.7.Final.jar;D:\JavaEnvironment\downloadMaven\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\JavaEnvironment\downloadMaven\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\JavaEnvironment\downloadMaven\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-web\5.0.4.RELEASE\spring-web-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-beans\5.0.4.RELEASE\spring-beans-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-webmvc\5.0.4.RELEASE\spring-webmvc-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-aop\5.0.4.RELEASE\spring-aop-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-context\5.0.4.RELEASE\spring-context-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-expression\5.0.4.RELEASE\spring-expression-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-core\5.0.4.RELEASE\spring-core-5.0.4.RELEASE.jar;D:\JavaEnvironment\downloadMaven\org\springframework\spring-jcl\5.0.4.RELEASE\spring-jcl-5.0.4.RELEASE.jar com.liang.lessonIp.TcpClientDemo2
hello world+++梁伟浩

Process finished with exit code 0

文件上传

  • 发送文件(服务端)
package com.liang.lessonIp;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
//发送文件(再开启)
public class TcpClientDemo3 {
    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("D:\\IdeaStudySpace\\JavaStudy\\src\\猪.gif"));
        //4.写出文件
        byte[] bytes = new byte[1024];
        int len;
        while ((len=fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        //通知服务器,我已经结束了
        socket.shutdownOutput();//我已经传输完了

        //确认服务器接收完毕,才能够断开连接
        InputStream inputStream = socket.getInputStream();
        //string byte[]  管道流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] bytes1 = new byte[1023];
        int len2;
        while ((len2=inputStream.read(bytes1))!=-1){
            baos.write(bytes1,0,len2);
        }
        System.out.println(baos.toString());

        //关闭资源,先开后关
        baos.close();
        inputStream.close();
        fis.close();
        os.close();
        socket.close();

    }
}

  • 接收文件(客户端)
package com.liang.lessonIp;

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

//接收文件(先开启)
public class TcpClientDemo4 {
    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("lwh.gif"));
        byte[] bytes = new byte[1024];
        int len;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //通知客户端我接受完毕了
        OutputStream os = socket.getOutputStream();
        os.write("我接受完毕了,你可以断开了".getBytes());

        //关闭资源,先开后关
        is.close();
        fos.close();
        os.close();
        socket.close();
        serverSocket.close();
    }
}

Tomcat

服务端

  • 自定义S

  • Tomcat服务器 S

    客户端

    • 自定义 C
    • 浏览器 B

1.7、UDP

发送消息

服务端

package com.liang.lessonIp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//不需要连接服务器
public class UdpClient {
    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();
    }
}

接收端

package com.liang.lessonIp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//还是要等待客户端的连接
public class UdpServer {
    public static void main(String[] args) throws  Exception{
        //1.开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);

        //阻塞接收
        socket.receive(packet);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭流
        socket.close();
    }
}

咨询

循环发送消息

package com.liang.lessonIp;

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 UdpSenderChat {
    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[] bytes = data.getBytes();

            DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress("localhost", 6666));

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

    }
}

循环接收信息

package com.liang.lessonIp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdbReceiveChat {
    public static void main(String[] args) throws  Exception {
        DatagramSocket socket = new DatagramSocket(6666);
while (true) {
    //准备接收包裹
    byte[] container = new byte[1024];
    DatagramPacket packet = new DatagramPacket(container, 0, container.length);
    socket.receive(packet);//阻塞式接收包裹

    //断开连接 bye
    byte[] data = packet.getData();
    String s = new String(data, 0, data.length);
    System.out.println(s);

    if (s.equals("bye")) {
        break;
    }
}
socket.close();
    }
}

多线程咨询

发送端

package com.liang.lessonIp;

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.Socket;

public class TaskSend implements Runnable{
  DatagramSocket socket= null;
  BufferedReader reader = null;

  private  int fromPort;
  private String toIP;
  private int toPort;

    public TaskSend(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[] bytes = data.getBytes();
                DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP, this.toPort));

                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
}

接收端

package com.liang.lessonIp;

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;

public class TaskReceive implements Runnable{
  DatagramSocket socket= null;
    private int port;
    private String msgFrom;

    public TaskReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
          socket =   new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            //准备接收包裹
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//阻塞式接收包裹

                //断开连接 bye
                byte[] data = packet.getData();
                String s = new String(data, 0, data.length);
                System.out.println(s);

                System.out.println(msgFrom+s);

                if (s.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        socket.close();
    }
}

开启学生线程

package com.liang.lessonIp;

public class TalkStudent {
    public static void main(String[] args) {
        //开启两个线程
        new Thread(new TaskSend(7777,"localhost",9999)).start();
        new Thread(new TaskReceive(8888, "老师")).start();
    }

}

开启老师线程

package com.liang.lessonIp;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TaskSend(5555,"localhost",8888)).start();
        new Thread(new TaskReceive(9999, "学生")).start();
    }
}

1.8、URL

https://www.baidu.com/
统一资源定位符:定位资源的,定位互联网上的某一个资源DNS 域名解析www.baidu.com xxx.X…x…x

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

package com.liang.lessonIp;

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

public class URL01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080");

        System.out.println(url.getProtocol());//协议
        System.out.println(url.getPort());//端口
        System.out.println(url.getHost());//主机IP
        System.out.println(url.getQuery());//静态资源
    }
}

你可能感兴趣的:(网络,tcp/ip,java)