zoukankan      html  css  js  c++  java
  • Day 20:网络编程(1)

    什么是计算机网络?

      指的是分布在不同地域的计算机,通过外部设备连接起来,实现资源共享与数据传输的计算机系统。

     通信三要素:

    IP:

    IP地址

      Internet上的每台主机(Host)都有一个唯一的IP地址。IP地址的长度为32位,分为4段,每段8位,用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开。例如    159.226.1.1。(四个字节)
    IP地址类别
    IP地址是由网络号和主机号组成
      A类地址:8位网络位,24位主机位
      B类地址: 16位网络位,16位主机位
      C类地址: 24位网络位,8位主机位
      特殊的IP地址:127.0.0.1 表示 本机回环地址

    端口:

    Port地址
      如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
    Port分类(0~65535)
      公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。
      注册端口(RegisteredPorts):从1024到49151。它们松散地绑定于一些服务。
      动态和/或私有端口(Dynamicand/orPrivatePorts):从49152到65535。
      常用端口
        21    FTP       
        80    HTTP
        443  HTTPS

    协议:

    TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。
      特点:
        面向连接的协议,数据传输必须要建立连接,所以在TCP中需要连接时间。
        传输数据大小限制,一旦连接建立,双方可以按统一的格式传输大的数据。
        一个可靠的协议,确保接收方完全正确地获取发送方所发送的全部数据。
    UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
      特点:
        每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
        UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
        UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

    Java网络编程
      Java网络编程其实就是实现局域网或互联网之间的数据通信(数据传输)。
    Java网络编程要素
      通过前面的知识,大家知道了计算机之间的数据传输需要三个要素。(IP(主机名)、端口、协议),Java是OOP语言,所以将其封装为特定的对象,java.net.*
      对象映射
        IP       主机名   (InetAddress)
        端口   数字标识   不用封装为对象  

    InetAddress
      此类表示互联网协议 (IP) 地址。
    功能
      getLocalHost()
      getHostAddress()
      getHostName()
      getByName(String host)
      getAllByName(String host)
    细节
      使用getByName(String host)通过一个IP地址找主机时,如果IP和Address没有对应在公网上,那么该IP解析不了对应的地址,而且显示为对应IP且查询很慢。
      可以getByName(String host)找出域名对应的IP,getAllByName()可以获取多个地址。

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class Demo1 {
        public static void main(String[] args) throws UnknownHostException {
            InetAddress address  = InetAddress.getLocalHost();
            System.out.println(address.getHostAddress());//返回的是字符串
            System.out.println(address.getHostName());
            
            InetAddress address1 = InetAddress.getByName("www.baidu.com");
            System.out.println(address1);
            System.out.println(address1.getHostAddress());//返回的是字符串
            
        }
    }
    /*InetAddress[] address1 = InetAddress.getAllByName("www.baidu.com");
      for(InetAddress a:address1) {
       System.out.println(a);
      }*/
    //百度公司注册了两台服务器

    在JAVA中网络通信也叫做Socket(插座)通讯,要求互相通讯的两台机器必须安装Socket。不同的协议有不同的Socket

      UDP
        将数据极其源和目的封装为数据包,不需要建立连接。
        每个数据包大小限制在64K中
        因为无连接,所以不可靠
        因为不需要建立连接,所以速度快

      UDP下的Socket:

        DatagramSocket(UDP插座服务)

        DatagramPacket(数据包类)

    TCP
      面向连接,有特有的通道
      在连接中传输大数据量
      通过三次握手机制连接,可靠协议
      通信前必须建立连接,效率稍低

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    public class Demo2 {
        public static void main(String[] args) throws IOException {
            //建立udp的服务
            DatagramSocket ds = new DatagramSocket();
            //准备数据,把数据封装到数据包中。
            String data = "fdsfgdsgdsgfdsfg";
            //创建了一个数据包
            DatagramPacket dp = new DatagramPacket(data.getBytes(),data.getBytes().length ,InetAddress.getLocalHost() , 9090);
            //调用udp的服务发送数据包
            ds.send(dp);
            //关闭资源 ---实际上就是释放占用的端口号
            ds.close();
            
        }
    }
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class Demo3 {
        private void main(String args[]) throws IOException {
            // TODO Auto-generated method stub
            //建立udp的服务, ,并且要监听一个端口。
            DatagramSocket ds = new DatagramSocket(9090);
            //准备空的数据包用于存放数据。
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length); 
            //receive是一个阻塞型的方法,没有接收到数据包之前会一直等待。 数据实际上就是存储到了byte的自己数组中了。
            ds.receive(datagramPacket);        
            System.out.println(new String(buf,0,datagramPacket.getLength()));
            //关闭资源
            ds.close();
            
            
        }
        
    }

    先在eclipse运行接收端,然后在命令提示符中运行发送端,否则数据丢失。

  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 17-1
    边工作边刷题:70天一遍leetcode: day 17
    边工作边刷题:70天一遍leetcode: day 106
    test
    边工作边刷题:70天一遍leetcode: day 18-2
    边工作边刷题:70天一遍leetcode: day 18-1
    边工作边刷题:70天一遍leetcode: day 18
    边工作边刷题:70天一遍leetcode: day 96
    边工作边刷题:70天一遍leetcode: day 19-2
    边工作边刷题:70天一遍leetcode: day 19-1
  • 原文地址:https://www.cnblogs.com/JYDesigner/p/9425106.html
Copyright © 2011-2022 走看看