Java基础 - 网络编程

7.网络编程

7.1概述

  • 计算机网络

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

  • 网络编程

    实现网络互连的不同计算机上运行的程序间的进行数据交换,使用计算机语言来完成

  • 网络模型OSI

    • 应用层 (Application):

        网络服务与最终用户的一个接口。
      
        协议有:HTTP FTP TFTP SMTP SNMP DNS
      
    • 表示层(Presentation Layer):

        数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
      
        格式有,JPEG、ASCll、DECOIC、加密格式等
      
        这层的作用主要是数据处理成计算机能识别的东西或把数据处理成人能识别的东西
      
    • 会话层(Session Layer):

        建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
      
        对应主机进程,指本地主机与远程主机正在进行的会话
      
    • 传输层 (Transport):

        定义传输数据的协议端口号,以及流控和差错效验。
      
        协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
      
    • 网络层 (Network):

        进行逻辑地址寻址,实现不同网络之间的路径选择。
      
        协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
      
    • 数据链路层 (Link):

        建立逻辑连接、进行硬件地址寻址、差错效验等功能。(由底层网络定义协议)
      
        将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
      
        这层的数据通常叫做数据包
      
    • 物理层(Physical Layer):

        建立、维护、断开物理连接。(由底层网络定义协议)
      

7.2网络编程三要素

IP, 端口号, 协议

7.2-1 IP

  • 定义

    想要让网络中的计算机相互通信,就必须为每一台计算机指定一个唯一的标识号,通过这个标识号就能找到这台计算机,在TCP/IP协议中,这个标识号就是IP地址

  • 组成

    网络号段+主机号段

  • 分类

    分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同(DE两类地址目前没有见过)

    • A类地址网络号范围:1.0.0.0---126.0.0.0
    • B类地址网络号范围:128.0.0.0---191.255.0.0
    • C类地址网络号范围:192.0.0.0---223.255.255.0(其中192.168.X.X是私有地址)
    • D类地址范围:224.0.0.0---239.255.255.255
    • E类地址范围:240.0.0.0---255.255.255.254
  • 特殊IP

    127.0.0.1 表示的是回环地址(表示本机)

    X.X.X.255 广播地址

  • InetAddress

    InetAddress implements Serializable

    此类表示IP地址,包含了操作IP的相关方法

    • 常用方法

        static InetAddress getByName(String host) 通过主机名/域名/IP地址获得IP地址对象
      
        static InetAddress getLocalHost() 返回本地主机IP
      
        InetAddress对象的方法:
      
        public String getHostName() 获取主机名称
      
        public String getHostAddress()  获取主机IP
      

7.2-2 端口

  • 端口主要分为物理端口和逻辑端口,我们程序中说的端口指的都是逻辑端口

  • 端口的作用是给计算机上运行中的程序一个标识,不同的程序在运行时有不同的逻辑端口

  • 有效端口范围是:065535,其中01024为系统使用和保留端口

7.2-3 协议

  • UDP

    1. 不需要建立连接

    2. 将数据源和目的封装到数据包中,每个数据包的大小限制在64K内

    3. 因面向无连接,是不可靠的协议,传输速度快

    4. 特点:只管发,不管结果你收到没有,例如发短信

  • TCP

    1. 建立连接

    2. 形成数据传输通道,在通道中进行数据的传输

    3. 通过三握手完成连接,是可靠的传输协议。

    4. 因需要建立连接,效率稍低,但是安全,例如打电话

7.2-4 Socket套接字

  • 定义

    Socket就是一个封装了IP地址和端口号组合在一起的能识别一台唯一计算机上程序的对象.

    该对象还封装了多台计算机之间通信的流对象.

  • Socket机制

    1. 通信的两端都有Socket

    2. 网络通信就是Socket之间的通信

    3. 数据在两个Socket之间,在某种协议的规则下通过IO传输

7.2-5 网络编码解码

网络传输数据需要进行编码和解码

  • 常用类:

    • URLEncoder:提供将String编码为网络传输数据格式的静态方法

      1. 用一些编码机制将不安全字符转成一个或者多个字节

      2. 每个字节用一个包含3个字符的字符串"%xy"表示,其中xy为该字节的16进制表示

      3. 推荐UTF-8

    • URLDecoder:提供将网络传输数据解码为String格式的静态方法

  • 示例代码

       String str = "你好吗123";
       //由于网络HTML不能传输中文,要进行网络编码
       str = URLEncoder.encode(str,"UTF-8");//编码
       System.out.println(str);
    
       //网络解码
       str = URLDecoder.decode(str,"UTF-8");
       System.out.println(str);
    

7.3 UDP编程

DatagramSocket

此类封装了UDP协议,用来发送和接收数据包的套接字。

  • 构造方法

      DatagramSocket() 用于发送端创建对象
    
      DatagramSocket(int port)  用于接收端创建对象,绑定的port端口号为发送端指定的目标端口
    
  • 常用方法

      void send(DatagramPacket p) 发送数据包
    
      receive(DatagramPacket p) 接收数据, DatagramPacket的缓冲区填充了接收的数据
    

DatagramPacket

表示数据包对象

  • 构造方法

      DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    
      构建发送端数据包, buf:发送的数据  length:数据长度  address:ip地址  port:端口
    
      DatagramPacket(byte[] buf, int length)
    
      构建接收端数据包,此时数据包仅作为缓冲区使用, buf:缓冲数组 length:缓冲长度    
    
  • 常用方法

      InetAddress getAddress()  返回IP地址
    
      byte[] getData()  返回缓冲区接收到的数据
    
      int getLength() 返回发送或者接收数据的长度   
    

发送端

  • 发送步骤

    1. 创建DatagramSocket对象

    2. 准备数据,打成数据包

    3. 调用方法发送数据包

    4. 关闭资源

  • 示例代码

      //1.创建socket对象
      DatagramSocket socket = new DatagramSocket();
      //2.将发送数据打成数据包
      String info = "你的数据";
      byte[] bytes = info.getBytes();
      InetAddress address = InetAddress.getByName("192.168.1.1");//目标的IP地址
      int port = 10088; //目标端口
      DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
      //3.发送数据包
      socket.send(packet);
      //4.关闭资源
      socket.close();
    

接收端

  • 接收步骤

    1. 创建DatagramSocket对象

    2. 创建一个数据包

    3. 调用方法接收数据包

    4. 解析数据包

    5. 关闭资源

  • 示例代码

      DatagramSocket socket = new DatagramSocket(10088);
      DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
      socket.receive(packet);//接收数据到数据包的缓冲区
      //获得发送方的ip
      String address = packet.getAddress().getHostAddress();
      //获取数据包的数据
      byte[] data = packet.getData();
      //获取数据长度
      int length = packet.getLength();
      //关闭资源
      socket.close();
    
  • 注意

    必须先开启接收端,再开发送端

7.4 TCP编程

  • 客户端

    • Socket

      客户端通信的套接字

    • 构造方法

         Socket(String host, int port)  创建套接字对象,并将其连接到指定主机上的指定端口
      
    • 常用方法

        OutputStream getOutputStream() 获取套接字的输出流
      
        InputStream getInputStream()  获取套接字的输入流
      
        void shutdownInput()
      
        void shutdownOutput() //告诉对方流对象用完了,否则会导致对方一直在等你给对方发/收数据,所有流用完后必须主动调用这些方法
      
    • 步骤

        1:创建Socket对象(如果对象创建成功,表示完成三握手,连接成功创建)
      
        2:获取输出流,写数据
      
        3:关闭资源
      
    • 示例代码

        //创建对象如无报错,表示连接成功
        Socket socket = new Socket("localhost",10099);
        //获取流对象写数据
        OutputStream out = socket.getOutputStream();
        String data = "hello tcp";
        out.write(data.getBytes());
        //告诉服务端数据发完了
        socket.shutdownOutput();
      
        //获取服务端响应返回的数据
        InputStream in = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) != -1){
            System.out.println(new String(buf,0,len));
        }
        System.out.println("接收完服务器返回的数据了");
      
        socket.close();
      
  • 服务端

    • ServerSocket

      服务端通信的套接字

    • 构造方法

        ServerSocket(int port) 绑定到特定端口
      
    • 常用方法

        Socket accept() 监听客户端连接
      
    • 处理步骤

        1:创建ServerSocket对象
      
        2:监听客户端的连接
      
        3:获取输入流读取数据
      
        4:关闭资源(服务端一般不关闭)
      
    • 示例代码

        ServerSocket socket = new ServerSocket(10099);
        //监听客户端连接
        Socket accept = socket.accept();//阻塞
        //获取输入流,接收客户端发送的数据
        InputStream in = accept.getInputStream();
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) != -1){
            System.out.println(new String(buf,0,len));
        }
      
        //响应客户端
        OutputStream out = accept.getOutputStream();
        out.write("接收到你的信息了".getBytes());
        //告诉客户端数据发完了
        accept.shutdownOutput();
        socket.close();         
      
  • TCP协议

    三握手

    1. 客户端发送请求到服务端,等待服务器确认

    2. 服务端收到信息后,响应客户端

    3. 客户端收到服务器的反馈,向服务器发送确认信息,完成三次握手

  • 案例

    文件上传,把本地的文件放到服务器上

      1:要读本地文件(IO流)
    
      2:要使用网络Socket
    
      3:再使用Socket上的流把数据传入服务器
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 1. 网络编程概述 1.1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接...
    JackChen1024阅读 1,035评论 0 3
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,224评论 0 10
  • 你是校道里一棵迷人的树 也是树里的一名绅士 高大魁梧而面容清秀 时而沉稳肃穆有魅力 时而清爽活泼有活力 魁梧的树干...
    橘子君_澜阅读 301评论 0 3
  • 1.纪念自己首次独立实验 手抖党表示感觉很美妙 以前每次实验几乎都是两人搭档, 跟实验搭档总是在实验理念方面争论不...
    柠檬树lemon66阅读 201评论 0 1
  • 实现两个词的切割如: 开始 kāishǐ ->kāi shǐ 待实现 多字切割simple 1 : 打开门 dak...
    满船清梦___阅读 1,647评论 1 1