mercredi 22 avril 2015

TCP Connection zu langsam

Guten Tag,
ich wollte einmal Anfragen, ob jemand eine Lösung für mein Problem hätte.
Ich arbeite zur Zeit an einem kleinen Netzwerkcode, jedoch habe ich bemerkt, dass für meine Verwendungszwecke eine größere Lese-/Schreibgeschwindigkeit benötigt wird. Ich habe einige Lektüre zu NIO-Channeln, Selector und Buffern durchgearbeitet, jedoch selbst mit Verbesserung kam keine deutliche Leistungssteigerung zusammen.

Der jetzige Code schafft hochgerechnet ca. 1KB/s ( Ziel wären 5-6 MB/s ).
IDE: Eclipse Luna x64
CPU: Intel Core i7 3770K
RAM: 4x 4GB Kingston Hyperserie
Netzwerktreiber: Atheros Qualcomm Killer Network Manager ( müsste so stimmen )

Server:
Java Code:

  1. import java.io.IOException;import java.net.InetSocketAddress;
  2. import java.nio.ByteBuffer;
  3. import java.nio.channels.SelectionKey;
  4. import java.nio.channels.Selector;
  5. import java.nio.channels.ServerSocketChannel;
  6. import java.nio.channels.SocketChannel;
  7. import java.util.Iterator;
  8. import java.util.Set;
  9.  
  10.  
  11.  
  12.  
  13. public class MainClass {
  14.  
  15. private static ServerSocketChannel ssc;
  16.  
  17. private static Selector selector;
  18.  
  19. private static Thread[] threads = new Thread[2];
  20.  
  21.  
  22. public static void main(String[] args) throws IOException {
  23. init();
  24. selector = Selector.open();
  25. Thread thread;
  26. thread = genComThread();
  27. thread.start();
  28. }
  29.  
  30. private static Thread genComThread() {
  31. return new Thread(new Runnable() {
  32.  
  33.  
  34. @Override
  35. public void run() {
  36. while(true) {
  37.  
  38. try {
  39.  
  40. SocketChannel sc;
  41. if((sc = ssc.accept()) != null) {
  42. sc.configureBlocking(false);
  43. sc.register(selector, (SelectionKey.OP_READ | SelectionKey.OP_WRITE));
  44. }
  45.  
  46. if(selector.selectNow() > 0) {
  47. processChannel(selector.selectedKeys());
  48. }
  49.  
  50.  
  51. } catch (Exception ex) {
  52. ex.printStackTrace();
  53. }
  54.  
  55. try {
  56. Thread.sleep(0L, 1);
  57. } catch (InterruptedException e) {
  58. e.printStackTrace();
  59. }
  60.  
  61. }
  62. }
  63.  
  64.  
  65. private void processChannel(Set<SelectionKey> selectedKeys) throws Exception {
  66. Iterator<SelectionKey> iterator = selectedKeys.iterator();
  67.  
  68. SelectionKey sk;
  69. SocketChannel sc;
  70. while(iterator.hasNext()) {
  71.  
  72. sk = iterator.next();
  73. if(sk.isReadable()) {
  74. sc = (SocketChannel) sk.channel();
  75. ByteBuffer buffer = ByteBuffer.allocate(1024);
  76.  
  77. try {
  78. System.out.print("N: " + sc.read(buffer));
  79. System.out.println(" | String: " + new String(buffer.array()));
  80. } catch (Exception ex) {
  81. sk.cancel();
  82. ex.printStackTrace();
  83. }
  84. }
  85.  
  86. // iterator.remove();
  87. }
  88. }
  89.  
  90. });
  91. }
  92.  
  93. private static void init() throws IOException {
  94. ssc = ServerSocketChannel.open();
  95. ssc.bind(new InetSocketAddress("127.0.0.1", 55555));
  96. ssc.configureBlocking(false);
  97. }
  98.  
  99.  
  100. }


Client:
Java Code:

  1. import java.net.InetSocketAddress;
  2. import java.nio.ByteBuffer;
  3. import java.nio.channels.SocketChannel;
  4. import java.util.Calendar;
  5.  
  6.  
  7.  
  8.  
  9. public class CMainClass {
  10.  
  11. private static SocketChannel sc;
  12.  
  13.  
  14. public static void main(String[] args) throws Exception {
  15. init();
  16.  
  17. StringBuilder sb = new StringBuilder(Calendar.getInstance().getTime() + " | ");
  18. for(int i = 0; i < 1024; i ++) {
  19. sb.append(String.valueOf(i).substring(0, 1));
  20. }
  21.  
  22. ByteBuffer buffer;
  23. buffer = ByteBuffer.allocate(sb.length());
  24. buffer.put(sb.toString().getBytes());
  25.  
  26. buffer.flip();
  27.  
  28. sc.configureBlocking(false);
  29.  
  30. long t = System.nanoTime();
  31. while(buffer.hasRemaining()) {
  32. System.out.println("Write ...");
  33. sc.write(buffer);
  34. }
  35. System.out.println(System.nanoTime() - t + " nanos");
  36.  
  37. buffer.clear();
  38. while(sc.read(buffer) < 1)
  39. Thread.sleep(0L, 1);
  40. System.out.println(new String(buffer.array()));
  41.  
  42. }
  43.  
  44. private static void init() throws Exception {
  45. sc = SocketChannel.open();
  46. sc.connect(new InetSocketAddress("127.0.0.1", 55555));
  47. }
  48.  
  49.  
  50. }


Vielen Dank schon im voraus.

Mit freundlichen Grüßen,
Thalion


TCP Connection zu langsam

0 commentaires:

Enregistrer un commentaire