java学习笔记-网络编程

作者: 廖小明的赖胖子 | 来源:发表于2019-02-13 15:06 被阅读0次

    慢慢来比较快,虚心学技术

    前言:java网络编程-实质就是两个(或多个)设备(例如计算机)之间的数据传输。java网络编程功能实现主要依赖于java.net包,java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。(引自菜鸟教程-java网络编程


    原文链接:https://blog.csdn.net/Laiguanfu/article/details/87162699

    网络编程概述

    一、网络协议

    在现有的网络中,网络通讯的方式主要有两种:

    • TCP(传输控制协议)方式

    • UDP(用户数据报协议)方式

    其概念及特点如下:

    TCP与UDP的概念与区别

    二、网络编程步骤

    无论是哪种传输协议或传输方式,都是基于客户端以及服务端进行传输,具体步骤如下

    网络编程步骤

    java网络编程

    java网络编程实现主要依赖于java.net包。该api中所包含的基础网络类有:

    • InetAddress类--------IP地址类,封装了对网络IP的操作
    • ServerSocket类------服务端监听socket类
    • Socket类---------------网络连接套接字,实现数据传输的主要操作类

    一、InetAddress类

    如上所属,InetAddress类封装了对网络IP的操作,我们可以通过该类获取对应的IP所携带的基本信息,其主要方法如下:

    //通过域名获取IP对象
    InetAddress host =  InetAddress.getByName(域名);
    
    //获取本地IP对象
    InetAddress host =InetAddress.getLocalHost();
    
    //获取ip地址
    host.getHostAddress();
    
    //获取IP对应域名
    host.getHostName();
    

    二、套接字Socket

    java网络编程传输主要依靠套接字对象。我们知道,TCP协议传输两端需要建立虚拟连接,实际上,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket,本质上就是一组接口,是对TCP/IP协议的封装和应用(程序员层面上)。相当于两台设备间的逻辑端点

    如下是socket的工作流程(对应上述网络编程步骤)

    socket的工作流程

    其中,ServerSocket的主要方法如下:

    //服务端打开对用端口并获取监听对象
    public ServerSocket(int port);
    
    //监听并获取连接对象
    public Socket accept()
    
    //关闭服务端监听
    public void close()
    

    注意:ServerSocket的accept方法是堵塞的,一直监听到有连接进来才会执行之后的代码

    Socket主要方法:

    //创建连接对象,连接服务器
    public Socket(String host, int port);//host为服务器地址,port为服务器监听端口
    
    //获取输出流对象(输出信息)
    public OutputStream getOutputStream()
    
    //获取输入流对象(接收信息)
    public InputStream getInputStream()
    
    //关闭socket
    public synchronized void close()
    

    简单Demo

    创建服务端 Server.java

    try {
           //服务端打开端口8888
           ServerSocket ss = new ServerSocket(8888);
    
          //在8888端口上监听,看是否有连接请求过来
          logger.info("监听在端口号:8888");
          Socket s = ss.accept();
    
          logger.info("有连接过来" + s);
    
          //打开输入流
          InputStream is = s.getInputStream();
    
          if (is != null) {
              logger.info("接收到信息:");
              //读取客户端发送的数据
              int msg = is.read();
              //打印出来
              logger.info(msg + "");
          }
          is.close();
    
          s.close();
          ss.close();
    } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
    }
    

    创建客户端并发送信息给服务端 Client.java

    try {
            logger.info("发起连接。。。");
            //连接到本机的8888端口
            Socket s = new Socket("127.0.0.1", 8888);
            logger.info("连接成功");
    
            logger.info("发送细信息:110");
            // 打开输出流
            OutputStream os = s.getOutputStream();
    
            // 发送数字110到服务端
            os.write(110);
    
            logger.info("发送成功");
            os.close();
            s.close();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    运行结果如下:

    ----Server.java
    
    [main] INFO SocketConnect.Server - 监听在端口号:8888
    [main] INFO SocketConnect.Server - 有连接过来Socket[addr=/127.0.0.1,port=5454,localport=8888]
    [main] INFO SocketConnect.Server - 接收到信息:
    [main] INFO SocketConnect.Server - 110
    
    ----Client.java
    
    [main] INFO SocketConnect.Client - 发起连接。。。
    [main] INFO SocketConnect.Client - 连接成功
    [main] INFO SocketConnect.Client - 发送细信息:110
    [main] INFO SocketConnect.Client - 发送成功
    
    

    扩展Demo -使用DataStream进行数据传输,同时实现双向交流(单线程)

    DataInputStream/DataOutputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。使用起来更加方便

    Server.java

    try {
                ServerSocket ss = new ServerSocket(8888);
                logger.info("监听8888.。。。");
    
                Socket socket = ss.accept();
    
                logger.info("有连接过来" + socket);
    
                InputStream is = socket.getInputStream();
    
                OutputStream os = socket.getOutputStream();
    
                //把输入输出流封装在DataInputStream
                DataInputStream dis = new DataInputStream(is);
    
                DataOutputStream dos = new DataOutputStream(os);
    
                String message = "start";
    
                logger.info("交流开始。。。");
                while (!message.equals("end")) {
                    System.out.print("接收到信息:");
    
                    //使用readUTF读取字符串
                    message = dis.readUTF();
    
                    System.out.println(message);
    
                    //使用Scanner读取控制台的输入,并发送到服务器
                    System.out.print("发送信息:");
                    Scanner sc = new Scanner(System.in);
    
                    message = sc.next();
    
                    dos.writeUTF(message);
                }
    
                logger.info("交流结束");
    
                dis.close();
                is.close();
                socket.close();
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    

    Client.java

    try {
         Socket s = new Socket("127.0.0.1", 8888);
    
         OutputStream os = s.getOutputStream();
    
         //获取输出流并封装到DataOutputStream中
         DataOutputStream dos = new DataOutputStream(os);
    
         //获取输入流并封装到DataInputStream中
         InputStream is = s.getInputStream();
         DataInputStream dis = new DataInputStream(is);
    
         String message = "";
    
         while(true){
            //使用Scanner读取控制台的输入,并发送到服务器
            System.out.print("发送信息:");
            Scanner sc = new Scanner(System.in);
            message= sc.next();
            dos.writeUTF(message);
    
            //输入的时“end”字符串时,结束交流
            if(NetWorkConst.END.equals(message)){
                logger.info("交流结束");
                break;
            }
    
            message = dis.readUTF();
            logger.info("收到服务端信息:"+message);
            if(NetWorkConst.END.equals(message)){
                break;
            }
         }
    
         dos.close();
         s.close();
    } catch (UnknownHostException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
    } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }
    

    运行结果:

    -----Server.java
    
    [main] INFO SocketConnect.Server - 监听8888.。。。
    [main] INFO SocketConnect.Server - 有连接过来Socket[addr=/127.0.0.1,port=7260,localport=8888]
    [main] INFO SocketConnect.Server - 交流开始。。。
    接收到信息:123
    发送信息:我是服务器端
    接收到信息:我是客户端
    发送信息:end
    [main] INFO SocketConnect.Server - 交流结束
    
    -----Client.java
    
    发送信息:123
    [main] INFO SocketConnect.Client - 收到服务端信息:我是服务器端
    发送信息:我是客户端
    [main] INFO SocketConnect.Client - 收到服务端信息:end
    

    总结

    1.网络传输方式主要有两种,TCP传输方式安全可靠,传输双方需要建立虚拟连接,存在连接时延。UDP方式通过各种渠道传输数据,是个不可靠传输协议,且无法判断数据到达的正确性和时间。所以一般使用TCP传输方式或者两者结合使用

    2.java网络编程依赖于java.net包实现,其中的InetAddress封装了一些关于IP的操作方法

    3.网络编程离不开客户端和服务端,java的C/S模式网络编程开发,使用套接字对象socket作为设备间的逻辑连接端点,实行传输。服务器端主要有以下步骤:创建服务器端口监听socket-获取连接socket-交换信息-结束交换,关闭socket及相关资源;客户端主要有以下步骤:创建对应地址端口的socket对象,请求连接-交换信息-结束交换,关闭socket及相关资源

    参考文档:

    【1】java开发手册

    【2】https://blog.csdn.net/csdnliuxin123524/article/details/78144063

    【3】https://blog.csdn.net/sihai12345/article/details/79334299

    相关文章

      网友评论

        本文标题:java学习笔记-网络编程

        本文链接:https://www.haomeiwen.com/subject/fokdeqtx.html