Java网络编程基础用法详解

目录
  • Socket 编程
  • ServerSocket 类的方法
  • Socket 类的方法
  • InetAddress 类的方法
  • Socket 通讯实例

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:TCP(英语:Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,TCP 层是位于 IP 层之上,应用层之下的中间层。TCP 保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
  • UDP:UDP (英语:User Datagram Protocol,用户数据报协议),位于 OSI 模型的传输层。一个无连接的协议。提供了应用程序之间要发送数据的数据报。由于UDP缺乏可靠性且属于无连接协议,所以应用程序通常必须容许一些丢失、错误或重复的数据包。

Socket 编程

套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

  • 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
  • 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送。

ServerSocket 类的方法

服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。ServerSocket 类有四个构造方法

序号 方法描述
1 public ServerSocket(int port) throws IOException,创建绑定到特定端口的服务器套接字
2 public ServerSocket(int port, int backlog) throws IOException,利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号
3 public ServerSocket(int port, int backlog, InetAddress address) throws IOException,使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器
4 public ServerSocket() throws IOException,创建非绑定服务器套接字

创建非绑定服务器套接字。 如果 ServerSocket 构造方法没有抛出异常,就意味着你的应用程序已经成功绑定到指定的端口,并且侦听客户端请求。

ServerSocket 类的常用方法

序号 方法描述
1 public int getLocalPort(),返回此套接字在其上侦听的端口
2 public Socket accept() throws IOException,侦听并接受到此套接字的连接,该方法将阻塞,直到建立连接为止
3 public void setSoTimeout(int timeout),通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位
4 public void bind(SocketAddress host, int backlog),将 ServerSocket 绑定到特定地址(IP 地址和端口号)

Socket 类的方法

java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个 Socket 对象通过实例化 ,而服务器获得一个 Socket 对象则通过 accept() 方法的返回值。Socket 类有五个构造方法:

序号 方法描述
1 public Socket(String host, int port) throws UnknownHostException, IOException,创建一个流套接字并将其连接到指定主机上的指定端口号
2 public Socket(InetAddress host, int port) throws IOException,创建一个流套接字并将其连接到指定 IP 地址的指定端口号
3 public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException,创建一个套接字并将其连接到指定远程主机上的指定远程端口
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException,创建一个套接字并将其连接到指定远程地址上的指定远程端口
5 public Socket(),通过系统默认类型的 SocketImpl 创建未连接套接字

当 Socket 构造方法返回,它实际上会尝试连接到指定的服务器和端口,而并不是简单的实例化了一个 Socket 对象。

下面列出了一些感兴趣的方法,注意客户端和服务器端都有一个 Socket 对象,所以无论客户端还是服务端都能够调用这些方法:

序号 方法描述
1 public void connect(SocketAddress host, int timeout) throws IOException,将此套接字连接到服务器,并指定一个超时值
2 public InetAddress getInetAddress(),返回套接字连接的地址
3 public int getPort(),返回此套接字连接到的远程端口
4 public int getLocalPort(),返回此套接字绑定到的本地端口
5 public SocketAddress getRemoteSocketAddress(),返回此套接字连接的端点的地址,如果未连接则返回 null
6 public InputStream getInputStream() throws IOException,返回此套接字的输入流
7 public OutputStream getOutputStream() throws IOException,返回此套接字的输出流
8 public void close() throws IOException,关闭此套接字

InetAddress 类的方法

这个类表示互联网协议(IP)地址。下面列出了 Socket 编程时比较有用的方法:

序号 方法描述
1 static InetAddress getByAddress(byte[] addr),在给定原始 IP 地址的情况下,返回 InetAddress 对象
2 static InetAddress getByAddress(String host, byte[] addr),根据提供的主机名和 IP 地址创建 InetAddress
3 static InetAddress getByName(String host),在给定主机名的情况下确定主机的 IP 地址
4 String getHostAddress() ,返回 IP 地址字符串(以文本表现形式)
5 String getHostName() ,获取此 IP 地址的主机名
6 static InetAddress getLocalHost(),返回本地主机
7 String toString(),将此 IP 地址转换为 String

Socket 通讯实例

客户端实例:GreetingClient 是一个客户端程序,该程序通过 socket 连接到服务器并发送一个请求,然后等待一个响应。

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;

public class GreetingClient {
    public static void main(String [] args)
    {
        //服务端主机名
        String serverName = "localhost";
        //服务端口号
        int port = Integer.parseInt("6066");
        try {
            // 输出服务端主机名与端口号
            System.out.println("连接到主机:" + serverName + " ,端口号:" + port);
            // 创建 Socket 对象,并尝试连接到指定的服务器和端口
            Socket client = new Socket(serverName, port);
            // 输出此套接字连接的端点的地址
            System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
            // 获取此套接字的输出流
            OutputStream outToServer = client.getOutputStream();
            // 使用此套接字的输出流创建 DataOutputStream 输出流
            DataOutputStream out = new DataOutputStream(outToServer);
            // 以UTF-8编码将字符串写入基础输出流
            out.writeUTF("客户端说:Hello from " + client.getLocalSocketAddress() + "\n");
            // 获取此套接字的输入流
            InputStream inFromServer = client.getInputStream();
            // 创建读取键盘输入内容的 InputStreamReader
            InputStreamReader fingerboardReader = new InputStreamReader(System.in,"UTF-8");
            // 创建读取服务端输入内容的 InputStreamReader
            InputStreamReader serverDataReader = new InputStreamReader(inFromServer,"UTF-8");
            // 创建存放在键盘读取字符的数组集合
            ArrayList<Character> fingerboardList = new ArrayList<Character>();
            // 创建存放在服务端端读取字符的数组集合
            ArrayList<Character> serverDataList = new ArrayList<Character>();
            do{
                // 判断读取键盘输入内容的 InputStreamReader 是否可以读取
                if(fingerboardReader.ready()){
                    // 读取键盘输入内容的 InputStreamReader 可以读取
                    // 清空 存放键盘读取字符的数组集合
                    fingerboardList.clear();
                    // 声明 键盘输入char变量
                    char fingerboardInputChar;
                    // 读取键盘输入内容的 InputStreamReader 可以读取,循环读取,将读取的内容存入数组集合,一次输入读取完成后ready()返回NO
                    while (fingerboardReader.ready()) {
                        fingerboardInputChar = (char)fingerboardReader.read();;
                        fingerboardList.add(fingerboardInputChar);
                    }
                    // 创建可变字符串 StringBuilder 对象
                    StringBuilder fingerboardStringBuilder = new StringBuilder();
                    // 拼接 存放键盘读取字符的数组集合 中的字符组成字符串
                    for (Character cha :fingerboardList){
                        fingerboardStringBuilder.append(cha);
                    }
                    // 将可变字符串 StringBuilder 对象 转为字符串 String 对象
                    String fingerboardString = fingerboardStringBuilder.toString();
                    // 如果 转换的字符串不是空的 并且不是一个换行符
                    if(!fingerboardString.isEmpty() && !fingerboardString.equals("\n")) {
                        // 使用此套接字的输出流写出数据
                        out.writeUTF("客户端说:" + fingerboardString);
                        // 如果输出Goodbye!,跳出循环
                        if (fingerboardString.equals("Goodbye!\n")) {
                            break;
                        }
                    }
                }
                // 判断读取客户端输入内容的 InputStreamReader 是否可以读取
                if(serverDataReader.ready()) {
                    // 读取客户端输入内容的 InputStreamReader 可以读取
                    // 清空客户端读取字符的数组集合
                    serverDataList.clear();
                    // 声明客户端读取char变量
                    char serverDataReaderChar;
                    // 读取客户端输入内容的 InputStreamReader 可以读取,循环读取,将读取的内容存入数组集合,一次输入读取完成后ready()返回NO
                    while (serverDataReader.ready()) {
                        serverDataReaderChar = (char) serverDataReader.read();
                        serverDataList.add(serverDataReaderChar);
                    }
                    // 创建可变字符串 StringBuilder 对象
                    StringBuilder dataReaderStringBuilder = new StringBuilder();
                    for (Character cha :serverDataList){
                        dataReaderStringBuilder.append(cha);
                    }
                    // 将可变字符串 StringBuilder 对象 转为字符串 String 对象
                    String dataReaderString = dataReaderStringBuilder.toString();
                    // 打印服务端输入内容
                    System.out.print(dataReaderString);
                    // 服务端输出Goodbye,跳出循环
                    if (dataReaderString.endsWith("Goodbye!\n")) {
                        break;
                    }
                }
            }while (true);
            // 关闭此套接字
            client.close();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

服务端实例:GreetingServer 程序是一个服务器端应用程序,使用 Socket 来监听一个指定的端口。

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;

public class GreetingServer extends Thread {
    private ServerSocket serverSocket;

    public GreetingServer(int port) throws IOException
    {
        // 创建服务端Socket对象
        this.serverSocket = new ServerSocket(port);
        // Socket超时时间,设置为0时无限制,超时引发SocketTimeoutException
        this.serverSocket.setSoTimeout(0);
    }

    public void run() {
        try {
            // 输出此套接字在其上侦听的端口
            System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            // 侦听并接受到此套接字的连接,该方法将阻塞,直到建立连接为止
            Socket server = serverSocket.accept();
            // 输出此套接字连接的端点的地址
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            // 使用此套接字的输出流创建 DataOutputStream 输出流
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            // 以UTF-8编码将字符串写入基础输出流
            out.writeUTF("服务端说:谢谢连接我:" + server.getLocalSocketAddress() + "\n");
            // 创建读取键盘输入内容的 InputStreamReader
            InputStreamReader fingerboardReader = new InputStreamReader(System.in,"UTF-8");
            // 创建读取客户端输入内容的 InputStreamReader
            InputStreamReader clientDataReader = new InputStreamReader(server.getInputStream(),"UTF-8");
            // 创建存放在键盘读取字符的数组集合
            ArrayList<Character> fingerboardList = new ArrayList<Character>();
            // 创建存放在客户端读取字符的数组集合
            ArrayList<Character> clientDataList = new ArrayList<Character>();
            do{
                // 判断读取键盘输入内容的 InputStreamReader 是否可以读取
                if(fingerboardReader.ready()){
                    // 读取键盘输入内容的 InputStreamReader 可以读取
                    // 清空 存放键盘读取字符的数组集合
                    fingerboardList.clear();
                    // 声明 键盘输入char变量
                    char fingerboardInputChar;
                    // 读取键盘输入内容的 InputStreamReader 可以读取,循环读取,将读取的内容存入数组集合,一次输入读取完成后ready()返回NO
                    while (fingerboardReader.ready()) {
                        fingerboardInputChar = (char)fingerboardReader.read();;
                        fingerboardList.add(fingerboardInputChar);
                    }
                    // 创建可变字符串 StringBuilder 对象
                    StringBuilder fingerboardStringBuilder = new StringBuilder();
                    // 拼接 存放键盘读取字符的数组集合 中的字符组成字符串
                    for (Character cha :fingerboardList){
                        fingerboardStringBuilder.append(cha);
                    }
                    // 将可变字符串 StringBuilder 对象 转为字符串 String 对象
                    String fingerboardString = fingerboardStringBuilder.toString();
                    // 如果 转换的字符串不是空的 并且不是一个换行符
                    if(!fingerboardString.isEmpty() && !fingerboardString.equals("\n")) {
                        // 使用此套接字的输出流写出数据
                        out.writeUTF("服务端说:" + fingerboardString);
                        // 如果输出Goodbye!,跳出循环
                        if (fingerboardString.equals("Goodbye!\n")) {
                            break;
                        }
                    }
                }
                // 判断读取客户端输入内容的 InputStreamReader 是否可以读取
                if(clientDataReader.ready()) {
                    // 读取客户端输入内容的 InputStreamReader 可以读取
                    // 清空客户端读取字符的数组集合
                    clientDataList.clear();
                    // 声明客户端读取char变量
                    char clientDataReaderChar;
                    // 读取客户端输入内容的 InputStreamReader 可以读取,循环读取,将读取的内容存入数组集合,一次输入读取完成后ready()返回NO
                    while (clientDataReader.ready()) {
                        clientDataReaderChar = (char) clientDataReader.read();
                        clientDataList.add(clientDataReaderChar);
                    }
                    // 创建可变字符串 StringBuilder 对象
                    StringBuilder dataReaderStringBuilder = new StringBuilder();
                    for (Character cha :clientDataList){
                        dataReaderStringBuilder.append(cha);
                    }
                    // 将可变字符串 StringBuilder 对象 转为字符串 String 对象
                    String dataReaderString = dataReaderStringBuilder.toString();
                    // 打印客户端输入内容
                    System.out.print(dataReaderString);
                    // 客户端输出Goodbye,跳出循环
                    if (dataReaderString.endsWith("Goodbye!\n")) {
                        break;
                    }
                }
            }while (true);
            // 关闭此套接字
            server.close();
            System.out.println("套接字已关闭");
        }catch(SocketTimeoutException s) {
            // Socket超时
            System.out.println("Socket timed out!");
        }catch(IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String [] args) {
        int port = Integer.parseInt("6066");
        try {
            Thread t = new GreetingServer(port);
            t.run();
        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}

先运行服务端程序,再运行客户端程序,打印如下:

方法实例:

获取指定主机的IP地址

使用 InetAddress 类的 InetAddress.getByName() 方法来获取指定主机(网址)的IP地址:

public class Test {
    public static void main(String[] args) {
        InetAddress address = null;
        try {
            // 在给定主机名称的情况下,确定主机的IP地址
            address = InetAddress.getByName("www.juejin.cn");
        }
        catch (UnknownHostException e) {
            System.exit(2);
        }
        // 输出取此IP地址的主机名与IP地址字符串
        System.out.println(address.getHostName() + " = " + address.getHostAddress());
        System.exit(0);
    }
}

// 以上程序执行结果为:
// www.juejin.cn = 111.132.34.239

查看端口是否已使用

public class Test {
    public static void main(String[] args) {
        System.out.println("端口是否真正在使用:" + isSocketAliveUitlitybyCrunchify("www.juejin.cn",80));
    }

    /**
     * 判断主机端口是否已使用
     *
     * @param hostName 主机名
     * @param port 主机端口
     * @return boolean - true/false
     */
    public static boolean isSocketAliveUitlitybyCrunchify(String hostName, int port) {
        // 主机端口是否已使用,默认否
        boolean isAlive = false;
        // 超时设置,单位毫秒
        int timeout = 2000;

        // 创建一个套接字
        SocketAddress socketAddress = new InetSocketAddress(hostName, port);
        Socket socket = new Socket();
        System.out.println("主机名: " + hostName + ", 主机端口: " + port);

        try {
            // 将此套接字连接到服务器
            socket.connect(socketAddress, timeout);
            // 关闭此套接字
            socket.close();
            // 连接未发生异常,说明主机端口是使用的
            isAlive = true;

        } catch (SocketTimeoutException exception) {
            System.out.println("套接字超时异常 " + hostName + ":" + port + ". " + exception.getMessage());
        } catch (IOException exception) {
            System.out.println(
                    "IO异常 - 无法连接到 " + hostName + ":" + port + ". " + exception.getMessage());
        }
        // 返回主机端口是否已使用的结果
        return isAlive;
    }
}

// 以上程序执行结果为:
// 主机名: www.juejin.cn, 主机端口: 80
// 端口是否真正在使用:true

获取本机ip地址及主机名

public class Test {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress addr = InetAddress.getLocalHost();
        System.out.println("本地主机地址: " + addr.getHostAddress());
                String hostname = addr.getHostName();
        System.out.println("本地主机名: "+hostname);
    }
}

使用 Socket 连接到指定主机

public class Test {
    public static void main(String[] args) {
        try {
            InetAddress addr;
            Socket sock = new Socket("www.juejin.cn", 80);
            addr = sock.getInetAddress();
            System.out.println("连接到 " + addr);
            sock.close();
        } catch (java.io.IOException e) {
            System.out.println("无法连接 " + args[0]);
            System.out.println(e);
        }
    }
}

// 以上程序执行结果为:
// 连接到 www.juejin.cn/111.132.34.240

以上就是Java网络编程基础用法详解的详细内容,更多关于Java 网络编程的资料请关注我们其它相关文章!

(0)

相关推荐

  • 老生常谈Java 网络编程 —— Socket 详解

    目录 1|0构造socket 1. 设定等待建立连接的超时时间 2. 设定服务器的地址 3. 设定客户端的地址 4. 客户连接服务器时可能抛出的异常 5. 使用代理服务器 6. InetAddress 地址类的用法 7. NetworkInterface 类的用法 2|0获取 Socket 的信息 3|0关闭 Socket 4|0半关闭 Socket 5|0设置 Socket 的选项 1. TCP_NODELAY 2. SO_RESUSEADDR 3. SO_TIMEOUT 4. SO_LING

  • Java 网络编程总结

    目录 1.IP地址 2.端口 3.通信协议 3.1 TCP/IP协议簇:实际上是一组协议 3.2 TCP UDP对比 3.3 TCP实现聊天 3.4 TCP文件上传 3.5 UDP消息发送 3.6 UDP聊天实现 1.IP地址 IP地址IntAddress: 唯一定位一台网络上的计算机 127.0.0.1:本地localhost IP地址的分类 ipV4/ipV6 ipV4:127.0.0.1,4个字节组成:0~255,42亿~:30亿都在北美,亚洲4亿:2011年就用完了 ipV6:128位.

  • Java网络编程UDP协议发送接收数据

    本文实例为大家分享了Java网络编程UDP协议发送接收数据的具体代码,供大家参考,具体内容如下 UDP协议发送数据步骤 A:创建发送端socket对象: B:创建数据,并把数据打包: C:调用socket对象的发送方法发送数据包: D:释放资源 package net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAd

  • java编程实现简单的网络爬虫示例过程

    本项目中需要用到两个第三方jar包,分别为 jsoup 和 commons-io. jsoup的作用是为了解析网页, commons-io 是为了把数据保存到本地. 1.爬取贴吧 第一步,打开eclipse,新建一个java项目,名字就叫做 pachong: 然后,新建一个类,作为我们程序的入口. 这个作为入口类,里面就写一个main方法即可. public class StartUp { public static void main(String[] args) { } } 第二步,导入我们

  • Java网络编程基础详解

    目录 网络编程 1.1 概述 1.2.网络通信的要素 1.网络编程中有两个主要的问题 2.网络编程中的三要素 1.3.IP 1.4.端口 1.5.通信协议 UDP协议 TCP协议 1.6.TCP模拟通信 客户端 服务器 文件上传 1.7.UDP 1.8.URL 实例: 总结 网络编程 1.1 概述 1.2.网络通信的要素 如何实现网络通信? 1.网络编程中有两个主要的问题 如何定位到网络上的一台或者多台主机 使用cmd-->ping命令,ping一个域名,可以看到访问的主机的IP地址 [外链图片

  • Java BigDecimal基础用法详解

    目录 一.BigDecimal概述 二.BigDecimal常用构造函数 2.1.常用构造函数 2.2.使用问题分析 三.BigDecimal常用方法详解 3.1.常用方法 3.2.BigDecimal大小比较 四.BigDecimal格式化 五.BigDecimal常见异常 5.1.除法的时候出现异常 六.BigDecimal总结 6.1.总结 6.2.工具类推荐 一.BigDecimal概述 一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Do

  • java 中的instanceof用法详解及instanceof是什么意思(推荐)

    好,应大家的要求先给大家说下在JAVA程序中instanceof是什么意思 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据. instanceof运算符用法 运算符是双目运算符,左面的操作元是一个对象实例,右面是一个类.当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false 说明: (1).一个类的实例包括本

  • Java数据结构顺序表用法详解

    目录 1.什么是顺序表 2.顺序表的基本功能和结构 3.顺序表基本功能的实现和解析 1.判断线性表是否为空 2.获取指定位置的元素 3.向线性表表添加元素 4.在位置i处插入元素 5.删除指定位置的元素,并返回该元素 6.查找t第一次出现的位置 7.手动扩容方法 1.什么是顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等.一组数据中包含的元素个数可能发生变化(可以增加或删除元素). 对于这种需求,最简单的解决方

  • Java super关键字的用法详解

    目录 super关键字的三种用法: 1. super.成员变量 2. super.成员方法 3. super():调用父类中的构造方法 3.1.1 隐式调用父类无参数构造方法super() 3.1.2 显式调用父类有参数构造方法super(id) super关键字作用:在子类内部调用父类对象 基础语法: 1.在类的继承中,当子类继承了父类, 在构造子类的时候,一定要先帮助父类进行构造: 2. 调用super()必须写在子类构造方法的第一行,以保证在执行任何动作前,对象已经完成了初始化,否则编译不

  • Java中的MapStruct用法详解

    目录 1 MapStruct配置 2 原理&性能 2.1 实现原理 3 使用方法 3.1 转换器的检索 3.1.1 使用Mappers工厂获取 3.1.2 通过依赖注入的方式获取 3.2 简单映射 3.2.1 基本映射 3.2.2 多源参数映射 3.2.3 更新对象 3.3 数据类型转换 3.3.1 对于基础数据类型会进行自动隐式的转换 3.3.2 指定转换格式 3.3.3 属性为复杂对象的映射 3.3.4 自定义转换器 3.3.5 使用限定符限定使用转换方法 3.4 Map的映射 3.5 枚举

  • Java线程池Executor用法详解

    目录 线程池类图 线程池的好处 new Thread的弊端 线程池核心类-ThreadPoolExecutor 使用Executors创建线程池 Executors.newCachedThreadPool Executors.newSingleThreadExecutor Executors.newFixedThreadPool Executors.newScheduledThreadPool 总结 如何定义线程池参数 线程池类图 我们最常使用的Executors实现创建线程池使用线程主要是用上

  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解 前言: ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler. 通过继承ChannelHandlerAdapter来代替 因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替. context对象 一个ChannelHandler和一个ChannelHandlerContext对象一起被提供.一个

  • Java中isAssignableFrom的用法详解

    class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口.如果是则返回 true:否则返回 false.如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true:否则返回 false. 1. class2是不是class1的子类或者子接口 2. Object是所有类的父类 一个例子搞定: package com.auuz

  • java网络编程基础知识介绍

    网络基础知识 1.OSI分层模型和TCP/IP分层模型的对应关系 这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍. 2.七层模型与协议的对应关系 网络层 ------------ IP(网络之间的互联协议) 传输层 ------------ TCP(传输控制协议).UDP(用户数据报协议) 应用层 ------------ Telnet(Internet远程登录服务的标准协议和主要方式).FTP(文本传输协议).HTTP(超文本传送协议) 3.IP地址和端口号 1.ip地址用于

  • Java并发编程-volatile可见性详解

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么用? volatile主要对所修饰的变量提供两个功能 可见性 防止指令重排序 <br>本篇博客主要对volatile可见性进行探讨,以后发表关于指令重排序的博文. 什么是可见性? 把JAVA内存模型(JMM)展示得很详细了,简单概括一下 1.每个Thread有一个属于自己的工作内存(可以理解为每个

随机推荐