第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

java16 Unix Domain socket他來(lái)了

標(biāo)簽:
Java

Unix Domain socket

A UNIX socket is an inter-process communication mechanism that allows bidirectional data exchange between processes running on the same machine.

他在socket的框架上发展出一种IPC(inter-process communication)机制。对于本地的进程间通信,Unix Domain socket 比TCP / IP环回连接更安全,更有效。

Unix Domain socket的场景

本机进程通信一直是一个大的需求。例如交互式的命令里,只是想获取一些数据,很多时候没必要开启额外的端口。开启端口就会有开多少的问题,机器上的随机端口很可能占用了你设置的值。进程启动先查哪些端口有没有被占用,查完之后再命令行等形式启动起来。最后client还得记住对应的端口。jdk本身实现命令的时候就没有这么麻烦,例如jstack等,用的都是 Domain socket。他们约定了一个固定的文件位置 /tmp/.java_pid${ns_pid}。java在jdk16之前没有Unix Domain socket,如果想用的话,得自己写jni。

目前这个功能已经完成,支持的平台如下。

Unix-domain sockets have long been a feature of most Unix platforms, and are now supported in Windows 10 and Windows Server 2019.

我们的理解就是对windows有一定的要求。

code

我们编写代码和以前区别不大。主要是围绕SocketChannel 和 ServerSocketChannel。在原来绑定ip和地址的地方换成UnixDomainSocketAddress。Channel open的时候选择好域,这个域还是枚举,StandardProtocolFamily。
我们看看ServerSocketChannel的code

        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX);
        UnixDomainSocketAddress of = UnixDomainSocketAddress.of("./test.sock");
        serverSocketChannel.bind(of);
        while (true) {
            SocketChannel socketChannel = serverSocketChannel.accept();
            ByteBuffer buf = ByteBuffer.allocate(48);
            int bytesRead = socketChannel.read(buf);
            while (bytesRead > 0) {
                buf.flip();
                while (buf.hasRemaining()) {
                    System.out.print((char) buf.get());
                }
                System.out.println();
                buf.clear();
                bytesRead = socketChannel.read(buf);
            }
        }

读取的代码和以前是一样的。SocketChannel的部分也一样。

        SocketChannel socketChannel = SocketChannel.open(StandardProtocolFamily.UNIX);
        UnixDomainSocketAddress of = UnixDomainSocketAddress.of("./test.sock");
        boolean connect = socketChannel.connect(of);
        String newData = "this is domain socket..." + System.currentTimeMillis();
        ByteBuffer buf = ByteBuffer.allocate(48);
        buf.clear();
        buf.put(newData.getBytes());

        buf.flip();

        while (buf.hasRemaining()) {
            socketChannel.write(buf);
        }
        socketChannel.close();

jdk选择jdk16,否则编译不过去。下载地址[jdk16 ea]jdk.java.net/16/
我选择绑定文件为当前目录下的test.sock。为什么会绑定文件,可以了解一下socket的发展。

srwxr-xr-x  1 xie  staff     0B 12 27 12:19 test.sock

我们可以看到运行完程序之后产生了一个test.sock,他是s开头的表示他是一个socket文件。建议这个目录写到/tmp下去,后面可以依靠系统清理,否则就要自己去清理这个文件了。

demo代码的位置[domain socket demo]github.com/xpbob/java/tree/main/domainsocket

总结

Unix Domain socket给java同机进程通信带来了很大的方便。例如开发一些特殊的功能,完全可以做成本机通信,需要有权限的人员ssh到具体机器操作。开发起来也很方便,只不过socket文件需要自己去做管理。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
1.6萬(wàn)
獲贊與收藏
380

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消