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网络编程

1.1概述

  1. 网络编程

    网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。

    网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。

  2. 计算机网络

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

  3. 网络编程的应用

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

  4. 想要达到这个效果需要什么

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

    如何向找到的主机传输数据

  5. 与网页编程对比

    网页编程:Javaweb、B/A架构

    网络编程:TCP/IP、C/S架构

1.2 网络通信的要素

  1. 如何实现网络的通信

    通信双方地址:

    • ip
    • 端口号

    规则:网络通信的协议

  2. TCP/IP参考模型(重点:传输层 ——TCP,UDP)

  3. 小结

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

    • 如何准确的定位到网络上的一台或者多台主机:DOS命令ping
    • 找到主机之后如何通信

    网络编程中的要素

    • IP 和 端口号
    • 网络通信协议:TCP,UDP

    java万物皆对象

1.3 IP地址

  1. ip地址:InetAddress

    作用:唯一定义一台网络上的计算机

    127.0.0.1:本机ip (localhost)

  2. ip地址分类

    IPV4:(127.0.0.1),4个字节组成,每个字节长度0~255;大概有42亿个,30亿都在北美,亚洲有4亿;2011年就用尽了;

    IPV6:(2001:0bb2:aaaa:0015:0000:0000:1212:1414),128位,8个无符号整数

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

    • ABCD类地址
    • 192.168.xx.xx,(一般都是局域网):专门给组织内部使用的
  3. 域名:为了解决记忆IP问题

    eg:www.baidu.com

  4. 测试输出IP

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

1.4 端口

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

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

    被规定范围0~65536

    TCP端口,UDP端口各有65536个;单个协议下,端口号不能冲突,

  2. 端口分类

    公有端口(0~1023):尽量不要占用,一般会被内置的进程或服务器使用

    • HTTP默认端口:80
    • HTTPS默认端口:43
    • FTP:21
    • Telent:23

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

    • Tomcat:8080
    • MySQL:3306
    • Oracle:1521

    动态、私有:49152~65535

  3. 常见DOS命令

    netstat -ano :查看所有端口

    netstat -ano|findstr “端口号” :查看指定的端口

    tasklist|findstr “端口号” :查看指定端口的进程

  4. 测试输出IP:端口号

    //测试输出IP:端口号
    public class TestInetSocketAddress {
        public static void main(String[] args) {
            InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
            InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
            System.out.println(socketAddress);
            System.out.println(socketAddress2);
    
            System.out.println(socketAddress.getAddress());
            System.out.println(socketAddress.getHostName()); //地址
            System.out.println(socketAddress.getPort());  //端口
        }
    }
    

1.5 通信协议

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

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

  3. 大事化小:分层

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

    TCP:用户传输协议

    UDP:用户数据协议

    IP:网络互连协议

  5. TCP、 UDP 对比

    TCP:打电话

    • 连接,稳定

    • “三次握手”、“四次挥手”

      最少需要三次,才能保证稳定连接
      A:你愁啥?(发送端请求连接)
      B:瞅你咋地?(接收端作出回应)
      A:干一场!(发送端回应确定建立连接)
      
      A:我要走了
      B:你真的要走了吗?
      B:你真的真的要走了吗?
      A:我真的要走了
      
    • 客户端、服务端

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

    • 接收端必须同意接收,才能连接

    UDP:发短信

    • 不连接,不稳定,,需要知道对方的地址
    • 客户端、服务端:没有明确的界限
    • 接收端不管有没有准备好,发送端都可以发送
    • DDOS(洪水攻击):发送大量垃圾包,造成端口堵塞(炮和攻击)

1.6 TCP

1.6.1TCP实现聊天

  1. 客户端

    • 连接服务器 Socket
    • 发送消息
    //客户端
    public class TcpClientDemo1 {
        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();
                    }
                }
            }
    
        }
    }
    
    
  2. 服务器

    • 建立服务的端口 ServerSocket
    • 等待用户的连接 accept
    • 接收用的消息
    //服务端
    public class TcpServerDemo1 {
        public static void main(String[] args) {
    
            ServerSocket serverSocket = null;
            Socket socket = null;
            InputStream is = null;
            ByteArrayOutputStream baos = null;
    
            try {
                //1.我得有一个地址
                serverSocket = new ServerSocket(9999);
                while (true) {
                    //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.6.2 TCP文件上传实现

  1. 服务器端

    //服务端接收文件
    public class TcpServerDemo2 {
        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.png"));
            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();
        }
    }
    
  2. 客户端

    //客户端读取文件
    public class TcpClientDemo2 {
    
        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("javaio.png"));
            //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[1024];
            int len2;
            while((len2=inputStream.read(buffer2))!=-1){
                baos.write(buffer2, 0,len2);
            }
    
            System.out.println(baos.toString());
    
            //5.关闭资源
            fis.close();
            os.close();
            socket.close();
    
            inputStream.close();
            baos.close();
        }
    }
    
    

1.6.3 Tomcat

  1. 服务端

    自定义 S

    Tomcat服务器 S : Java后台开发

  2. 客户端

    自定义 C

    浏览器 B

1.7 UDP

1.7.1 UDP实现发送消息

  1. 发送端

    //不需要连接服务器
    public class UdpClientDemo1 {
        public static void main(String[] args) throws Exception{
            //1.建立一个Socket
            DatagramSocket socket = new DatagramSocket();
    
            //2.建个包
            String msg = "你好啊,服务器!";
    
            InetAddress localhost = InetAddress.getByName("localhost");
            int port = 9000;
            //数据,数据的长度起始,要发送给谁
    
            DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
    
            //3.发送包
            socket.send(packet);
    
            //4.关闭流
            socket.close();
        }
    }
    
    
  2. 接收端

    public class UdpServerDemo1 {
        public static void main(String[] args) throws Exception {
            //开发端口
            DatagramSocket socket = new DatagramSocket(9000);
            //接收数据包
            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();
        }
    }
    

1.7.2 UDP实现聊天

  1. 循环发送消息

    public class UdpSenderDemo1 {
        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();
        }
    }
    
    
  2. 循环接收消息

    public class UdpReceiveDemo1 {
        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); //阻塞式接收包裹
    
                //断开连接
                byte[] data = packet.getData();
                String receiveData = new String(data, 0, data.length);
    
                System.out.println(receiveData);
                if(receiveData.equals("bye")){
                    break;
                }
            }
            socket.close();
        }
    }
    

1.7.3 UDP多线程在线聊天

  1. 在线聊天:两人都可以是发送方,也都可以是接收方

  2. 发送端

    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() {
    
            //准备数据:控制台读取System.in
    
            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(data.equals("bye")){
                        break;
                    }
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    
  3. 接收端

    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() {
    
            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(receiveData.equals("bye")){
                        break;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            socket.close();
        }
    }
    
    
  4. 学生端测试

    public class TalkStudent {
        public static void main(String[] args) {
            //开启两个线程:发送和接收
            new Thread(new TalkSend(7777,"localhost",9999)).start();
            new Thread(new TalkReceive(8888,"老师")).start();
        }
    }
    
  5. 老师端测试

    public class TalkTeacher {
        public static void main(String[] args) {
            new Thread(new TalkSend(5555,"localhost",8888)).start();
            new Thread(new TalkReceive(9999,"学生")).start();
        }
    }
    
  6. 测试结果

1.8 URL

  1. 同一资源定位符(URL),定位互联网上的某一个资源

  2. DNS域名解析:将www.baidu.com解析为ip地址

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

  3. URL下载网络资源

    public class UrlDown {
        public static void main(String[] args) throws Exception {
            //1.下载地址
            URL url = new URL("http://localhost:8080/pqf/download.txt");
    
            //2.连接到这个资源,用HTTP连接
            HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
    
            InputStream inputStream = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("down.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(); //断开连接
        }
    }
    
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:24:57  更:2021-08-19 12:26:14 
 
开发: 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年5日历 -2024/5/17 16:44:12-

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