【问题标题】:reading data from socket - no performance从套接字读取数据 - 没有性能
【发布时间】:2013-08-17 15:31:19
【问题描述】:

我正在创建一个始终运行并监听来自套接字的消息的 android 服务。但它不能以良好的性能工作,我正在寻找一些 nio 替代品或教程。

一直监听套接字的最佳方式是什么?

AndroidAsync 是否支持标准套接字? https://github.com/koush/AndroidAsync

有人用过 Apache Mina 吗?我对米娜有性格问题。 http://mina.apache.org/

或者我怎样才能使用标准套接字以良好的性能完成这项工作

等待您的体验。

谢谢

【问题讨论】:

    标签: java android sockets mina androidasync-koush


    【解决方案1】:

    从套接字(int read()write(int))获得良好性能的正常方法是使用缓冲流/读取器/写入器。这减少了系统调用的数量,并使一次字节或字符的 I/O 更快。

    我不认为使用 NIO 会产生重大影响。如果问题不是缓冲,那么(IMO)可能是网络带宽和/或延迟问题。如果是这样的话,你可以在 Java 中做的事情很少会产生很大的不同。

    【讨论】:

      【解决方案2】:

      我有一些用java.nio写字符串的便捷方法:

      private static Charset charset;
      static
      {
          charset = Charset.forName("UTF-8");
      }
      
      public static void writeString(SocketChannel sc, String string) throws IOException {
          CharBuffer c = CharBuffer.wrap(string);
          ByteBuffer b = charset.encode(c);
          b.compact();
          b.flip();
          sc.write(b);
      }
      
      public static String readString(SocketChannel sc) throws IOException {
          ByteBuffer bbuf = ByteBuffer.allocate(8096);
          sc.read(bbuf);
          bbuf.flip();
          CharBuffer cbuf = charset.decode(bbuf);
          return cbuf.toString();
      }
      

      您需要做的就是建立您的SocketChannel 连接,然后您就可以随心所欲地使用这些。 java.nio 习惯了就真的没那么难了:)

      【讨论】:

      • 为什么你的缓冲区大小是 8096?你为什么忽略流结束?
      • 我只是在其中插入了一个任意数字,它可以满足我的目的。请解释一下流的结束?
      猜你喜欢
      • 2013-07-10
      • 2012-09-18
      • 2021-01-23
      • 2014-06-07
      • 2018-01-07
      • 2012-07-16
      • 2017-06-17
      • 2012-06-17
      相关资源
      最近更新 更多