A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-26 10:47 编辑

面向网络编程学习笔记

网路编程
  • 计算机网络


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


  • 网络编程


    • 让不同计算机上运行的程序可以通过网络进行数据交换


  • Socket: 中文译名为套接字(记住).


    • 不是协议, 而是对协议的封装, 提供了编程规范接口, 让程序员可以通过它来实现相关网络协议
    • 用于描述IP地址和端口. 是一种网络编程机制. 通信两端都有Socket
    • 计算机上一般会有多个服务程序, 每个服务程序会使用多个Socket进行网络通信, 每个Socket会绑定到一个端口上, 网络通信就是Socket之间的通信, 数据在两个Socket之间通过IO流传输
    • 实际上Socket名词是插座的意思, 动词是插入插座的意思. 两台计算机通过网络通信, 可以把这种网络连接看做把网线插头插入网口插座一样, 网线两端的插头插入两台计算机的网口插座, 就可以通过网线进行网络通信.
      网络通信三要素
      传输协议:   通信的规则
      IP地址:  网络设备的标识.
      端口号: 标识使用网络通信的进程的逻辑地址, 用于定位一个主机上的具体服务


    UDP和TCP区别
    • UDP: USER DATAGRAM PROTOCOL, 用户数据报协议.


      • 特点:


        • 无连接的不可靠协议
        • 数据传输大小限制为64K(一个包)
        • 不需要建立连接即可传输
        • 数据发送速度快, 发送方只发送数据, 不检查接收方是否真正接收到数据, 所以数据可能有丢包的情况


      • 适用场景


        • 适合实时性要求强的场合, 比如网络电话等环境, 这种协议延迟很小



    • TCP: TRANSMISSION CONTROL PROTOCOL, 传输控制协议


      • 特点:


        • 需要建立连接的可靠协议
        • 没有数据传输大小的限制
        • 在传输前需要先建立连接(三次握手)
        • 它的重发机制保证了数据传输的准确性, 但因为需要接收方发回验证信息, 所以数据发送时间长, 数据流量大


      • 适用场景


        • 这种方式适合准确性要求强的场合, 比如金融系统, 视频点播, 用户可以等待数据传输但是不能忍受错误




    InetAddress概述和测试
    java.net.InetAddress类: 用于表示IP地址对象 (InetAddress的实例包含 IP 地址,还可能包含相应的主机名)
    • 静态方法


      • static InetAddress getLocalHost(): 获取本机的InetAddress对象
      • static InetAddress getByName(String host): 根据主机名IP的字符串获取主机的InetAddress对象
      • static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象. 即127.0.0.1或localhost
      • static InetAddress getByAddress(byte[] addr): 根据IP获取InetAddress对象


        • 如: InetAddress.getByAddress(new byte[]{(byte)192, (byte)168, (byte)1, (byte)1});



    • 成员方法


      • String getHostAddress(): 返回主机的IP地址
      • String getHostName(): 返回主机名


      UDP协议发送数据
      • java.net.DatagramSocket类: 基于UDP协议的Socket


        • 构造方法


          • DatagramSocket(): 创建DatagramSocket对象, 随机分配端口号
          • DatagramSocket(int port): 创建DatagramSocket对象, 指定端口号


        • 成员方法


          • void send(DatagramPacket p): 发送数据包
          • void receive(DatagramPacket p): 接收数据, 数据保存在DatagramPacket对象中
          • void close(): 关闭通信, 释放资源



      • java.net.DatagramPacket类: UDP数据包


        • 构造方法


          • DatagramPacket(byte[] msg, int msgLength, InetAddress host, int port): 创建数据包对象, 指定数据, 目标主机对象, 端口
          • DatagramPacket(byte[] buf, int length): 创建数据包对象, 接收数据为length的数据, 存入byte数组中


        • 成员方法


          • InetAddress getAddress(): 获取数据包发送方的InetAddress对象        
          • byte[] getData(): 获取包中的数据, 以byte数组形式
          • int getLength(): 获取数据包中数据的长度, 即byte数组的长度
          • int getPort(): 获取发送方端口号
            UDP发送数据步骤// 1. 为发送端创建Socket对象(DatagramSocket)
            DatagramSocket datagramSocket = new DatagramSocket();
            // 2. 创建数据并打包
            DatagramPacket datagramPacket = new DatagramPacket(byte数组, 数组长度, InetAddress对象, 端口号);
            // 3. 发送数据
            datagramSocket.send(datagramPacket);
            // 4. 释放资源
            datagramSocket.close();UDP协议接收数据

            • UDP不区分发送端和客户端, 所以都使用DatagramSocket即可
            • UDP接收数据步骤

              // 1. 创建接收端Socket对象:
              DatagramSocket datagramSocket = DatagramSocket(接收方端口号);
              // 2. 接收数据
              DatagramPacket datagramPacket = new DatagramPacket(byte数组, 数组长度);
              datagramSocket.receive(datagramPacket);                 // 该方法会阻塞等待接收数据
              // 3. 解析数据
              InetAddress inetAddress = datagramPacket.getAddress();  // 获取发送方IP地址
              byte[] bytes = datagramPacket.getData();                // 获取数据
              int dataLength = datagramPacket.getLength();            // 获取数据长度
              String s = new String(bytes, 0, dataLength);
              // 4. 输出数据
              System.out.println(s);
              // 5. 释放资源:
              datagramSocket.close();TCP协议发送数据

              • java.net.Socket类: 基于TCP协议的Socket, 作为客户端


                • 构造方法


                  • Socket(InetAddress add, int port): 创建TCP客户端对象


                • 成员方法


                  • OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
                  • InputStream getInputStream(): 获取输入流, 用于接收数据
                  • void close(): 释放资源



              • TCP发送数据步骤

                // 1. 创建客户端Socket对象(建立连接)
                Socket socket = new Socket(InetAddress地址, 端口号);
                // 2. 获取输出流对象
                OutputStream outputStream = socket.getOutputStream();
                // 3. 发送数据
                outputStream.write(byte数组);
                // 4. 释放资源
                socket.close();
                连接失败异常:


                • ConnectException: Connection refused: connect: 连接被拒绝, 无法创建连接. 一般是因为网络不通, IP地址不存在等导致无法连接
                • 解决办法:


                  • 确认必须有接收端, 且可以连接
                    TCP协议接收数据

                    • java.net.ServerSocket: TCP服务端


                      • 构造方法


                        • ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口


                      • 成员方法


                        • Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
                        • void close(): 关闭Socket



                    • TCP接收数据步骤



                    // 1. 创建服务端ServerSocket对象:
                    ServerSocket serverSocket = new ServerSocket(端口号);  // 指定要监听的端口号
                    // 2. 监听数据
                    Socket socket = serverSocket.accept();                // 该方法会阻塞, 直到有客户端连接
                    // 3. 获取输入流对象
                    InputStream inputStream = socket.getInputStream();
                    // 4. 获取数据
                    int dataLength = inputStream.read(装数据的byte[]数组);
                    String s = new String(byte[], 0, dataLength);
                    // 5. 输出数据
                    System.out.println(s);
                    // 6. 释放资源:
                    socket.close();
                    serverSocket.close();


1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马