Hei,
Minulla on palvelinohjelman uudelleen kirjoitus käynnissä, olen paljon kehittynyt edellisestä ohjelmointisuorituksesta, kun kuusi vuotta sitten tein palvelinohjelman.
Tässä on minun readbytes, tämä on tärkeä koodi minulle, siinä luetaan ja laitetaan string käsittelyyn lautapeliohjelman lähettämät tcp paketit.
Tässä koodi - Laitoin koodin kolmeen osaan, jotta sitä on helpompi lukea.
package threads; import java.io.IOException; import java.nio.ByteBuffer; import vars.g; import xsynchronized.xextras_syncs_001; import xutils.xmath; import xutils.xutils; /** * * @author pelisaro */ public class TCP_ReadBytes extends TCP_ReadBytes_002_HandlenWrite { public TCP_ReadBytes(int lthread_number) { this.g_readbytes_thread_number = lthread_number; } @Override public void run() { this.set_minsleep(0.55f); ByteBuffer lbuf = ByteBuffer.allocateDirect(65000); do { this.l_loop_counter++; this.sleep(xmath.getRandom_int(3 , 6)); if (g.g_clients_online_totally == 0) { this.sleep(333); } try { for (int laa = 0 ; laa < 256 ; ++laa) { this.sleep_minimi(); if (this.g_slotti > -1) { g.llock_player_thread[this.g_slotti] = false; } this.g_slotti = xextras_syncs_001.return_ReadBytes_Slot(); if (this.g_slotti == -1) { break; } if (this.g_slotti > -1) { if ((g.g_pelaajat[this.g_slotti].g_connectionStatus == g.gTCPACCEPT_HANDSHAKING) || (g.g_pelaajat[this.g_slotti].g_connectionStatus == g.gTCPACCEPT_CONNECTED)) { int lavail; while ((lavail = g.g_pelaajat[this.g_slotti].g_socketti.getInputStream().available()) > 0) { this.sleep_minimi(); if (lavail > 65000) { lbuf.clear(); xextras_syncs_001.shut_down_socketti(this.g_slotti); break; } lbuf.clear(); try { lbuf.put(g.g_pelaajat[this.g_slotti].g_socketti.getInputStream().readNBytes(Math.min(65536 , lavail))); } catch (IOException ex) { lbuf.clear(); xextras_syncs_001.shut_down_socketti(this.g_slotti); break; } lbuf.flip(); g.g_pelaajat[this.g_slotti].g_number_of_bytes_readed += lbuf.limit(); byte lreadbyte; if (g.g_pelaajat[this.g_slotti].g_socketti != null) { for (int ddd = 0 ; ddd < lbuf.limit() ; ++ddd) { if (g.g_pelaajat[this.g_slotti].g_socketti == null) { lbuf.clear(); break; } lreadbyte = (byte) lbuf.get(); g.g_pelaajat[this.g_slotti].g_readbytes_position++;
switch (g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta) { case "header": switch (g.g_pelaajat[this.g_slotti].g_readbytes_position) { case 1: xutils.dpl("1"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); if ((lreadbyte & 0x80) == 0x80) { g.g_pelaajat[this.g_slotti].g_readbytes_FIN = true; } if ((lreadbyte & 0x0f) == 0x08) { lbuf.clear(); xextras_syncs_001.shut_down_socketti(this.g_slotti); break; } if ((lreadbyte & 0x0f) == 0x09) { g.g_pelaajat[this.g_slotti].g_readbytes_PING = true; } break; case 2: xutils.dpl("2"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght = 2; int lpituus = (int) (lreadbyte & 0x7f); if (lpituus < 126) { g.g_pelaajat[this.g_slotti].g_readbytes_payload_lenght = lpituus; } else if (lpituus == 126) { g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght += 2; } else if (lpituus == 127) { lbuf.clear(); xextras_syncs_001.shut_down_socketti(this.g_slotti); break; } if ((lreadbyte & 0x80) == 0x80) { g.g_pelaajat[this.g_slotti].g_readbytes_MASK = true; g.g_pelaajat[this.g_slotti].g_readbytes_MASK_position = (g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght); } else { if (g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght == 2) { g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta = "payload"; } } break; case 3: xutils.dpl("3"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); break; case 4: xutils.dpl("4"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); if (g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght == 4) { if (g.g_pelaajat[this.g_slotti].g_readbytes_MASK == false) { g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta = "payload"; g.g_pelaajat[this.g_slotti].g_readbytes_payload_lenght = (g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.get(2) << 8) + g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.get(3); } } break; case 5: xutils.dpl("5"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); break; case 6: xutils.dpl("6"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); if (g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght == 2) { g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta = "payload"; } break; case 7: xutils.dpl("7"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); break; case 8: xutils.dpl("8"); g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.put((byte) lreadbyte); if (g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght == 4) { g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta = "payload"; g.g_pelaajat[this.g_slotti].g_readbytes_payload_lenght = (g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.get(2) << 8) + g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.get(3); } break; } break;
case "payload": if (g.g_pelaajat[this.g_slotti].g_readbytes_MASK) { g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.append((char) (lreadbyte ^ g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.get(g.g_pelaajat[this.g_slotti].g_readbytes_MASK_position + g.g_pelaajat[this.g_slotti].g_readbytes_MASK_roll_xor))); } else { g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.append((char) (lreadbyte)); } xutils.dpl(g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.toString()); g.g_pelaajat[this.g_slotti].g_readbytes_MASK_roll_xor++; g.g_pelaajat[this.g_slotti].g_readbytes_MASK_roll_xor &= 3; if (g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.length() == g.g_pelaajat[this.g_slotti].g_readbytes_payload_lenght) { if (g.g_pelaajat[this.g_slotti].g_readbytes_FIN) { xutils.dpl(g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.toString()); if (g.g_pelaajat[this.g_slotti].g_readbytes_PING) { this.TCPSendPong(g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.toString()); } else { g.g_pelaajat[this.g_slotti].g_readbytes_handled_string_array = null; g.g_pelaajat[this.g_slotti].g_readbytes_handled_string_array = g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.toString().split(">"); this.TCPHandlenWriteMSGs(); } g.g_pelaajat[this.g_slotti].g_readbytes_to_handle.setLength(0); g.g_pelaajat[this.g_slotti].g_readbytes_PING = false; } g.g_pelaajat[this.g_slotti].g_readbytes_kulku_kohta = "header"; g.g_pelaajat[this.g_slotti].g_readbytes_HEADER_bytes.clear(); g.g_pelaajat[this.g_slotti].g_readbytes_MASK = false; g.g_pelaajat[this.g_slotti].g_readbytes_FIN = false; g.g_pelaajat[this.g_slotti].g_readbytes_position = 0; g.g_pelaajat[this.g_slotti].g_readbytes_payload_lenght = 0; g.g_pelaajat[this.g_slotti].g_readbytes_header_lenght = 0; g.g_pelaajat[this.g_slotti].g_readbytes_MASK_position = 0; g.g_pelaajat[this.g_slotti].g_readbytes_MASK_roll_xor = 0; } break; } } } if (g.g_pelaajat[this.g_slotti].g_socketti == null) { lbuf.clear(); break; } } } } } } catch (IOException ex) { lbuf.clear(); xextras_syncs_001.shut_down_socketti(this.g_slotti); break; } } while (g.g_boolean_exit_main_loop == false); } }
Minulla on viisi tälläistä threadia, lukemassa lautapeliohjelman lähettämiä pelin ajan tcp paketteja, tässä olisi paras koodi mihinkä minä kykenen tällä hetkellä, muuttuja nimet ovat vähän alkeellisia, mutta, olen ihan onnellinen koodin kanssa.
Onko koodissa jotakin, sellaista alkeellisuutta, mikä todella hidastaa pakettien käsittelyjä, minulla on tarkoitus 10 000 asiakasta palvella, näillä 5 threadilla.
Onko hyvä ja toimiva koodi ?
Jos tarvii nähdä jotakin lisää, niin, pyytäkää.
:) :) :)
--
Aihe on jo aika vanha, joten et voi enää vastata siihen.