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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-27 11:29 编辑

面向网络编程学习笔记

Day 12网络Socket
  • 套接字
  • 用于描述IP地址和端口, 是一种网络编程机制, 通信的两端都会有Socket

网络通信3要素
  • 传输协议
  • IP地址
  • 端口号

常用通信协议
  • UDP

    • 它是一种无连接的不可靠协议
    • 数据传输大小限制为64K(一个包)
    • 不需要建立连接即可传输
    • 数据发送速度快, 发送方只发送数据, 不检查接收方是否真正接收到数据, 所以数据有丢包的情况
    • 这种方式适合实时性要求强的场合, 比如网络电话, 网络游戏等环境, 这种协议延迟很小

  • TCP

    • 它是一种需要建立连接的可靠协议
    • 没有数据传输大小的限制
    • 在传输前需要先建立连接(三次握手)
    • 它的重发机制保证了数据传输的准确性, 但因为需要接收方发回验证信息, 所以数据发送时间长, 数据流量大
    • 这种方式适合准确性要求强的场合, 比如金融系统, 视频点播, 用户可以等待数据传输但是不能忍受错误


InetAddress类
  • java.net.InetAddress类: 用于表示IP地址对象, 可以获取主机名, IP地址等信息

    • 静态方法

      • static InetAddress getLocalHost(): 获取本机的InetAddress对象
      • static InetAddress getByName(String host): 根据主机名或IP的字符串获取主机的InetAddress对象
      • static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象

    • 成员方法

      • 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数据包

    • 构造方法

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

    • 成员方法

      • byte[] getData(): 获取包中的数据, 以byte数组形式
      • int getLength(): 获取数据包中数据的长度, 即byte数组的长度
      • int getPort(): 获取发送方端口号
      • InetAddress getAddress(): 获取数据包发送方的InetAddress对象



TCP相关类
  • java.net.Socket类: 基于TCP协议的Socket

    • 构造方法

      • Socket(InetAddress add, int port)

    • 成员方法

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


  • java.net.ServerSocket: TCP服务端

    • 构造方法

      • ServerSocket(int port)

    • 成员方法

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



代码演示public class Send {
    public static void main(String[] args){
        //创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();
        
        //准备数据
        String s = "udp,im comming!!";
        byte[] bytes = s.getBytes();
        int length = bytes.length;
        InetAddress address = InetAddress.getByName("192.168.15.255");
        int port = 8888;
        //创建数据报包对象
        DatagramPacket dp = new DatagramPacket(bytes, length, address, port);
        //发送数据
        ds.send(dp);
        //释放资源
        ds.close();
    }
}

public class Recieve {
    public static void main(String[] args){
        //创建接收端Socket对象
        DatagramSocket ds = new DatagramSocket(8888);
        //定义字节数组
        byte[] bytes = new byte[1024];
        //创建包对象接受数据
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);
        //解析数据
        InetAddress address = dp.getAddress();
        String sender = address.getHostName();
        int len = dp.getLength();
        //输出结果
        System.out.println("sender --- "+sender+new String(bytes,0,len));
        //释放资源
        ds.close();
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马