【问题标题】:Non socket based Java Server [closed]非基于套接字的 Java 服务器 [关闭]
【发布时间】:2014-08-28 07:12:35
【问题描述】:

踢它老派:我正在使用 Java SE 5(或 java v1.5)(请不要告诉我升级,因为我正在处理 [这是私有的] 我需要使用它Java 版本)。

我需要帮助来设置 Web 客户端/服务器应用程序。我在网上寻找的每个变体都缩小到使用 websockets/sockets,但是我使用的 java 版本还没有 sockets。

有没有人有关于设置不使用套接字的客户端/服务器模型应用程序的教程,或者一些可以为我指明正确方向的示例代码?

编辑: 好的,显然我的 java 版本确实有套接字。我会进一步调查。但是,现在我很好奇,如何创建不使用套接字的 java 服务器?

【问题讨论】:

  • 当然 Java 5 有套接字,它们从 JDK 1.0 就已经存在:docs.oracle.com/javase/1.5.0/docs/api/java/net/Socket.html
  • Java v1.5 有套接字...
  • client/server 表示您正在使用connection based 协议,其中TCP 是最常见的。使用 TCP 的方法是使用普通的 Socket 或 NIO SocketChannels,它们在 Java 5.0 之前已经存在多年了。如果你升级到 Java 7,你可以使用 NIO2,但我不会打扰,除非你有 Infiniband(很可能,你没有)

标签: java webserver


【解决方案1】:

你需要插座。 They serve as the end-points to the connection。不过,您可以使用阻塞 SocketServerSocket 实现的替代方案。

NIO(新 IO)使用通道。它允许非阻塞 I/O:

class Server {
     public static void main(String[] args) throws Exception {
          ServerSocketChannel ssc = ServerSocketChannel.open();
          ssc.configureBlocking(false);

          while(true) {
               SocketChannel sc = ssc.accept();

               if(sc != null) {
                    //handle channel
               }
          }
     }
}

使用选择器(可选,但推荐)

您可以使用Selector 在读/写/接受之间切换,以便仅在无事可做时才允许阻塞(以消除过多的 CPU 使用率)

class Server {
     private static Selector selector;
     public static void main(String[] args) throws Exception {
          ServerSocketChannel ssc = ServerSocketChannel.open();
          ssc.configureBlocking(false);
          Selector selector = Selector.open();
          ssc.register(selector, SelectionKey.OP_ACCEPT);

          while(true) {
               selector.select();

               while(selector.iterator().hasNext()) {
                    SelectionKey key = selector.iterator().next();

                    if(key.isAcceptable()) {
                         accept(key);
                    }
               }
          }
     }

     private static void accept(SelectionKey key) throws Exception {
          ServerSocketChannel channel = (ServerSocketChannel) key.channel();
          SocketChannel sc = channel.accept();
          sc.register(selector, OP_READ);
     }
}

SelectionKey 支持isAcceptable() 接受,isReadable() 读取和isWritable() 写入,因此您可以在同一个线程上处理所有 3 个。

这是一个使用 NIO 接受连接的基本示例。我强烈建议多研究一下,以更好地了解事情的运作方式。

【讨论】:

    【解决方案2】:

    这是来自Java 5Socket 类的API 文档。

    套接字是网络通信的基本抽象,你很难找到不支持它们的操作系统,更不用说高级编程语言了。

    【讨论】:

    • +1 如果有任何疑问,Javadoc 说Since: JDK1.0
    • 我对此表示赞同,因为它回答了原始问题,但请查看编辑以了解现在的答案。
    • @RickyMutschlechner 答案是你不能。正如我所说,套接字是已经在操作系统级别处理的网络抽象,避免使用它们的唯一方法是直接对网络接口层进行编程,本质上是为您的网卡编写一个新的设备驱动程序。即使这样,由于 IP 寻址的工作方式,您最终可能会得到一个除了名称之外的所有内容。
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2013-01-16
    相关资源
    最近更新 更多