Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: PalvelinOhjelman readbytes ?

HannuTapio [30.01.2022 11:32:20]

#

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ää.

:) :) :)

--

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta