zoukankan      html  css  js  c++  java
  • JAVA网络编程

    JAVA网络编程

    网络的定义

    • 我们将多台计算机按照一定的模式连接到一起的一种方式

    • 同一个网络中的计算机可以相互进行访问

    主要功能

    • 资源共享

    • 信息传输与集中处理

    • 均衡负荷与分布处理

    网络分层

    由于结点之间联系很复杂,在制定协议时,把复杂成份分解成 一些简单的成份, 再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调 用下一层,而与再下一层不发生关系。

    通信协议的分层

    物数网传会表应

    • 物理层

    • 数据链路层

    • 网络层

    • 传输层

    • 会话层

    • 表示层

    • 应用层

    物理层

    • 网络硬件人员需要具备的条件

    • 作为Java程序员了解即可?除非你给妹子接网线

    网络层

    • 我们网络中有可能有很多的机器,如何唯一性的定位到你

    • 定位网络中的一台机器

    • IP

      • Internet protocol网络协议

      • IP分为IP4和IP6

      • 最初的是IP4占用4个字节,一个字节是[0-255].于是IP4的取值为0,2550,255

      • 一个企业也只占用几个公网IP

      • 因为IP4不够用了,于是诞生了IP6 ,IP6占用16个字节

      • 但是现在正处于ip4到ip6的转换过程中,需要一定的时间

    • port

      • 因为一台服务器只有一个IP,所以导致当别人访问这台服务器的时候

      • 我们还需要区分是访问的那个应用

      • 端口占用2个字节,范围是[0-65535] ,我们可以把一个应用绑定在一个端口上

      • 当别人访问这个端口的时候,就可以直接访问这个应用

      • 不要使用1024之下的端口,系统保留端口

    • IP是为了定位一台电脑,端口是为了定位一个应用

    • DNS

      • 域名系统(服务)协议

      • 是为了更好的记忆IP地址

      • 域名解析服务器:可以将域名解析成IP地址,以前有很多病毒专门做Hosts欺骗

    • InetAddress

      • 获取指定的IP地址,只通过IP定位到某一个主机

    public class NetDemo01 {
    public static void main(String[] args) throws UnknownHostException {
    //static InetAddress getLocalHost() 返回本地主机的地址。  
    InetAddress i1 = InetAddress.getLocalHost();
    System.out.println(i1);   //DESKTOP-P04TCL5/192.168.14.111
    //static InetAddress getByName(String host) 决定了IP地址的主机,主机的名字。  
    InetAddress i2 = InetAddress.getByName("www.baidu.com");
    System.out.println(i2);  //www.baidu.com/180.101.49.12

    System.out.println(i1.getHostName());  //DESKTOP-P04TCL5
    System.out.println(i1.getHostAddress());  //192.168.14.111

     

    • InetSocketAddress

      • 不但可以获取IP地址,还可以使用端口进行定位

      • 可以直接定位到某一个应用

    • URL--URI

      • 统一资源定位符

      • http://tool.cncn.com/youbian/100086

        • http:// 传输协议

        • tool.cncn.com IP地址 :80 默认网络传输的端口号为80

        • /youbian/100086 资源位置

      • https://www.ip138.com/post/search.asp?area=100086&action=area2zone

        • https:// 传输协议

        • www.ip138.com DNS -->IP地址 104.24.98.161 :80 端口号

        • search.asp 资源位置

        • ?area=100086&action=area2zone 请求的参数

      • 这个资源的定位是全网统一的,每一个资源在网络上都有一个唯一的定位

      • public class URLDemo03 {
        public static void main(String[] args) throws MalformedURLException {
        //URL(String spec)
        URL url = new URL("http://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");

        System.out.println(url);

        //getProtocol() 协议
        System.out.println("协议:"+url.getProtocol());
        System.out.println("域名:"+url.getHost());
        System.out.println("端口:"+url.getPort());
        System.out.println("资源:"+url.getFile());  ///index.html?name=zhangsan&pwd=123
        System.out.println("文件:"+url.getPath());  
        System.out.println("数据:"+url.getQuery());  
        System.out.println("锚点:"+url.getRef());  

    传输层

    • TCP

      • 传输控制协议 

      • 包含: http https ftp  smtp

      • 数据相对安全的一种协议,基于连接的,如果使用tcp协议传输数据,必须先建立连接,然后发送数据

      • TCP相当于打电话

      • 三次握手,四次挥手

        • 建立连接时  

          • 1客户端发送一个连接请求到服务器

          • 2服务器检查自己并返回一条响应信息

          • 3客户端发送消息确认建立连接

        • 断开连接时

          • 1客户端发送请求说要断开连接

          • 2服务器开始受到请求,检查是否有未传输的数据

          • 3服务器检查完毕,确认断开

          • 4客户端也确认断开连接

      • 安全,但是效率有点低,后面专门做了一些优化措施

    • UDP

      • 用户数据包

      • 基于数据包发送的协议,我们的目的就是发送出去数据包

      • UDP相当于发短信

      • 相对效率较高,但是不安全

    应用层

    • 对应的程序使用到网络传输的数据

    Socket编程

    UDP

    UDP实现基本流程: 发送端     

    • 1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口

    • 2.准备数据--> 转为字节数组

    • 3.打包  DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。

    • 4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。

    • 5.关闭

    public class UDPSend01 {
    public static void main(String[] args) throws IOException {
    System.out.println("--------------我是发送端------------------");
    //1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
    DatagramSocket  send = new DatagramSocket(7777);
    //2.数据
    byte[] msg = "Hello".getBytes();
    //3.打包
    DatagramPacket  packet = new DatagramPacket(msg,0,msg.length,new InetSocketAddress("localhost", 8888));
    //4.发送
    send.send(packet);
    //5.关闭
    send.close();
    }
    }

     

    UDP实现基本流程: 接收端

    • 1.构建接收端

    • 2.准备包裹-->用来接收数据

    • 3.接收

    • 4.处理数据

    • 5.关闭

    public class UDPReceive02 {
    public static void main(String[] args) throws IOException {
    System.out.println("--------------我是接收端-----------");
    //1.构建接收端
    DatagramSocket  receive = new DatagramSocket(8888);
    //2.准备包裹-->用来接收数据
    byte[] arr = new byte[1024*60];
    DatagramPacket  packet = new DatagramPacket(arr,arr.length);
    //3.接收
    receive.receive(packet);

    //4.处理数据
    /*
    * byte[] getData()
             返回数据缓冲区。
      int getLength()
             返回将要发送或接收到的数据的长度。
    */
    byte[] result = packet.getData();
    int length = packet.getLength();
    System.out.println(new String(result,0,length));

    //5.关闭
    receive.close();
    }
    }

    TCP

    tcp基于IO流操作

    • TCP 基本流程: 客户端

    • 1.创建客户端 Socket(String host, int port)  指定服务端的IP+端口

    • 2.获取IO流

    • 3.写出数据

    • 4.关闭

    public class TCPClient03 {
    public static void main(String[] args) throws UnknownHostException, IOException {
    String name = "aaa";
    String pwd = "123";
    System.out.println("---------------client--------------");
    //1.创建客户端
    Socket client =  new Socket("127.0.0.1",8888);
    //2.获取输入流
    OutputStream os = client.getOutputStream();
    //3.写出数据
    os.write(("name="+name+"&pwd="+pwd).getBytes());
    os.flush();

    //获取输入流读取服务端响应
    InputStream is = client.getInputStream();
    byte[] car = new byte[1024];
    int len = is.read(car);
    System.out.println(new String(car,0,len));

    //4.关闭
    is.close();
    os.close();
    client.close();
    }
    }

    tcp基于IO流操作

    • TCP 基本流程: 服务端

    • 1.创建服务端 ServerSocket(int port)   创建绑定到特定端口的服务器套接字。 服务端的端口号

    • 2.阻塞式监听

    • 3.获取IO流       

    • 4.读入数据

    • 5.操作数据

    • 6.关闭

    public class TCPServer04 {
    public static void main(String[] args) throws IOException {
    System.out.println("---------------Server--------------");
    //1.创建服务端
    ServerSocket server = new ServerSocket(8888);
    //2.阻塞式监听
    Socket client = server.accept();
    System.out.println("-----------有一个客户端连接成功----------");

    //3.获取IO流  
    InputStream is = client.getInputStream();

    //4.读入数据
    byte[] car = new byte[1024];
    //把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
    int len = is.read(car);

    String name =null;
    String pwd =null;
    //5.操作数据
    String str = new String(car,0,len);
    //分割数据 name=aaa&pwd=123
    String[] arr = str.split("&");
    for(String s:arr) {
    String[] ss = s.split("=");
    //判断当前这个ss[1]是名字的值还是密码的值
    if("name".equals(ss[0])) {
    name = ss[1];
    }else {
    pwd = ss[1];
    }
    }
    System.out.println(name);
    System.out.println(pwd);

    //获取输出流
    OutputStream os = client.getOutputStream();

    //校验
    if("111".equals(name) && "123".equals(pwd)) {
    os.write("登录成功".getBytes());
    }else {
    os.write("shibai".getBytes());
    }
    os.flush();
    //6.关闭
    os.close();
    is.close();
    client.close();
    server.close();
    }
    }
  • 相关阅读:
    IDEA使用Git传放项目
    前端自适应知识点
    数据可视化
    vue调用Moment显示时间
    java判断通常的逻辑
    java常用的逻辑
    java匿名内部类练习
    java 匿名内部类
    java 内部类定义在局部时需要注意的情况
    java内部类的定义原则
  • 原文地址:https://www.cnblogs.com/CHOI-6/p/13295540.html
Copyright © 2011-2022 走看看