• 8、网络


    web方向:少用
    android:常用  
     

    一、网络通讯三要素:

         1、IP:32位的二进制数据,切成4分,每份8位(192.168.1.1),0~255
         2、端口:标识该消息给哪个应用程序处理的标识符,0~65535,
         3、协议
     
    IP地址
      IP地址=网络号+主机号(192.168.1 +1)
      IP地址分类:
           1、A类地址 = 一个网络号+三个主机号 2^24 政府单位
           2、B类地址 = 两个网络号+两个主机号 2^16 事业单位
           3、C类地址 = 三个网络号+一个主机号 2^8 私人
     

    1、IP类 InetAddress

    常用方法:
    (1)返回主机的IP地址对象,静态方法,没有构造方法
         getLocalHost();
    (2)返回IP地址的字符串表示形式
         getHostAddress();
    (3)返回主机名
         getHostName();
    (4)根据主机名或者IP地址的字符串形式确定IP地址对象
         getByName();
    (5)返回IP地址的数组形式
         getAllByName();

    2、端口

         范围:0~65535
         0~1023:系统紧密绑定的服务
         1024~65535:可以使用

     3、协议:

    (1)UDP:飞秋,游戏
    (2)TCP                
     
    在Java中网络通信也称为Socket(套接字/插座),要求都安装了Socket,不同的协议就有不同的Socket
     

    二、UDP通讯协议

    1、特点

    (1)将数据源及其目的封装为数据包,面向无连接
    (2)数据包限制在64K
    (3)不可靠
    (4)速度快
    (5)UDP不分服务端与客户端,只分发送端与接收端
     
    UDP协议下的Socket:
        (1)DatagramSocket:UDP插座服务,发送和接收数据包的套接字
        (2)DatagramPacket:数据包类     
         DatagramPacket(buf, length, address, port);  // buf发送的内容;length发送数据内容大小;address发送目的IP地址对象;port端口号
     

    2、发送端步骤

    (1)建立UDP服务
    (2)准备数据,把数据封装到数据包中,发送端要IP地址和端口号
    (3)调用UDP发送数据
    (4)关闭资源
     

    3、接收端步骤

    (1)建立UDP服务,监听端口
    (2)准备空的数据包
    (3)调用UDP服务接收数据
    (4)关闭资源
     
    每个程序都有自己处理的特定数据格式,接收到的数据不符合指定格式,那么就被丢弃
    飞秋格式
    版本号:时间:发送人:IP:发送标识符(32):真正内容
     
    在UDP协议中有个IP地址为广播地址,主机号为255的地址
    给广播IP地址发送消息时,同一网络段的主机都可以接收到消息
     1 // UDP发送端
     2 public static void sendUDPMsg() throws IOException {
     3     // 建立UDP服务
     4     DatagramSocket datagramSendSocket = new DatagramSocket();
     5     // 把数据封装到数据包中
     6     String data = "UDP测试数据";
     7     // 建立数据包
     8     DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090);
     9     // 调用UDP的服务发送数据包
    10     datagramSendSocket.send(datagramPacket);
    11     // 关闭资源
    12     datagramSendSocket.close();
    13 }
     1 public static void reveiveUDPMsg() throws IOException{
     2     // 建立UDP服务,监听端口
     3     DatagramSocket datagramReceiveSocket = new DatagramSocket(9090);
     4     // 建立新的数据包用于存放数据
     5     byte[] buf = new byte[1024];
     6     DatagramPacket datagramReceivePacket = new DatagramPacket(buf, buf.length);
     7     // 调用UDP服务接收数据存放在数据包的buf中
     8     datagramReceiveSocket.receive(datagramReceivePacket);
     9     System.out.println("接收到的数据:"+new String(buf, 0, datagramReceivePacket.getLength()));
    10     // 关闭资源
    11     datagramReceiveSocket.close();
    12 }
     
     1 // 群聊接收端
     2 public class WeChatSender extends Thread{
     3 
     4     @Override
     5     public void run() {
     6         // 不能直接抛出异常,Thread
     7         try {
     8             // 建立UDP服务
     9             DatagramSocket datagramSendSocket = new DatagramSocket();
    10             // 准备数据,封装到数据包中,用BufferedReader封装可以逐行读取
    11             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    12             // 发送数据
    13             String line = null;
    14             DatagramPacket datagramSendPacket = null;
    15             while((line = bufferedReader.readLine())!=null) {
    16                 // 把数据封装到数据包中然后发送
    17                 datagramSendPacket = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.255"), 9090);
    18                 // 发送数据
    19                 datagramSendSocket.send(datagramSendPacket);
    20             }
    21             // 关闭资源
    22             datagramSendSocket.close();
    23         } catch (IOException e) {
    24             // TODO Auto-generated catch block
    25             e.printStackTrace();
    26         }
    27     }
    28 }
     1 // 群聊接收端
     2 public class WeChatReveiver extends Thread{
     3     
     4     @Override
     5     public void run() {
     6         try {
     7             // 建立UDP服务,监听端口
     8             DatagramSocket datagramReveiveSocket = new DatagramSocket(9090);
     9             // 准备空的数据包存储数据
    10             byte[] buf = new byte[1024];
    11             DatagramPacket datagramReveivePacket = new DatagramPacket(buf, buf.length);
    12             // 调用UDP接收数据
    13             boolean flag = true;
    14             while(flag) {
    15                 datagramReveiveSocket.receive(datagramReveivePacket);
    16                 System.out.println(datagramReveivePacket.getAddress().getHostAddress()+":"+new String(buf, 0, datagramReveivePacket.getLength()));
    17             }
    18             // 关闭资源
    19             datagramReveiveSocket.close();  // 要是判断条件直接为true会永远执行不到
    20         } catch (IOException e) {
    21             // TODO Auto-generated catch block
    22             e.printStackTrace();
    23         }
    24     }
    25 }

     三、TCP通讯协议

    1、特点

         1、基于IO流进行数据传输的,面向连接的
         2、数据传输大小无限制
         3、三次握手(A->B(在?),B->A(在),A->B(好的))保证数据完整性,可靠的协议
         4、速度慢
         5、区分客户端和服务端
     

    2、TCP协议下的socket

         Socket:客户端,客户端一启动马上与服务端进行通讯
         SeverSocket:服务端
     

    3、TCP客户端步骤:

    (1)建立TCP客户端服务
    (2)获取socket对应的流对象
    (3)写或读数据
    (4)关闭资源
     

    4、TCP服务端步骤:

    (1)建立TCP服务端的服务
    (2)接收客户端的连接,产生一个socket
    (3)获取对应的流对象,读或写出数据
    (4)关闭资源
     
    用BufferedReader就是想调用readLine()方法一行一行的读取字符,持续输入的时候需要在拼接的字符串后面加上 作为是否为null的判断条件
     
     
     
     
     
     
     
     
    有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
  • 相关阅读:
    单元测试-伪对象、桩对象、模拟对象
    单元测试那些事
    vscode 开发go版本1.14项目
    C#中的 async await
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
  • 原文地址:https://www.cnblogs.com/1989guojie/p/6115930.html
Copyright © 2020-2023  润新知