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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络编程 : IP : 端口 : URL: 网络爬虫 : UDP 实现发送端 : UDP实现接收端: tcp协议实现基本流程: tcp协议实现基本流程 : -> 正文阅读

[网络协议]网络编程 : IP : 端口 : URL: 网络爬虫 : UDP 实现发送端 : UDP实现接收端: tcp协议实现基本流程: tcp协议实现基本流程 :

网页编程 : 上层的应用
网络编程 : 底层,关注数据如何传输,如何存储
    节点 : 网络电子设备
    节点与节点之间组成网络
    IP : 表示节点
    端口 : 区分不同的软件
    URL : 互联网中资源的指针,统一资源定位符
    协议 : 合同,标准,规范
    传输层协议 :
        UDP : 相当于写信  只管写只管发  效率高   不安全  大小存在限制
        TCP : 相当于打电话  面向连接  安全性高  效率低   大小没有限制  ****

IP :
    定义网络中的节点 (网络电子设备,手机,电脑,路由器...)
    分为 : IPV4(4个字节,32位)  IPV6 (128位)
    特殊IP:
        192.168.0.0~192.168.255.255  非注册IP,供组织内部使用
        127.0.0.1 本地IP
        localhost : 本地域名
        域名与IP之间的关系:  DNS解析器

    java.net包
    InetAddress  类表示Internet协议(IP)地址

IP : 定位节点
端口 : 区分软件
    端口号 2个字节  0~65535
    同一协议下端口号不能冲突
    建议使用8000以上的,8000以下称为预留端口号

常见的端口:
    80 : http
    8080 : tomcat
    1521 : Oracle
    3306 : Mysql

InetSocketAddress 此类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口)

URL
    同一资源定位符,指向万维网上的“资源”的指针。

组成:
    协议: http
    域名: www.baidu.com
    端口号: 80
    资源: index.html
        提交数据: name=zhangsan&pwd=123
        锚点: #a

互联网 的三大基石:
    html
    http
    url

 URL 类
public class Class003_URL {
    public static void main(String[] args) throws MalformedURLException {
        //URL(String spec) 从 String表示创建 URL对象。
        //URL(String protocol, String host, int port, String file)
        URL url = new URL("https://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");

        System.out.println(url);
        System.out.println("协议:"+url.getProtocol());
        System.out.println("域名:"+url.getHost());
        System.out.println("端口:"+url.getPort());
        System.out.println("资源:"+url.getFile());
        System.out.println("资源:"+url.getPath());
        System.out.println("资源:"+url.getQuery());
        System.out.println("资源:"+url.getRef());
    }
}

网络爬虫  简单的爬虫

public class Class004_Spider {
    public static void main(String[] args) throws IOException {
        //1.定义URL
        URL url = new URL("https://www.xiaomi.com/index.html");
        //2.获取流 : InputStream openStream() 打开与此 URL的连接并返回 InputStream以从该连接读取。
        InputStream is = url.openStream();
        //InputStreamReader 字节输入流转位字符输入流的节点流-->功能流
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String msg = null;
        //3.读入操作
        while((msg = rd.readLine())!=null){
            System.out.println(msg);
        }
        //4.关闭
        rd.close();
        is.close();
    }
}

套接字:
    传输层为应用层开辟的小口子
    不同协议下Socket实现不同
    UDP与TCP协议对Socket实现

UDP : 相当于写信|有包裹|发短信  非面向连接   协议简单,开销小,效率高   不安全    大小由限制(一般不超过60k)
TCP : 相当于打电话       面向连接    效率低  安全      大小没有限制
    基于三次握手

UDP协议下发送端与接收端两端平等
DatagramSocket  此类表示用于发送和接收数据报包的套接字。
    DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
    void receive(DatagramPacket p) 从此套接字接收数据报包。
    void send(DatagramPacket p) 从此套接字发送数据报包。

DatagramPacket 该类表示数据报包。
    byte[] getData() 返回数据缓冲区。
    int getLength() 返回要发送的数据的长度或接收的数据的长度。

数据的传输基于字节数组

UDP实现发送端: 基本流程
    1.定义我是发送端
    2.准备数据
    3.打包
    4.发送
    5.关闭
public class Class001_Send {
    public static void main(String[] args) throws IOException {
        // 1.定义我是发送端
        DatagramSocket s = new DatagramSocket(9090);

        System.out.println("-------------我是发送端-------------");

        // 2.准备数据
        byte[] arr = "你好".getBytes();
        // 3.打包
        DatagramPacket packet = new DatagramPacket(arr,0,arr.length,new InetSocketAddress("127.0.0.1",8989));
        // 4.发送
        s.send(packet);
        // 5.关闭
        s.close();
    }
}

客户端  Socket
    Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
    InputStream getInputStream()
    OutputStream getOutputStream()
服务器  ServerSocket 该类实现服务器套接字。
    ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
    Socket accept() 侦听对此套接字的连接并接受它。

tcp协议下传输数据基于IO流

tcp协议实现基本流程 : 客户端
    1.定义我是客户端-->指定要请求的服务器的IP+端口
    2.准备数据
    3.获取输出流
    4.输出-->IO操作
    5.刷出
    6.关闭

tcp协议实现基本流程 : 服务端
   1.定义我是服务端
   2.阻塞式监听
   3.获取输入流-->接收客户端的请求数据
   4.处理数据
   5.关闭

tcp 单向登录: 客户端
    1.定义客户端
    2.准备数据(用户输入)
        1)输入流
        2)用户名与密码
    3.获取输出流向服务器端发送数据(用户名与密码)
    4.刷出
    5.关闭

tcp 单向登录: 服务端
    1.定义我是服务器
    2.阻塞式监听
    3.获取输入流接收客户端发动的数据
    4.处理数据
    5.关闭

   要求: 服务器端接收到用户输入的用户名与密码,与指定的laopei,1234比较是否相等,相等本地输出登录成功,不相等输出用户名或密码错误!!!





tcp 双向登录: 客户端
    1.定义客户端
    2.准备数据(用户输入)
        1)输入流
        2)用户名与密码
    3.获取输出流向服务器端发送数据(用户名与密码)
    4.刷出
    5.获取输入流 从服务器端读取响应
    6.关闭

tcp 双向登录: 服务端
    1.定义我是服务器
    2.阻塞式监听
    3.获取输入流接收客户端发动的数据
    4.处理数据
    5.获取输出流 把结果响应 给客户端
    6.刷出
    7.关闭
要求: 服务器端接收到用户输入的用户名与密码,与指定的laopei,1234比较是否相等,相等本地输出登录成功,不相等输出用户名或密码错误!!!


?

多用户登录服务器端
   通过循环可以实现多用户登录
   但是服务器只能排队对不同的客户端做响应

?

多用户登录服务器端
   通过多线程实现
public class Class008_MulLoginTwoWayServer {
    public static void main(String[] args) throws IOException {
        System.out.println("--------我是服务器-------");
        //1.定义我是服务器
        ServerSocket server = new ServerSocket(9898);
        //2.阻塞式监听
        boolean flag = true;
        while(flag){
           Socket client = server.accept();
           System.out.println("一个客户端连接成功........");

           //开启线程为上面监听到客户端响应
            new Thread(new Channel(client)).start();

       }
        server.close();
    }

    static class Channel implements Runnable{
        private Socket client = null;
        private DataInputStream is = null;
        private  DataOutputStream os = null;

        public Channel(Socket client) {
            this.client = client;
            try {
                is = new DataInputStream(client.getInputStream());
                os = new DataOutputStream(client.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //读入数据
        public String read(){
            String msg = null;
            try {
                msg = is.readUTF();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return msg;
        }

        //写出
        public void write(String msg){
            try {
                os.writeUTF(msg);
                os.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //关闭资源
        public void close(){
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(client!=null){
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


        @Override
        public void run() {
            //获取输入流接收客户端发动的数据
            String msg = read();

            //处理数据
            String username = null;
            String password = null;
            String[] strs = msg.split("&");
            for(String s:strs){
                String[] arr = s.split("=");
                if("username".equals(arr[0])){
                    username = arr[1];
                }else if("password".equals(arr[0])){
                    password = arr[1];
                }
            }

            //获取输出流 把结果响应 给客户端
            if("laopei".equals(username) && "1234".equals(password)){
                write("登录成功");
            }else{
                write("登录失败");
            }

            //关闭
            close();
        }
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:51:07  更:2021-07-24 11:51:40 
 
开发: 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年12日历 -2024/12/27 13:32:31-

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