Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Palvelinohjelman accept threadin run()

Sivun loppuun

HannuTapio [20.07.2019 21:32:36]

#

Hei,

Minulla on openjava palvelinohjelma linux ubuntu palvelimessa.

Minulla on 21 threadia, kuuntelemassa portteja, tämä seuraava run() on jokaisessa.

@Override
    public void run() {
        TCP_Maintanance0.dpl("Server : TCP_Accept Thread " + this.accept_thread_number + " activated !!");
        ServerSocket server = null;
        try {
            server = new ServerSocket(8100 + this.accept_thread_number);
            server.setSoTimeout(0);
            server.setReuseAddress(false);
            server.setReceiveBufferSize(Short.MAX_VALUE * 16);
        } catch (Exception e) {
        }
        do {
            try {
                this.sleep(25);
                int aa = TCP_Maintanance0.getFreeSlot();
                TCP_Maintanance0.dpl("Attempt to connect thread :" + this.accept_thread_number + ", to slot :" + aa);
                if (aa >= 0) {
                    TCP_Maintanance0.dpl("Attempt to connect thread : success slot found.");
                    Socket lso = server.accept();
                    this.sleep(2);
                    if (lso.isConnected()) {
                        g.socketit[aa].clearSlot();
                        g.socketit[aa].socket = lso;
                        g.socketit[aa].socket.setTcpNoDelay(true);
                        g.socketit[aa].socket.setReuseAddress(false);
                        g.socketit[aa].socket.setPerformancePreferences(2, 2, 3);
                        g.socketit[aa].socket.setSoTimeout(2);
                        g.socketit[aa].socket.setReceiveBufferSize(Short.MAX_VALUE / 2);
                        g.socketit[aa].socket.setSendBufferSize(Short.MAX_VALUE / 2);
                        TCP_Maintanance0.dpl("-------------------------------------------------------");
                        TCP_Maintanance0.dpl("Connected to slot : " + aa);
                        TCP_Maintanance0.dpl(new Date().toString());
                        TCP_Maintanance0.dpl("-------------------------------------------------------");
                        g.socketit[aa].isConnected = 25;
                        g.clients_connections_per_3_seconds += 250;
                    }
                } else {
                    TCP_Maintanance0.dpl("Accept : sleep 1111");
                    this.sleep(1111);
                }
            } catch (Exception e) {
                e.printStackTrace();
                TCP_Maintanance0.dpl(e.getStackTrace().toString());
            }
        } while (g.boolean_exit_main_loop == false);
    }

Tämä on minun sivustoni accept rutiini, en osaa sitä enempää säätää, ja täytyy myöntää, että, en ihan tunne kaikkia kohtia tuosta koodistakaan, nuo TCP säädöt, niin, onko ne ihan ok ja vielä että puuttuuko jotakin tärkeätä, olisi mukava jos saisin ihan tosi vakaan palvelinohjelman aikaan.

Muistutan taas että en ole oikea ohjelmoija, olen lukio tason henkilö, joka harrastaa lautapelejä netissä, tuon nuoruus vuosieni lautoja ihmisten pelattavaksi.

Tuo koodi minulla toimii tällä hetkellä ihan ok, mutta, en tiedä puuttuuko siintä jotakin ja että onko siinä jotakin turhaa ?

Toivoisin tosi vakaan palvelinohjelman, minä en tunne TCP säätöjä, yritin lukea netistä, mutta, englanti oli vaikeata, mitä luin.

Minulla on openjdk 8.

:) :) :)

--

maka78 [17.08.2019 15:05:12]

#

Tuota... ihan mielenkiinnosta... minkä takia luot ServerSocketin säikeessä? Tuohan tarkoittaa ilmeisesti, että luot monta säiettä JA serversockettia :O.
Miksi et luo vain yhtä serversockettia, josta käsittely siirretään normi socketille omaan säikeeseen?

HannuTapio [17.08.2019 19:06:07]

#

Hei,

En tunne ohjetta, joka kertoo, kuinka montaa konnektia kerralla osaa tuo serversocket käsitellä, tai kuinka kauan se käsittelee aina yhtä konnektia, eri tilanteissa ja yhteys nopeuksissa, minulla on 21 threadia accept tilassa, siltä varalta, että, tulee kävijöitä kerralla kirjautumaan useita.

Minulla voi 10000 pelaajaa kirjautua kerralla, minä hypööttistä kävijä määrä tungosta varten, olen laittana 21 threadia accept tilaan, TCP portit 8100 - 8120.

:) :) :)

--

maka78 [17.08.2019 21:19:04]

#

Millä pidät huolen että client ottaa yhteyden oikeaan porttiin?
Luulen kyllä että yhdelläkin serversocketilla palvelee kaikki sivustosi pelaajat kun yhteydet passataan omaan säikeeseen heti yhteyden muodostuttua. Vai meinaatko että kaikki pelaajat ottavat yhteyden juuri samalla sekunnilla?
No jokainen tekee niinkuin tykkää :).

groovyb [17.08.2019 22:46:16]

#

Yksi websocket kyllä riittää, ideahan siinä nimenomaan on että clientit avaa siihen oman tcp yhteyden ja saman socketpisteen kautta voi reitittää dataa puolin ja toisin (tai broadcastillä painaa dataa kaikille)

HannuTapio [18.08.2019 01:38:00]

#

maka78 kirjoitti:

(17.08.2019 21:19:04): Vai meinaatko että kaikki pelaajat ottavat yhteyden juuri samalla sekunnilla?

Hei,

Kyllä, minä olen valinnut nämä 21 TCP porttia sitä hypööttistä tilannetta varten että 10000 ihmistä taikka vain kymmenes siintä ottaa yhteyttä samalla sekunnilla, minulla voi 10000 ihmistä kirjautua kerralla.

Jos esim. linja katkeaa jokaisella 5000 ihmisellä joka on linjalla, ja he kaikki sitten heti ottavat yhteyttä reload buttonilla samantien, niin, sitä varten on 21 identtistä tcp porttia serversocket accept:tilla valmiina.

Minulla on palvelinohjelmassani, tällä hetkellä, näin ->

21 threadia, serversocket accept, tcp portit 8100-8120, rakentaa tcp socketin.
2 threadia, lue tcp sockettia, nämä lukevat tcp paketteja, rakennetuista tcp socketeista.
2 threadia, käsittele luettuja tcp paketteja, nämä käsittelevät saapuneet paketit.
1 threadi, kirjoita käsitelty paketti, takaisin clienteille, jos tarvitsee.

:) :) :)

--

maka78 [19.08.2019 22:48:41]

#

Et kuitenkaan vastannut kysymykseeni, eli millä pidät huolen että asiakkaat ottavat yhteyden oikeaan porttiin?
Todennäköisesti tilanne on nyt kuitenkin se, että olet ratkaissut ongelmaa - jota sinulla ei ole - luomalla itsellesi lisää ongelmia :).

HannuTapio [20.08.2019 07:55:20]

#

Hmmh,

Minulla tuolla minun sivustollani jo etusivulla lukee, että, minulla on tcp portit 8100 - 8120 käytössä, ja että, minun lautapeli- ja tabletpeli- ohjelmani, ottavat satunnaiseen porttiin yhteyttä.

Nämä porttien koodit ovat identtisiä, ne ainoastaan, rakentavat palvelinohjelmalle socketti luokan käyttöön.

Eli, lautapeli- ja tabletpeliohjelma valikoi aina satunnaisen tcp portin 8100 - 8120 ja nämä porttien accept koodit ovat identtisiä, eli kuten tuo ekan viestin koodi.

Nämä accept threadit, rakentavat tuon g.socketit[xx] luokan jota käytetään sitten lue / käsittele / kirjoita threadeissa.

:) :) :)

Minulla on seuraava koodi lautapeliohjelmassa, joka ottaa yhteyttä palvelinohjelman accept threadeihin, eli, ei ole mitään varsinaista "oikeata" porttia, vaan ihan satunnaisesti mihinkä identtiseen accept porttiin 8100 - 8120 vaan.

gTCPWebSocket = null ;
gTCPPort = getRandom_int ( 8100 , 8120 ) ;
var gurl = "wss://www.lautapelisivusto.com/_WS_:" + gTCPPort ;
gTCPWebSocket = new WebSocket ( gurl ) ;

Ja minulla on ihan hyvä ja toimiva rakenne palvelinohjelmassani, olen siihen lähes erittäin tyytyväisenä, kaikki tuntuu toimivan ihan ok.

--

maka78 [20.08.2019 16:44:38]

#

Elikä varaat siis myös muistista tilaa n. 10000 socketille, käytettiin niitä eli ei? Tuon sinun virityksen voisi ihan hyvin tehdä yhdellä serversocketilla ja luoda clienttia palvelevan socketin kun sellainen tarvitaan. Mutta hei... kukin tavallaan pääasia että olet itse tyytyväinen. Luulen myös että jos tuo sinun 10000 käyttäjän haamuraja alkaisi olla edes teoriassa lähellä, ei siihen todellisuudessa päästäisi ilman ongelmia, koskapa sinun randomisi ampuisi käyttäjiä mahdollisesti jo täysiin pooleihin :). Toki en kaikkea koodia näe, mutta sen mitä näen ynnä ulosantisi viittaa vahvasti siihen.

HannuTapio [20.08.2019 17:21:15]

#

Hei,

Nämä 10000 sockettia ovat toki null tilassa, kun minä niitä varaan, eihän niitä vielä ole ohjattuna mihinkään. :).

Kiitos, kun kehuit että olen tyytyväinen, minä ryhdyn tässä rakentamaan pelejä kohti tuota 10 000 kävijän rajaa, minä olen tällä hetkellä tyytyväinen koodin kulkuun ja ohjelmaani.

:) :) :)

--

maka78 [20.08.2019 20:45:21]

#

No vaikka niitä ei ole ohjattu mihinkään, niin vievät ne kuitenkin 32 bittisessä järjestelmässä 4 tavua ja 64 bittisessä järjestelmässä 8 tavua zipale jos ihan tarkkoja ollaan :). Mutta joo lopetan tuuleen huutamisen tähän ja toivottelen hauskoja koodaushetkiä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta