Java怎么让socket服务一直运行?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java怎么让socket服务一直运行?

2019-04-28 17:38:16 6298 9

本问题来自云栖社区【阿里Java技术进阶2群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。

取消 提交回答
全部回答(9)
  • 1156606323420497
    2020-03-26 23:55:02

    用while()循环不断接受和发送,要用线程啊记得。。。然后添加事件响应 关闭程序就调用socket.close()

    0 0
  • galaxystar
    2020-03-18 17:00:30

    非守护线程

    0 0
  • huc_逆天
    2019-11-12 17:27:21

    基本上来说的,socker连接,服务始终运行,是都通while(true)

    0 0
  • Joyven
    2019-11-12 17:17:06

    不管是BIO还是NIO,其实都是通过轮训的方式来实现socket服务的。下面几个demo或许有助于你:

    • BIO
    public class BIODemo {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress("0.0.0.0", 8888), 50);
            Socket socket;
            while ((socket = serverSocket.accept()) != null) {
                InputStream is = socket.getInputStream();
                byte[] data = new byte[1024];
                is.read(data);
    
                System.out.println(new String(data, UTF_8));
                OutputStream out = socket.getOutputStream();
                out.write(data);
                socket.close();
            }
        }
    }
    
    • NIO
    public class NIODemo {
        public static void main(String[] args) throws IOException {
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.bind(new InetSocketAddress("0.0.0.0", 8888), 50);
            serverSocketChannel.configureBlocking(false);
            Selector selector = Selector.open();
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    
            while (true) {
                selector.select();
                Set<SelectionKey> selectionKeys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = selectionKeys.iterator();
                while (iterator.hasNext()) {
                    SelectionKey key = iterator.next();
                    if (!key.isValid()) {
                        continue;
                    }
    
                    if (key.isAcceptable()) {
                        ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
                        SocketChannel clientChannel = serverChannel.accept();
                        clientChannel.configureBlocking(false);
                        clientChannel.register(selector, SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        ByteBuffer buffer = ByteBuffer.wrap(new byte[1024]);
                        SocketChannel clientChannel = (SocketChannel) key.channel();
                        int read = clientChannel.read(buffer);
    
                        if (read == -1) {
                            key.cancel();
                            clientChannel.close();
                        } else {
                            buffer.flip();
                            clientChannel.write(buffer);
                        }
                    }
                }
                iterator.remove();
            }
        }
    }
    

    如果你需要更详细的更深入的了解,可以参考我的这篇文章 JAVA中BIO、NIO、AIO的分析理解 https://developer.aliyun.com/article/726698?spm=a2c6h.13148508.0.0.1d844f0eaWNdWj

    0 0
  • 有头发的程序猿
    2019-10-30 16:10:24

    不断的轮询请求,通过accept()方法实现。

    0 0
  • 不语奈何
    2019-09-02 18:42:38

    while(true){
    Socket socket=serverSocket.accept();
    new Thread(new MyRuns(socket)).start();
    }

    0 0
  • little.li
    2019-07-17 23:34:31

    心跳

    0 0
  • s1ahs3r
    2019-07-17 23:34:31

    最简单的BIO服务端的话,demo 通常是写成 while(true)的

    0 0
  • aoteman675
    2019-07-17 23:34:31

    可以使用多线程保活线程。

    0 0
滑动查看更多
相关问答

1

回答

java socket connect超时设置无效!:报错

2020-06-20 11:32:13 1017浏览量 回答数 1

0

回答

请问在java中int转String的性能最优的方法是什么?

2021-11-07 00:18:07 115浏览量 回答数 0

1

回答

在java中int转String的性能最优的方法是什么?

2021-11-06 20:32:59 171浏览量 回答数 1

1

回答

java 应用程序执行右连接关联表right join查询时性能非常慢,该如何优化呢?

2021-11-06 10:03:08 139浏览量 回答数 1

1

回答

在java应用程序中查询计算数据库表平均值avg时性能非常低,该如何优化呢?

2021-11-06 10:02:55 169浏览量 回答数 1

1

回答

系统磁盘I/O的性能指标是否会影响到java应用系统的性能?

2021-11-06 10:01:55 113浏览量 回答数 1

1

回答

java 应用程序执行内连接关联表inner join查询时性能非常慢,该如何优化呢?

2021-11-06 10:01:45 221浏览量 回答数 1

1

回答

系统CPU的性能指标是否会影响到java应用系统的性能?

2021-11-06 10:01:35 150浏览量 回答数 1

1

回答

在java应用程序中查询计算数据库表最大值max时性能非常慢,该如何优化呢?

2021-11-06 10:00:26 166浏览量 回答数 1

1

回答

java循环时使用String连接符与重用StringBuilder在性能上有什么不同,该如何优化?

2021-11-06 10:00:15 143浏览量 回答数 1
+关注
李博 bluemind
云栖社区Java、Redis、MongoDB运营小编,有意合作请联系钉钉:15810436147
2107
文章
1103
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载