• java tcp ip网络编程(二) 套接字的基本使用


    ##基本套接字的使用


    linux系统把网络io抽象成socket,对网络的编程就是对socket的编程。


    java把套接字抽象成类似的类

    InetAddress SocketAddress 识别java应用程序如何识别网络主机
    客户端Socket类 ServerSocket类
    UDP类 DatagramSocket

    获取用户的网卡和对应的ip信息

    通过host获取对应的网络地址
    ```
    Enumeration<NetworkInterface> networkInterfaceEnumeration =
    NetworkInterface.getNetworkInterfaces();

    if(networkInterfaceEnumeration == null){
    System.out.println("no interfacle");
    }else{
    while (networkInterfaceEnumeration.hasMoreElements()){
    NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
    Enumeration<InetAddress> address = networkInterface.getInetAddresses();
    if(!address.hasMoreElements()){
    System.out.println("it is not address");
    }
    System.out.println("networkInterface:"+networkInterface.getName());
    while (address.hasMoreElements()){
    InetAddress address1 = address.nextElement();
    System.out.println(
    address1 instanceof Inet4Address ?"ipv4":"ipv6"
    );
    System.out.println(address1.getHostAddress());
    }
    System.out.println("####");
    }

    }

    System.out.println("host xxx"+args.length);
    String[] arr = new String[1];
    arr[0] = "weibo.cn";
    for (String host : arr){
    System.out.println(host+":");
    InetAddress[] inetAddresses = InetAddress.getAllByName(host);

    for(InetAddress inet: inetAddresses){
    System.out.println(inet.getHostName()+":"+inet.getHostAddress());
    System.out.println("toString:"+inet.toString());
    System.out.println("caninical:"+inet.getCanonicalHostName());
    }
    }
    ```

    java提供了TCP套接字

    Socket,ServerSocket

    客户端

    ```
    if(args.length != 3){
    throw new Exception("arg lengh is not right!");
    }

    String host = args[0];
    byte[] data = args[1].getBytes();
    int port = Integer.parseInt(args[2]);

    Socket socket = new Socket(host, port);
    InputStream inputStream = socket.getInputStream();
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write(data);
    System.out.println("write data"+data);
    int totalRecived = 0;
    int recived;
    while (totalRecived < data.length){

    if((recived = inputStream.read(data,
    totalRecived, data.length-totalRecived)) == -1){
    throw new IllegalStateException("IllegalStateException");
    }
    System.out.println("totalRecived:"+totalRecived);
    totalRecived += recived;
    }

    System.out.println("received:"+ new String(data));
    socket.close();
    ```

    服务端
    ```
    if(args.length != 1){
    throw new Exception("arg lengh is not right!");
    }

    ServerSocket serverSocket = new ServerSocket(
    Integer.parseInt(args[0]));

    int temp = 0;
    byte[] data = new byte[buffer];
    while (true){

    Socket socket = serverSocket.accept();
    SocketAddress socketAddress = socket.getRemoteSocketAddress();
    System.out.println("client address"+socketAddress.toString());
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
    while ((temp = in.read(data)) != -1){
    out.write(data,0, temp);
    }
    socket.close();
    }

    ```

    udp协议的主要功能

    1 在ip地址上增加了端口
    2 对传输过程中可能产生的数据错误进行了检测,并抛弃了已经损坏的数据

    udp的特定

    1 设置消息边界
    2 应用程序必须处理丢失和重排功能

    java提供的UDP套接字

    DatagramSocket
    DatagramPacket

    服务端
    ```
    DatagramSocket datagramSocket = new DatagramSocket(port);

    DatagramPacket packet = new DatagramPacket(new byte[MAX_LENGTH],
    MAX_LENGTH);

    while (true){
    datagramSocket.receive(packet);
    System.out.println("client "+packet.getAddress().getHostAddress()+" "+
    packet.getPort());
    datagramSocket.send(packet);
    packet.setLength(MAX_LENGTH);
    }
    ```

    客户端
    ```
    InetAddress address = InetAddress.getByName(args[0]);
    byte[]data = args[1].getBytes();
    int port = Integer.parseInt(args[2]);
    DatagramPacket sendPacket = new DatagramPacket(
    data,data.length,address,port
    );

    DatagramSocket datagramSocket = new DatagramSocket();
    datagramSocket.setSoTimeout(timeout);

    DatagramPacket receive = new DatagramPacket(
    new byte[data.length],data.length
    );

    boolean receivedResponse = false;
    int tries = 0;
    do{
    datagramSocket.send(sendPacket);
    try{
    datagramSocket.receive(receive);
    if(!receive.getAddress().equals(address)){
    System.out.println("receive unknow host");
    }
    receivedResponse = true;
    }catch (InterruptedIOException e){
    tries++;
    System.out.println("retry times :"+tries);
    }

    }while (tries < times && !receivedResponse);

    if(receivedResponse){
    System.out.println("Received:" + new String(receive.getData()));
    }

    datagramSocket.close();
    ```

  • 相关阅读:
    pika的阻塞式使用
    使用 Nuget安装DLL
    StackExchange.Redis的使用
    MongoDB 学习笔记(9)--- Limit与Skip方法
    MongoDB 学习笔记(8)---$type 操作符
    MongoDB学习笔记(7)--- 条件操作符
    MongoDB学习笔记(6)--find
    阿里巴巴Java开发规范手册
    python获取当前文件路径
    断网环境下利用pip安装Python离线安装包
  • 原文地址:https://www.cnblogs.com/beckbi/p/10327775.html
Copyright © 2020-2023  润新知