开发者社区> 问答> 正文

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

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

展开
收起
李博 bluemind 2019-04-28 17:38:16 7953 0
9 条回答
写回答
取消 提交回答
  • 用while()循环不断接受和发送,要用线程啊记得。。。然后添加事件响应 关闭程序就调用socket.close()

    2020-03-26 23:55:02
    赞同 展开评论 打赏
  • 非守护线程

    2020-03-18 17:00:30
    赞同 展开评论 打赏
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

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

    2019-11-12 17:27:21
    赞同 展开评论 打赏
  • 个人博客:https://www.zhoujunwen.com

    不管是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

    2019-11-12 17:17:06
    赞同 展开评论 打赏
  • 为之则易,不为则难

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

    2019-10-30 16:10:24
    赞同 展开评论 打赏
  • 精于基础,广于工具,熟于业务。

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

    2019-09-02 18:42:38
    赞同 展开评论 打赏
  • 心跳

    2019-07-17 23:34:31
    赞同 展开评论 打赏
  • 最简单的BIO服务端的话,demo 通常是写成 while(true)的

    2019-07-17 23:34:31
    赞同 展开评论 打赏
  • 擅长互联网移动开发。。。

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

    2019-07-17 23:34:31
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载