TrackerGroup.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /**
  2. * Copyright (C) 2008 Happy Fish / YuQing
  3. *
  4. * FastDFS Java Client may be copied only under the terms of the GNU Lesser
  5. * General Public License (LGPL).
  6. * Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
  7. */
  8. package org.csource.fastdfs;
  9. import java.io.IOException;
  10. import java.net.InetSocketAddress;
  11. import java.net.Socket;
  12. /**
  13. * Tracker server group
  14. * @author Happy Fish / YuQing
  15. * @version Version 1.17
  16. */
  17. public class TrackerGroup
  18. {
  19. protected Integer lock;
  20. public int tracker_server_index;
  21. public InetSocketAddress[] tracker_servers;
  22. /**
  23. * Constructor
  24. * @param tracker_servers tracker servers
  25. */
  26. public TrackerGroup(InetSocketAddress[] tracker_servers)
  27. {
  28. this.tracker_servers = tracker_servers;
  29. this.lock = new Integer(0);
  30. this.tracker_server_index = 0;
  31. }
  32. /**
  33. * return connected tracker server
  34. * @return connected tracker server, null for fail
  35. */
  36. public TrackerServer getConnection(int serverIndex) throws IOException
  37. {
  38. Socket sock = new Socket();
  39. sock.setReuseAddress(true);
  40. sock.setSoTimeout(ClientGlobal.g_network_timeout);
  41. sock.connect(this.tracker_servers[serverIndex], ClientGlobal.g_connect_timeout);
  42. return new TrackerServer(sock, this.tracker_servers[serverIndex]);
  43. }
  44. /**
  45. * return connected tracker server
  46. * @return connected tracker server, null for fail
  47. */
  48. public TrackerServer getConnection() throws IOException
  49. {
  50. int current_index;
  51. synchronized(this.lock)
  52. {
  53. this.tracker_server_index++;
  54. if (this.tracker_server_index >= this.tracker_servers.length)
  55. {
  56. this.tracker_server_index = 0;
  57. }
  58. current_index = this.tracker_server_index;
  59. }
  60. try
  61. {
  62. return this.getConnection(current_index);
  63. }
  64. catch(IOException ex)
  65. {
  66. System.err.println("connect to server " + this.tracker_servers[current_index].getAddress().getHostAddress() + ":" + this.tracker_servers[current_index].getPort() + " fail");
  67. ex.printStackTrace(System.err);
  68. }
  69. for (int i=0; i<this.tracker_servers.length; i++)
  70. {
  71. if (i == current_index)
  72. {
  73. continue;
  74. }
  75. try
  76. {
  77. TrackerServer trackerServer = this.getConnection(i);
  78. synchronized(this.lock)
  79. {
  80. if (this.tracker_server_index == current_index)
  81. {
  82. this.tracker_server_index = i;
  83. }
  84. }
  85. return trackerServer;
  86. }
  87. catch(IOException ex)
  88. {
  89. System.err.println("connect to server " + this.tracker_servers[i].getAddress().getHostAddress() + ":" + this.tracker_servers[i].getPort() + " fail");
  90. ex.printStackTrace(System.err);
  91. }
  92. }
  93. return null;
  94. }
  95. public Object clone()
  96. {
  97. InetSocketAddress[] trackerServers = new InetSocketAddress[this.tracker_servers.length];
  98. for (int i=0; i<trackerServers.length; i++)
  99. {
  100. trackerServers[i] = new InetSocketAddress(this.tracker_servers[i].getAddress().getHostAddress(), this.tracker_servers[i].getPort());
  101. }
  102. return new TrackerGroup(trackerServers);
  103. }
  104. }