Day26 --网络编程

网络编程
        概述
            * 计算机网络
                * 指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来。
                * 在 网络操作系统 ,网络管理软件 及 网络通信协议 的管理和协调下,实现资源共享和信息传递的计算机系统
            * 网络编程
                * 用来实现网络互连的不同计算机上 运行的程序间 可以进行数据交换

    网络编程三要素之一(IP地址)
        概述
            * 每个【设备】网络中都具有唯一标识
            * 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址作为依据
            * ipconfig:查看本机IP地址:192.168.0.100
            * ping 网站:测试连接网络(测试外网,测试网络是否连接) ping www.baidu.com
            * 本地回路地址:127.0.0.1 (没有外网的情况下局域网的情况,自己跟自己进行网络通信)
            * 广播地址:255.255.255.255(广播室地址【直播】)
            * IPv4:4个字节组成,4个0-255.大概42亿。30亿都在北美,亚洲占4亿。2011年年初已经用完
            * IPv6:8个字节组成,每组4个16进制数
            * IPv6的表现形式
                * 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
                * 1a2b::aaaa:0000:0000:0000:aabb:1f2f
                * 1a2b:0000:aaaa::aabb:1f2f
                * 1a2b:0000:aaaa::0000:aabb:1f2f
                * 1a2b:0000:aaaa:0000::aabb:1f2f


    网络编程三要素之二(端口号)
        概述
            * 每个【程序】在设备上同样具有唯一标识
            * 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发送到哪台机器设备上,还要明确发送到哪个具体的程序上,每个程序都具有唯一的端口号。
            * 端口号范围:0-65535(char的取值范围)
            * 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的端口号基本被系统程序给占用了。
            * 常见端口号:
                * mysql:3306
                * oracle:1521
                * web:80
                * tomact:8080
                * qq:4000
                * 飞秋:2425
                

    网络编程三要素之三(网络协议)
        概述 
            * 为计算机网络中进行数据交换而建立的规则,标准或约定的集合
            * 分为:UDP 和 TCP
            * UPD:
                * 面向无连接
                * 不区分 客户端 和 服务端
                * 数据有大小限制,每个包的大小不能超过64K,。
                * 数据传输过程不安全,不可靠协议。
                * 效率高,速度快
            
            * TCP: 
                * 面向有连接(又称3次握手)
                * 区分 客户端 和 服务端
                * 数据传输过程安全,可靠协议(安全)。
                * 数据没有大小限制
                * 但效率低,速度慢。
                
                
                * 3次握手:先客户端向服务端发起请求,服务器再响应请求,服务端响应请求后将数据传递给客户端
                * (简称:请求,响应,传输数据)
                
            * HTTP协议底层就是使用到TCP协议
            


    Socket通信原理图解
        概述
            * 网络上具有唯一标识的ip地址和端口号组合在一起,才能构成唯一能识别的标识符套接字
            * 通信的两端都有Socket
            * 网络通信其实就是Socket之间的通信
            * 数据在两个Socket间通过IO流传输
            * Socket在应用程序中创建,通过一种绑定机制和驱动程序建立关系,告诉数据所对应的IP和port(端口号)
            * HTTP协议底层就是使用到TCP协议
        p.s.
            网络通信也叫Socket通信,通信两端都独有自己的Socket。
            通信就是在两个Socket之间通过IO流进行数据交换。


            

b.
    UDP传输 (不区分客户端和服务端)
        DatagramSocket:该类表示用来发送和接收数据报包的套接字
            * 数据报套接字是包投递服务的发送或接收点。
            * 每个在数据报套接字上发送或接收的包都是单独编址和路由的
        DatagramRevice:该类表示数据报包
            * 数据报包用来实现无连接包投递服务(接收方未知)。
        
        概述
            * 发送send
                1. 创建DatagramSocket()对象;
                     * 构造数据报套接字并将其绑定到本地主机上任何可用的端口
                     * (用来发送和接收数据报包的套接字)
                            
                2. 创建DatagramPacket(byte[] buf, int length, InetAddress address, int port) 对象;
                    * 构造数据报包,用来将长度为 length 的数据包发送到指定主机上的指定端口号
                    
                3.  创建DatagramSocket发送DatagramPacket,使用 socket.send(DatagramPacket p) 方法
                    * 将定义好的数据报包给套接字
                    * 从此套接字发送数据报包
                
                4.  关闭DatagramSocket()对象,采用socket.close()方法
                    * 关闭此数据报套接字


            * 接收Receive
                1. 创建 DatagramSocket(int port),指定端口号
                      * 创建数据报套接字并将其绑定到本地主机上的指定端口。
                      
                2. 创建DatagramPacket,指定数组,长度
                    * 构造 DatagramPacket,用来接收长度为 length 的数据包。
                    
                3. 使用DatagramSocket获取DatagramPacket,使用 socket.receive(DatagramPacket p) 方法
                    * 从此套接字接收数据报包。 
                4. 关闭DatagramSocket,采用socket.close()方法
                    * 关闭此数据报套接字
                5. 从DatagramPacket中获取数据,采用byte[] arr = packet.getData()方法返回数据缓冲区。
                    
                6. 获取有效字节个数,使用int len = packet.getLength()方法。
                    
                7. 打印输出 数据报包中的内容
                    * sop(new String(arr,0,len));
                
        使用:
            发送端
                A:创建 DatagramSocket 对象。
                    public DatagramSocket();
                B:创建数据报包对象(DatagramPacket),用来发送数据。
                    public DatagramPacket(内容,长度,IP,端口号);    //端口号可以随机给
                C:调用 DatagramSocket 的 send() 方法发送 数据报包(DatagramPacket)。
                D:关闭 DatagramSocket 对象。

            接收端
                A:创建 DatagramSocket 对象,指定端口号。
                    public DatagramSocket(端口号);        //端口号必须和发送端一致
                B:创建数据报包对象(DatagramPacket),用来接收数据。//指定数组,指定长度
                    public DatagramPacket(字节数组,长度);
                C:调用 DatagramSocket 的 receive() 方法发送 数据报包(DatagramPacket)。
                D:关闭 DatagramSocket 对象。
                E:从数据报包中获取数据。
                    获取数据:                packet.getData();
                    获取有效的字节数:        packet.getLength();
                    获取发送端的IP地址:        packet.getAddress().getHostAddress();
                    获取发送端的端口号:    packet.getPort();

    * 接收方获取IP地址 和 端口号的方式
        * String ipAddress = packet.getAddress().getHostAddress(); IP地址
        * int port = packet.getPort(); 端口号


    UDP传输优化
        public class Demo02_01_UDP协议优化_Send_发送方 {
        public static void main(String[] args) throws IOException {
    
            Scanner sc = new Scanner(System.in);
            DatagramSocket socket = new DatagramSocket();
            
            while(true){
                String str = sc.nextLine();
                if("quit".equals(str)){
                    break;
                }
                DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 3333);
                socket.send(packet);
            }
            socket.close();
        }
    
    }

        public class Demo02_02_UDP协议优化_Revice_接收方 {
        public static void main(String[] args) throws IOException {
            DatagramSocket socket = new DatagramSocket(3333);
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            while(true){
                socket.receive(packet);
                
                byte[] data = packet.getData();
                int length = packet.getLength();
                String hostAddress = packet.getAddress().getHostAddress();
                int port = packet.getPort();
                System.out.println(hostAddress + ":" + port + " : " +new String(data, 0, length));
            }
            
        }
    
    }

    
服务器端的输出流可以 写出数据到 客户端的输入流



    UDP传输多线程
        在一个窗口中完成多个线程的send和revice


c.
    UDP聊天窗口工具
        * UDP聊天生成jar文件
            步骤:
                1. 单击要生成的.java文件,选择导出为:JAR file
                2. 设置要保存的位置JAR file:路径.jar,然后next,再next    
                3. Main class中设置要导出的.java,最后finish即可 
d.
    TCP协议
        * 客户端(Client) --android开发
            * 1.创建Socket连接服务端(指定ip地址, 端口号),通过ip地址找到对应的服务器
            * 2.通过调用Socket的getInputstream() 和 getOutputStream()方法获取和服务端的相连接的IO流
            * 3.输入流可以读取服务端输出流写出的数据
            * 4.输出流可以写出数据到客户端的输入流
            
        * 服务端(Server) --javaee开发
            * 1.创建ServerSocket(需要指定端口号)
            * 2.调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
            * 3.调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
            * 4.输入流可以读取客户端输出流写出的数据
            * 5.输出流可以写出数据到客户端的输入流

    使用:
        客户端
            A:创建客户端的 Socket 对象,指定 IP(写服务器的IP),端口号。
            B:通过 Socket 类中的 getInputStream() 和 getOutputStream()可以获取和服务器端相关联的流。
                客户端的输入流可以 读取 服务器端的输出流写出的数据
                客户端的输出流可以 写入数据到 服务器端的输入流

        服务器端
            A:创建服务器端的Socket对象:ServerSocket.
            B:通过 ServerSocket 类中的 accept() 可以获取客户端的监听,创建Socket与该客户端进行连接。
            C:通过 Socket 类中的 getInputStream() 和 getOutputStream()可以获取和客户器端相关联的流。
                服务器端的输入流可以 读取 客户端的输出流写出的数据


注意:www.baidu.com是域名,而底层都是ip地址,即每个公司的ip地址
            
    TCP协议代码优化
客户端:
    public class Demo02_TCP代码优化_client {
        @SuppressWarnings("resource")
        public static void main(String[] args) throws IOException{
            Socket socket = new Socket("127.0.0.1", 4455);
            
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintStream ps = new PrintStream(socket.getOutputStream());
            
            System.out.println(br.readLine());  //发送请求,希望读取服务器中的一行数据
            ps.println("女:还好"); //发送请求,往服务器中写数据
            System.out.println(br.readLine());
            ps.println("女:你还好么?");
        
            
            socket.close();
        }
    
    }
    
服务端:
    public class Demo02_TCP代码优化_server {
        @SuppressWarnings("resource")
        public static void main(String[] args) throws IOException {
            demo01();
        }
        private static void demo01() throws IOException {
            ServerSocket ss = new ServerSocket(4455);
            
            Socket socket = ss.accept();
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintStream ps = new PrintStream(socket.getOutputStream());
                
            ps.println("男:你最近还吗?");     //接收请求,将结果数据给客户端
            System.out.println(br.readLine()); //接收请求,接收客户端的一条数据
            
            ps.println("男:没有你的日子我好孤独");
            System.out.println(br.readLine());
            
            
            
            socket.close();
        }

    }


    


    服务端是多线程的
    ServerSocket ss = new ServerSocket(4455);
        while(true){
            new Thread(){
                public void run() {
                    try {
                        Socket socket = ss.accept();
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                            
                        ps.println("男:你最近还吗?");     //接收请求,将结果数据给客户端
                        System.out.println(br.readLine()); //接收请求,接收客户端的一条数据
                        
                        ps.println("男:没有你的日子我好孤独");
                        System.out.println(br.readLine());
                        
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }


e.
    网络编程练习
        案例一:客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串
        案例二:客户端向服务器上传文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值