1. 网络编程

2. InetAddress

  • getByName(String host): 根据ip地址/主机名 返回一个InetAddress对象
  • getHostName(): 返回主机名
  • getHostAddress(): 以字符串形式返回ip地址

3. IP

IPv4: 32bit (4字节) 点分十进制表示法

IPV6: 128bit(8字节) 冒分十六进制表示法

冒号后如果连为0可以省略 如 :0025 可以表示为:25

如果中间有多个连续的冒号可以简写为2个冒号 如: FF01:0:0:0:0:1101 写为 FF01::1101

4. 端口

端口:应用程序在设备中唯一标识

端口号:两个字节表示的整数,取值范围 0 ~ 65535

5. 协议

协议:连接和通信的规则被称为网络通信协议

5.1. UDP协议

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议 连接快,有大小限制一次最多发生64k,数据不安全,易丢失数据

5.2. TCP协议

  • 传输控制协议(Transmission Control Protocol)
  • TCP协议是面向连接的通信协议 速度慢,没有大小限制,数据安全

6. UDP通信程序

6.1. 发送端

  • DatagramSocket() : 无参构造方法
  • DatagramPacket(byte[] 数据数组, 要传输数组的长度, 目标地址对象 , 端口号):带参构造方法 打包数据
  • send(DatagramPacket 打包的数组): 发送数据
  • close(): 关闭通信
  1. // upd发送
  2. DatagramSocket ds = new DatagramSocket();
  3. //数据值
  4. String s = "你好世界";
  5. byte[] bytes = s.getBytes();
  6. InetAddress byName = InetAddress.getByName("127.0.0.1");
  7. int port = 10000;
  8. // 打包数据
  9. DatagramPacket dp = new DatagramPacket(bytes, bytes.length, byName, port);
  10. // 发送数据
  11. ds.send(dp);
  12. // 关闭
  13. ds.close();

6.2. 接收端

  • DatagramSocket(int 端口号) : 带参构造方法 接收数据的端口
  • DatagramPacket((byte[] 数据数组, 要接收数组的长度): 带参构造方法 接收容器
  • receive(DatagramPacket 接收容器): 接收数据 如果接收不数据会一直等待(阻塞)下面的代码不会执行
  • getData(): 获取要接收到的数据 返回为一个字节数组
  • getLength(): 获取要发送的数据的长度或接收到的数据的长度。
  • close(): 关闭通信
  1. // 接收端建立接收
  2. DatagramSocket ds =new DatagramSocket(10000);
  3. // 接收容器
  4. byte[] bytes =new byte[1024];
  5. DatagramPacket dp =new DatagramPacket(bytes,bytes.length);
  6. // 接收数据
  7. ds.receive(dp);
  8. int lenth = dp.getLength();
  9. System.out.println(new String(bytes,0,lenth));
  10. // 关闭通信
  11. ds.close();

6.3. 组播

上面1对1 服务器对客户端 称为单播

组播又称多播 指特定某范围内客户端进行发送

组播地址:224.0.0.0 ~ 239.255.255.255 其中 244.0.0.0 ~ 224.0.0.255 为预留的组播地址

  • 发送端 与 1对1 无异 注意getByname 为组播地址

  • 接收端 创建 MulticastSocket 对象

    • joinGroup(InetAddress 对象): 把当前客户端加入到组播组中
  • ```java MulticastSocket ms = new MulticastSocket(10000);

ms.joinGroup(InetAddress.getByName(“224.1.1.1”));

byte[] bytes =new byte[1024]; DatagramPacket dp =new DatagramPacket(bytes,bytes.length);

ms.receive(dp); int lenth = dp.getLength();

System.out.println(new String(bytes,0,lenth));

ms.close();

  1. <a name="156c097a"></a>
  2. ## 6.4. 广播
  3. 将数据发送到所有客户端
  4. 广播地址:255.255.255.255
  5. - 发送端 与 1对1 无异 注意getByname 为广播地址
  6. - 接收端 与 1对1 无异 因为广播是无差别的发送
  7. <a name="07ec80e0"></a>
  8. # 7. TCP通信程序
  9. TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
  10. 通信之前要确保连接已经建立
  11. <a name="074eac19"></a>
  12. ## 7.1. 客户端
  13. - Socket(string host, int port): 带参构造方法
  14. - getOutputStream(): 获取一个IO流 返回一个OutputStream对象
  15. - write(): 写入(传输)数据
  16. - close(): 在关闭流的时候 会给对方发送一个结束标记动作
  17. ```java
  18. Socket sk =new Socket("127.0.0.1",10000);
  19. OutputStream outputStream = sk.getOutputStream();
  20. outputStream.write("hello".getBytes(StandardCharsets.UTF_8));
  21. outputStream.close();
  22. sk.close();

7.2. 服务端

  • ServerSocket(int port ) : 带参构造方法
  • accept(): 返回一个Socket对象 会有阻塞现象
  • getInputStream(): 获取输入流
  • read(): 读取流中的数据 返回值为一个int 会有阻塞现象
  1. ServerSocket ss =new ServerSocket(10000);
  2. Socket accept = ss.accept();
  3. InputStream inputStream = accept.getInputStream();
  4. int b;
  5. while ((b = inputStream.read()) != -1){
  6. System.out.println((char) b);
  7. }
  8. accept.close();
  9. ss.close();

7.3. 原理

  1. accept方法是阻塞的,作用是等待客户端连接
  2. 客服端创建对象并连接服务器,此时是通过三次握手协议保证跟服务器之间的连接
  3. 针对客户端来讲,是往外写,所以是输出流 针对服务器来讲,是往里读,所以是输入流
  4. read方法也是阻塞
  5. 在关闭流的时候,还多了一个往服务器写结束标记的动作
  6. 最后一步断开连接,通过四次挥手协议保证连接终止

8. 三次握手

36. 网络编程 - 图1

  1. 向服务器发出连接请求
  2. 服务器向客户端返回一个响应
  3. 客户端再次向服务器发出确认信息

9. 四次挥手

36. 网络编程 - 图2

  1. 客户端向服务器发出取消请求
  2. 服务器向客户端返回一个响应
  3. 服务器向客户端发出确认取消信息
  4. 客户端再次发送确认消息

10. UUID

java提供UUID类 可以方便的生成uuid

  • randomUUID(): 伪随机 返回一个UUID对象
  • toString(): 将UUID对象转成String