/net/minecraft/src/NetworkManager.java

https://bitbucket.org/kingbowser/stormclient · Java · 294 lines · 263 code · 25 blank · 6 comment · 24 complexity · 9ed93e66693ba92fd9df6baf0c04af18 MD5 · raw file

  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
  2. // Jad home page: http://www.kpdus.com/jad.html
  3. // Decompiler options: packimports(3) braces deadcode fieldsfirst
  4. package net.minecraft.src;
  5. import java.io.*;
  6. import java.net.*;
  7. import java.util.*;
  8. // Referenced classes of package net.minecraft.src:
  9. // NetworkReaderThread, NetworkWriterThread, Packet, NetHandler,
  10. // NetworkMasterThread, ThreadCloseConnection
  11. public class NetworkManager
  12. {
  13. public static final Object threadSyncObject = new Object();
  14. public static int numReadThreads;
  15. public static int numWriteThreads;
  16. private Object sendQueueLock;
  17. private Socket networkSocket;
  18. private final SocketAddress remoteSocketAddress;
  19. private DataInputStream socketInputStream;
  20. private DataOutputStream socketOutputStream;
  21. private boolean isRunning;
  22. private List readPackets;
  23. private List dataPackets;
  24. private List chunkDataPackets;
  25. private NetHandler netHandler;
  26. private boolean isServerTerminating;
  27. private Thread writeThread;
  28. private Thread readThread;
  29. private boolean isTerminating;
  30. private String terminationReason;
  31. private Object field_20101_t[];
  32. private int timeSinceLastRead;
  33. private int sendQueueByteLength;
  34. public static int field_28145_d[] = new int[256];
  35. public static int field_28144_e[] = new int[256];
  36. public int chunkDataSendCounter;
  37. private int field_20100_w;
  38. public NetworkManager(Socket socket, String s, NetHandler nethandler)
  39. throws IOException
  40. {
  41. sendQueueLock = new Object();
  42. isRunning = true;
  43. readPackets = Collections.synchronizedList(new ArrayList());
  44. dataPackets = Collections.synchronizedList(new ArrayList());
  45. chunkDataPackets = Collections.synchronizedList(new ArrayList());
  46. isServerTerminating = false;
  47. isTerminating = false;
  48. terminationReason = "";
  49. timeSinceLastRead = 0;
  50. sendQueueByteLength = 0;
  51. chunkDataSendCounter = 0;
  52. field_20100_w = 50;
  53. networkSocket = socket;
  54. remoteSocketAddress = socket.getRemoteSocketAddress();
  55. netHandler = nethandler;
  56. try
  57. {
  58. socket.setSoTimeout(30000);
  59. socket.setTrafficClass(24);
  60. }
  61. catch(SocketException socketexception)
  62. {
  63. System.err.println(socketexception.getMessage());
  64. }
  65. socketInputStream = new DataInputStream(socket.getInputStream());
  66. socketOutputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream(), 5120));
  67. readThread = new NetworkReaderThread(this, (new StringBuilder()).append(s).append(" read thread").toString());
  68. writeThread = new NetworkWriterThread(this, (new StringBuilder()).append(s).append(" write thread").toString());
  69. readThread.start();
  70. writeThread.start();
  71. }
  72. public void addToSendQueue(Packet packet)
  73. {
  74. if(isServerTerminating)
  75. {
  76. return;
  77. }
  78. synchronized(sendQueueLock)
  79. {
  80. sendQueueByteLength += packet.getPacketSize() + 1;
  81. if(packet.isChunkDataPacket)
  82. {
  83. chunkDataPackets.add(packet);
  84. } else
  85. {
  86. dataPackets.add(packet);
  87. }
  88. }
  89. }
  90. private boolean sendPacket()
  91. {
  92. boolean flag = false;
  93. try
  94. {
  95. if(!dataPackets.isEmpty() && (chunkDataSendCounter == 0 || System.currentTimeMillis() - ((Packet)dataPackets.get(0)).creationTimeMillis >= (long)chunkDataSendCounter))
  96. {
  97. Packet packet;
  98. synchronized(sendQueueLock)
  99. {
  100. packet = (Packet)dataPackets.remove(0);
  101. sendQueueByteLength -= packet.getPacketSize() + 1;
  102. }
  103. Packet.writePacket(packet, socketOutputStream);
  104. field_28144_e[packet.getPacketId()] += packet.getPacketSize() + 1;
  105. flag = true;
  106. }
  107. if(field_20100_w-- <= 0 && !chunkDataPackets.isEmpty() && (chunkDataSendCounter == 0 || System.currentTimeMillis() - ((Packet)chunkDataPackets.get(0)).creationTimeMillis >= (long)chunkDataSendCounter))
  108. {
  109. Packet packet1;
  110. synchronized(sendQueueLock)
  111. {
  112. packet1 = (Packet)chunkDataPackets.remove(0);
  113. sendQueueByteLength -= packet1.getPacketSize() + 1;
  114. }
  115. Packet.writePacket(packet1, socketOutputStream);
  116. field_28144_e[packet1.getPacketId()] += packet1.getPacketSize() + 1;
  117. field_20100_w = 0;
  118. flag = true;
  119. }
  120. }
  121. catch(Exception exception)
  122. {
  123. if(!isTerminating)
  124. {
  125. onNetworkError(exception);
  126. }
  127. return false;
  128. }
  129. return flag;
  130. }
  131. public void wakeThreads()
  132. {
  133. readThread.interrupt();
  134. writeThread.interrupt();
  135. }
  136. private boolean readPacket()
  137. {
  138. boolean flag = false;
  139. try
  140. {
  141. Packet packet = Packet.readPacket(socketInputStream, netHandler.isServerHandler());
  142. if(packet != null)
  143. {
  144. field_28145_d[packet.getPacketId()] += packet.getPacketSize() + 1;
  145. readPackets.add(packet);
  146. flag = true;
  147. } else
  148. {
  149. networkShutdown("disconnect.endOfStream", new Object[0]);
  150. }
  151. }
  152. catch(Exception exception)
  153. {
  154. if(!isTerminating)
  155. {
  156. onNetworkError(exception);
  157. }
  158. return false;
  159. }
  160. return flag;
  161. }
  162. private void onNetworkError(Exception exception)
  163. {
  164. exception.printStackTrace();
  165. networkShutdown("disconnect.genericReason", new Object[] {
  166. (new StringBuilder()).append("Internal exception: ").append(exception.toString()).toString()
  167. });
  168. }
  169. public void networkShutdown(String s, Object aobj[])
  170. {
  171. if(!isRunning)
  172. {
  173. return;
  174. }
  175. isTerminating = true;
  176. terminationReason = s;
  177. field_20101_t = aobj;
  178. (new NetworkMasterThread(this)).start();
  179. isRunning = false;
  180. try
  181. {
  182. socketInputStream.close();
  183. socketInputStream = null;
  184. }
  185. catch(Throwable throwable) { }
  186. try
  187. {
  188. socketOutputStream.close();
  189. socketOutputStream = null;
  190. }
  191. catch(Throwable throwable1) { }
  192. try
  193. {
  194. networkSocket.close();
  195. networkSocket = null;
  196. }
  197. catch(Throwable throwable2) { }
  198. }
  199. public void processReadPackets()
  200. {
  201. if(sendQueueByteLength > 0x100000)
  202. {
  203. networkShutdown("disconnect.overflow", new Object[0]);
  204. }
  205. if(readPackets.isEmpty())
  206. {
  207. if(timeSinceLastRead++ == 1200)
  208. {
  209. networkShutdown("disconnect.timeout", new Object[0]);
  210. }
  211. } else
  212. {
  213. timeSinceLastRead = 0;
  214. }
  215. Packet packet;
  216. for(int i = 1000; !readPackets.isEmpty() && i-- >= 0; packet.processPacket(netHandler))
  217. {
  218. packet = (Packet)readPackets.remove(0);
  219. }
  220. wakeThreads();
  221. if(isTerminating && readPackets.isEmpty())
  222. {
  223. netHandler.handleErrorMessage(terminationReason, field_20101_t);
  224. }
  225. }
  226. public void func_28142_c()
  227. {
  228. wakeThreads();
  229. isServerTerminating = true;
  230. readThread.interrupt();
  231. (new ThreadCloseConnection(this)).start();
  232. }
  233. static boolean isRunning(NetworkManager networkmanager)
  234. {
  235. return networkmanager.isRunning;
  236. }
  237. static boolean isServerTerminating(NetworkManager networkmanager)
  238. {
  239. return networkmanager.isServerTerminating;
  240. }
  241. static boolean readNetworkPacket(NetworkManager networkmanager)
  242. {
  243. return networkmanager.readPacket();
  244. }
  245. static boolean sendNetworkPacket(NetworkManager networkmanager)
  246. {
  247. return networkmanager.sendPacket();
  248. }
  249. static DataOutputStream getOutputStream(NetworkManager networkmanager)
  250. {
  251. return networkmanager.socketOutputStream;
  252. }
  253. static boolean getIsTerminating(NetworkManager networkmanager)
  254. {
  255. return networkmanager.isTerminating;
  256. }
  257. static void func_30005_a(NetworkManager networkmanager, Exception exception)
  258. {
  259. networkmanager.onNetworkError(exception);
  260. }
  261. static Thread getReadThread(NetworkManager networkmanager)
  262. {
  263. return networkmanager.readThread;
  264. }
  265. static Thread getWriteThread(NetworkManager networkmanager)
  266. {
  267. return networkmanager.writeThread;
  268. }
  269. }