Page 7 of 8

Re: CoolBasic & netti = cbNetwork

Posted: Fri Oct 14, 2011 9:53 am
by valscion
naputtelija wrote:Toimiiko tuo coolbasicin SaveGame tämän kanssa ihan normaalisti? Eli ideana olisi se, että uuden clientin tullessa linjoille sen lähettämä ID tarkastetaan ja jos se on uusi, sama clientin ID tallennetaan serverin puolelle ja peli tallennetaan. Jos se on taas vanha, serveri antaa oman pelitilanteensa takaisin. Entä onko tälle minun idealleni jotain käytännöllisempää ratkaisua?
Kuten Viltzu sanoi, SaveGame on on todella epäkäytännöllinen eikä sitä kannata käyttää missään isohkommassa projektissa. Ei varsinkaan sellaisessa, jossa cbNetwork on osallisena.

Mutta niin, periaate siitä että ID tallennettaisiin johonkin ja sitten sitä verrattaisiin myöhemmin tarkistettaessa että onko client sama, toimii vissiinkin vain silloin kun palvelinta eikä clienttiä ole sammutettu. Muistaakseni client saa ID:n palvelimelta silloin, kun se ensimmäistä kertaa yhdistää palvelimeen. Sitten client voi katkaista yhteyden ja yhdistää uudelleen sammuttamatta ohjelmaa ja saa saman ID:n uudelleen. Mutta mikäli client sammuttaa ohjelman, ei samaa ID:tä tule vaan palvelin tarjoaa clientille uuden ID:n.

Voin olla väärässäkin siitä, että uusi ID tarjottaisiin, jos client on sammutettu välissä. Voi olla, että palvelin antaa clientille aina saman ID:n, kunhan palvelinta ei ole clientin yhdistelyiden välissä sammuteltu. Se ainakin on varmaa, että ID:t eivät pysy samoina jos palvelin sammutetaan ja käynnistetään uudelleen.

Tuon idean voisi ehkä toteuttaa sillä tavalla, että teet palvelimen puolelle jokaiselle clientille omalla algoritmillasi jonkin tunnistamis-ID:n. Kun uusi, tuntematon client yhdistää palvelimelle, palvelin lähettää tuon tunnistus-ID:n clientille joka tallentaa sen. Kun client seuraavan kerran yhdistää palvelimelle, lähettää se yhdistyksen yhteydessä tuon tunnistus-ID:n ja palvelin huomaa sen olevan jo entuudestaan tunnettu. Tällöin palvelin voi lähettää pelin sen hetken tilanteen clientille.

Eli tilanne menisi näin:

Code: Select all

## Client yhdistää palvelimelle ensimmäistä kertaa ##
  1. Client lähettää login-paketin
     - login-paketti sisältää tyhjän tunnistus-ID:n
  2. Palvelin vastaanottaa login-paketin
     - huomaa että tunnistus-ID on tyhjä
  3. Palvelin generoi uuden tunnistus-ID:n
  4. Palvelin lähettää tavaraa
     - generoitu tunnistus-ID
     - pelin alun tilanne
  5. Client vastaanottaa tavaraa
     - tunnistus-ID
     - pelin alun tilanne
  6. Client tallentaa tunnistus-ID:n johonkin tiedostoon
  7. Client pelaa...
     ....
     ....
  8. Client katkaisee yhteyden. Lähettää lopetuspaketin.
  9. Palvelin vastaanottaa lopetuspaketin.
 10. Palvelin tallentaa clientin pelin tiedoston johonkin tiedostoon
    ja/tai tallentaa sen muistiin.
 11. Palvelin poistaa clientin listaltaan.


## Client yhdistää palvelimelle, jolla on jo ollut aikaisemmin ##
  1. Client lukee tiedostosta oman tunnistus-ID:nsä
  2. Client lähettää login-paketin
     - login-paketti sisältää tunnistus-ID:n
  3. Palvelin vastaanottaa login-paketin
     - huomaa ettei tunnistus-ID ole tyhjä
  4. Palvelin etsii, onko tunnistus-ID jo entuudestaan olemassa
     - löytää vastaavuuden
  5. Palvelin lukee muistista/tiedostosta clientin viimekertaisen pelitilanteen
  6. Palvelin lähettää tavaraa
     - jokin tieto siitä, että client on tuttu ja tulossa on pelitietoa
       * Voi olla myös tunnistus-ID, joka on sama kuin clientilla,
         jonka perusteella client huomaa että palvelin on todennut
         pelaajan olevan tuttu. Näin client osaa odottaa pelitietoa.
     - pelin tilanne silloin, kun client viimeksi lopetti
  7. Client vastaanottaa tiedot
     - huomaa että palvelin tunnisti pelaajan
     - asettaa pelin tilanteen siihen, mitä palvelin antoi tietona
  8. Client pelaa...
     ....
     ....
  9. Client katkaisee yhteyden. Lähettää lopetuspaketin.
 10. Palvelin vastaanottaa lopetuspaketin.
 11. Palvelin tallentaa clientin pelin tiedoston johonkin tiedostoon
    ja/tai tallentaa sen muistiin.
 12. Palvelin poistaa clientin listaltaan.
EDIT: Oman algoritmin etuihin kuuluu myös se, että jos clientin IP-osoite vaihtuu, voi palvelin silti tunnistaa clientin samaksi. Idea voi laajeta jopa niin pitkälle, että clientin tunnistus-ID:n voi antaa myös kaverille ja hän pääsee pelaamaan sinun peliäsi. Kuitenkaan useammalla kuin yhdelllä pelaajalle ei voi olla samanaikaisesti sama tunnistus-ID, muutoin pelin lopetuksen yhteydessä tallennustilanne voisi mennä sekaisin.

Re: CoolBasic & netti = cbNetwork

Posted: Fri Oct 14, 2011 12:05 pm
by naputtelija koulussa
Juu tein siis oman id:n että kun clientti yhdistää ekan kerran se arpoo ID:n itselleen 10 miljardista vaihtoehdosta, tallentaa sen omaan kryptattuun tiedostoonsa, lähettää sen servulle joka luo sitten oman tiedoston kyseiselle id:lle ja tallentaa siihen koordinaatit, kulman ja kaikki muut kamat. Sitten toisella kerralla clientti pääsee käsiksi siihen serverin tiedostoon ja renderöi sen pohjalta itsensä ja kaikki muut muina ukkoina, jotka näkyvät ympärillä. Eli:

1. Client a painaa nappia ylös.
2. Client b painaa nappia alas
3. Molemmat napinpainallukset lähetetään servulle
4. Joka lähettää uudet koordinaatit joka clientille
5. Jos vastaanotettu on oma id, se renderöi oman ohjattavan ukon.
6. Jos on joku muu, se renderöi sen muualle.
7. Complete multi-client peli!

Re: CoolBasic & netti = cbNetwork

Posted: Sat Oct 15, 2011 12:23 pm
by naputtelija
Kysyisin onko tässä koodissa kaikki kohdallaan (olenko unohtanu mitään tärkeää)

Client:

Code: Select all

Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248
Type UKOT
    Field obj
    Field id
End Type
Dim cli (27)
FrameLimit 40 'rajoita pelin toimintanopeutta
ukko = LoadObject("Media\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
    file$=FindFile()
    If file="" Then
        f=OpenToWrite("id")
        id=Rand(1,10000000000)
        WriteInt f,id
        CloseFile f
    EndIf
    If file<>"" Then
        f=OpenToRead("id")
        id=ReadInt(f)
        CloseFile f
    EndIf
EndSearch
ClsColor cbWhite
masterukko=LoadObject("ukko.bmp")
InitClient("local",1234,1000)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSend()
Repeat
    rtn = ClientRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
    
    If infobyte=INFO_NUM_OF_CLIENTS Then
        numoc=_Net_GetInt()
        For i=1 To numoc
            ukko.UKOT=New(UKOT)
            ukko\obj=CloneObject(masterukko)
        Next i
    EndIf
    
    If infobyte=INFO_SENDING_IDS Then
        For ukko.UKOT = Each UKOT
            count=count+1
            tempid=_Net_GetInt()
            If ukko\id=0 Then ukko\id=tempid
            cli(count)=tempid
        Next ukko
        count=0
    EndIf
        
    If infobyte=INFO_SENDING_COORDS() Then
        For ukko.UKOT = Each UKOT
        
            id2=_Net_GetInt()
            
            If id2=id Then
                PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject ukko\obj,_Net_GetInt()
                CloneCameraPosition ukko\obj
            Else
                PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject ukko\obj,_net_GetInt()
            EndIf
            
            PositionObject ukko\obj,
        Next ukko
    EndIf
    
    If LeftKey() Then turnplus=5
    If RightKey() Then turnplus=-5   
    
    If UpKey() Then moveplus=2
    If DownKey() Then moveplus=-2
    _NetInitMemBlock()
    _Net_PutByte(INFO_MOVING)
    _Net_PutInt(id)
    _Net_PutByte(moveplus)
    _Net_PutByte(turnplus)
    ClientSend()
    
    
    DrawScreen

Forever
Server:

Code: Select all

Include "cbNetwork.cb"
Dim rtn As integer

Type CLIENTS
    Field id
    Field obj
    Field status As Byte
End Type

masterukko=LoadObject("clients/masterukko.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248

If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."
ChDir "clients"
InitServer(1234,1000)
LoadClients()
Repeat
    SendClients()
    SendIds()
    rtn = ServerRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
    
    If infobyte=INFO_STARTING_CONNECTION Then
        tempid=_Net_GetInt()                  //otetaan talteen ID
        tempidstr=Str(tempid)                 //tehdään siitä merkkijono
        ChDir "clients"                       //työkansio: clients
        
        StartSearch                           //etsitään vastaavuuksia
            Repeat
                currentfile$=FindFile()       //otetaan talteen nyk. tiedosto
                If currentfile=tempidstr Then //Löytyi!
                EndIf
                
                If currentfile="" Then        //ei löytynyt.
                    newclient(tempid)
                EndIf
            Forever
        EndSearch
    EndIf
    
    If infobyte=INFO_MOVING Then sendstuff()
        
Forever

Function LoadClients()
    StartSearch
        Repeat
            file$=FindFile()
            If file="" Then Exit
            
            f=OpenToRead(file)
                client.CLIENTS = New(CLIENTS)
                client\id=Int(file)
                client\obj=CloneObject(masterukko)
                PositionObject client\obj,ReadInt(f),ReadInt(f)
                RotateObject client\obj,ReadInt(f)
            CloseFile f
            
        Forever
    EndSearch
End Function

Function newclient(ident)
    client.CLIENTS = New(CLIENTS)
    client\id=ident
    client\status=True
    client\obj=CloneObject(masterukko)
    f=OpenToWrite(Str(client\id))
        WriteInt f,ObjectX(client\obj)
        WriteInt f,ObjectY(client\obj)
        WriteInt f,ObjectAngle(client\obj)
    CloseFile f
End Function

Function sendstuff()
    id=_Net_GetInt()
    For client.CLIENTS = Each CLIENTS
        If client\id=id Then
            MoveObject client\obj,_Net_GetByte()
            TurnObject client\obj,_Net_GetByte()
            _Net_InitMemBlock()
            _Net_PutByte(INFO_SENDING_COORDS)
            _Net_PutInt(client\id)
            _Net_PutInt(ObjectX(client\obj))
            _Net_PutInt(ObjectY(client\obj))
            _Net_PutInt(ObjectAngle(client\obj))
            f=OpenToWrite(Str(client\id))
                WriteInt f,ObjectX(client\obj)
                WriteInt f,ObjectY(client\obj)
                WriteInt f,ObjectAngle(client\obj)
            CloseFile f
        EndIf
    Next client
    ServerSend()
End Function

Function SendClients()
    For client.CLIENTS = Each CLIENTS
        count=count+1
    Next client
    _Net_InitMemBlock()
    _Net_PutByte(INFO_NUM_OF_CLIENTS)
    ServerSend()
End Function

Function SendIds()
    _Net_InitMemBlock
    _Net_PutByte(INFO_SENDING_IDS)
    For client.CLIENTS = Each CLIENTS
        _Net_PutInt(client\id)
    Next client
    ServerSend()
End Function 

EDIT:

Hups väärä koodi :)

EDIT:

Muutaman muokkauksen jälkeen käynnistin serverin mutta se ei suostunut käynnistymään! Mikä avuksi?


Re: CoolBasic & netti = cbNetwork

Posted: Sat Oct 15, 2011 2:36 pm
by valscion
Koodissa kommentointi ei olisi pahitteeksi...

Ainakin se on ongelmana clientin puolella, että annat heti aluksi InitClient-funktiolle väärän osoitteen. Ei ole olemassa sellaista osoitetta kuin "local" mutta "localhost" on.

EDIT: Lataat clientin puolella muuttujaan "ukko" objektin, mutta yrität käyttää syntaksia "ukko.UKOT = New(UKOT)" ja kääntäjä herjaa. Käytä jotain muuta nimeä tyypin instansseille kuin "ukko", esim. "iUkko.UKOT" tai vastaava.

EDIT2: Ja pari kohtaa sulla on ihan väärällä syntaksilla. "PositionObject ukko\obj," ??? mitäs tuon koodinrivin clientin puolella pitäisi tehdä? Ja palvelimen puolella oli SendIds()-funktiossa "_Net_InitMemBlock", kun tarkoitit varmaankin kutsua funktiota, eli "_Net_InitMemBlock()". Myös clientin puolella olit kirjoittanut "_NetInitMemBlock()". Myös ongelmana "If infobyte=INFO_SENDING_COORDS()" kun tarkoitit varmaan "If infobyte=INFO_SENDING_COORDS". Sekä sinulla oli client-puolella Rand()-funktiossa liian suuri luku ja se aiheutti overflown CB:n kääntäjässä. Poistin parit nollat perästä ja se kääntyy viimeinkin.

Testaisit edes että koodisi kääntyy kun laitat sen tänne...

EDIT3: Huhhuh, että pistät sitten auttajat vielä fiksaamaan koodisi käyttämään oletusmediaa, koska et jaksanut omaa koodiasi muuttaa / jakaa kuvatiedostoja...

EDIT4: Koodisi on sen verran kommentoimatonta ja epäselvästi rakennettua (et hoida nettiliikennettä samalla tavalla kuin chattiesimerkissä tai NetMatchissa), en ehkä jaksa auttaa. Sain koodit kääntymään ja toimimaan, mutta kun client yhdisti palvelimelle, kaatui homma MAViin. Tässä minun muokkaamani koodinpätkät:

Code: Select all

//server.cb
Include "cbNetwork.cb"
Dim rtn As integer

Type CLIENTS
    Field id
    Field obj
    Field status As Byte
End Type

masterukko=LoadObject("Media\ukkeli.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248

If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."
ChDir "clients"
InitServer(1234,1000)
LoadClients()
Repeat
    SendClients()
    SendIds()
    rtn = ServerRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
   
    If infobyte=INFO_STARTING_CONNECTION Then
        tempid=_Net_GetInt()                  //otetaan talteen ID
        tempidstr=Str(tempid)                 //tehdään siitä merkkijono
        ChDir "clients"                       //työkansio: clients
       
        StartSearch                           //etsitään vastaavuuksia
            Repeat
                currentfile$=FindFile()       //otetaan talteen nyk. tiedosto
                If currentfile=tempidstr Then //Löytyi!
                EndIf
               
                If currentfile="" Then        //ei löytynyt.
                    newclient(tempid)
                EndIf
            Forever
        EndSearch
    EndIf
   
    If infobyte=INFO_MOVING Then sendstuff()
       
Forever

Function LoadClients()
    StartSearch
        Repeat
            file$=FindFile()
            If file="" Then Exit
           
            If Not IsDirectory(file) Then
                f=OpenToRead(file)
                    client.CLIENTS = New(CLIENTS)
                    client\id=Int(file)
                    client\obj=CloneObject(masterukko)
                    PositionObject client\obj,ReadInt(f),ReadInt(f)
                    RotateObject client\obj,ReadInt(f)
                CloseFile f
            EndIf
           
        Forever
    EndSearch
End Function

Function newclient(ident)
    client.CLIENTS = New(CLIENTS)
    client\id=ident
    client\status=True
    client\obj=CloneObject(masterukko)
    f=OpenToWrite(Str(client\id))
        WriteInt f,ObjectX(client\obj)
        WriteInt f,ObjectY(client\obj)
        WriteInt f,ObjectAngle(client\obj)
    CloseFile f
End Function

Function sendstuff()
    id=_Net_GetInt()
    For client.CLIENTS = Each CLIENTS
        If client\id=id Then
            MoveObject client\obj,_Net_GetByte()
            TurnObject client\obj,_Net_GetByte()
            _Net_InitMemBlock()
            _Net_PutByte(INFO_SENDING_COORDS)
            _Net_PutInt(client\id)
            _Net_PutInt(ObjectX(client\obj))
            _Net_PutInt(ObjectY(client\obj))
            _Net_PutInt(ObjectAngle(client\obj))
            f=OpenToWrite(Str(client\id))
                WriteInt f,ObjectX(client\obj)
                WriteInt f,ObjectY(client\obj)
                WriteInt f,ObjectAngle(client\obj)
            CloseFile f
        EndIf
    Next client
    ServerSend()
End Function

Function SendClients()
    For client.CLIENTS = Each CLIENTS
        count=count+1
    Next client
    _Net_InitMemBlock()
    _Net_PutByte(INFO_NUM_OF_CLIENTS)
    ServerSend()
End Function

Function SendIds()
    _Net_InitMemBlock()
    _Net_PutByte(INFO_SENDING_IDS)
    For client.CLIENTS = Each CLIENTS
        _Net_PutInt(client\id)
    Next client
    ServerSend()
End Function 

Code: Select all

//client.cb
Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248
Type UKOT
    Field obj
    Field id
End Type
Dim cli(27)
FrameLimit 40 'rajoita pelin toimintanopeutta
ukko = LoadObject("Media\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
    file$=FindFile()
    If file="" Then
        f=OpenToWrite("id")
        id=Rand(1,100000000)
        WriteInt f,id
        CloseFile f
    ElseIf Not IsDirectory(file) Then
        f=OpenToRead("id")
        id=ReadInt(f)
        CloseFile f
    EndIf
EndSearch
ClsColor cbWhite
masterukko=LoadObject("..\Media\ukkeli.bmp")
InitClient("localhost",1234,1000)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSend()
Repeat
    rtn = ClientRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
   
    If infobyte=INFO_NUM_OF_CLIENTS Then
        numoc=_Net_GetInt()
        For i=1 To numoc
            iUkko.UKOT=New(UKOT)
            iUkko\obj=CloneObject(masterukko)
        Next i
    EndIf
   
    If infobyte=INFO_SENDING_IDS Then
        For iUkko.UKOT = Each UKOT
            count=count+1
            tempid=_Net_GetInt()
            If iUkko\id=0 Then iUkko\id=tempid
            cli(count)=tempid
        Next iUkko
        count=0
    EndIf
       
    If infobyte=INFO_SENDING_COORDS Then
        For iUkko.UKOT = Each UKOT
       
            id2=_Net_GetInt()
           
            If id2=id Then
                PositionObject iUkko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject iUkko\obj,_Net_GetInt()
                CloneCameraPosition iUkko\obj
            Else
                PositionObject iUkko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject iUkko\obj,_net_GetInt()
            EndIf
           
            'PositionObject iUkko\obj,
        Next iUkko
    EndIf
   
    If LeftKey() Then turnplus=5
    If RightKey() Then turnplus=-5   
   
    If UpKey() Then moveplus=2
    If DownKey() Then moveplus=-2
    _Net_InitMemBlock()
    _Net_PutByte(INFO_MOVING)
    _Net_PutInt(id)
    _Net_PutByte(moveplus)
    _Net_PutByte(turnplus)
    ClientSend()
   
   
    DrawScreen

Forever 
EDIT5: Palvelimen puolella vaihdat kansiota repeat-silmukassa If-lausekkeen sisällä mutta et vaihda takaisin yläkansioon. Näin palvelin ajautuu jossain vaiheessa yrittämään väärään kansioon.

Code: Select all

    If infobyte=INFO_STARTING_CONNECTION Then
        tempid=_Net_GetInt()                  //otetaan talteen ID
        tempidstr=Str(tempid)                 //tehdään siitä merkkijono
        ChDir "clients"                       //työkansio: clients
       
        StartSearch                           //etsitään vastaavuuksia
            Repeat
                currentfile$=FindFile()       //otetaan talteen nyk. tiedosto
                If currentfile=tempidstr Then //Löytyi!
                EndIf
               
                If currentfile="" Then        //ei löytynyt.
                    newclient(tempid)
                EndIf
            Forever
        EndSearch
    EndIf 
EDIT6: Kun korjasin tuon edellisen kohdan lisäämällä EndSearchin jälkeen rivin ChDir "..", toimi palvelin MAVittamatta. Mutta client lagaa armottomasti ja syy johtuu ClientSend:n jatkuvasta aikakatkaisusta (timeoutista).

EDIT7: Lähetä aina jonkinmoinen lopetustavu clientin ja palvelimen puolella, kun dataa ei enää tule. Näin palvelin/client tietää lopettaa lukemisen oikeassa kohdassa.

EDIT8: Et voi tietää, onko clientin ja palvelimen puolella sama määrä tyypin jäseniä varmasti. Lähetä palvelimen puolella ensin tulevien ukkojen ID:den määrä ja sen jälkeen lue dataa vastaavasti.

Code: Select all

    If infobyte=INFO_SENDING_IDS Then
        For iUkko.UKOT = Each UKOT
            count=count+1
            tempid=_Net_GetInt()
            If iUkko\id=0 Then iUkko\id=tempid
            cli(count)=tempid
        Next iUkko
        count=0
    EndIf
EDIT9: Liikaa virheitä. Järjestä clientin ja palvelimen puolella nettiliikenne selkeästi lähetykseen ja lukemiseen. Käytä clientin puolella mielummin ClientSendBack-funktiota, niin pelisi ei lagaa vaikka nettiyhteys on hidas. Ota mallia chattiesimerkistä ja NetMatchista. Minä en enää jaksa yrittää auttaa.

Re: CoolBasic & netti = cbNetwork

Posted: Sat Oct 15, 2011 3:31 pm
by naputtelija
VesQ wrote:Koodissa kommentointi ei olisi pahitteeksi...

Ainakin se on ongelmana clientin puolella, että annat heti aluksi InitClient-funktiolle väärän osoitteen. Ei ole olemassa sellaista osoitetta kuin "local" mutta "localhost" on.

EDIT: Lataat clientin puolella muuttujaan "ukko" objektin, mutta yrität käyttää syntaksia "ukko.UKOT = New(UKOT)" ja kääntäjä herjaa. Käytä jotain muuta nimeä tyypin instansseille kuin "ukko", esim. "iUkko.UKOT" tai vastaava.

EDIT2: Ja pari kohtaa sulla on ihan väärällä syntaksilla. "PositionObject ukko\obj," ??? mitäs tuon koodinrivin clientin puolella pitäisi tehdä? Ja palvelimen puolella oli SendIds()-funktiossa "_Net_InitMemBlock", kun tarkoitit varmaankin kutsua funktiota, eli "_Net_InitMemBlock()". Myös clientin puolella olit kirjoittanut "_NetInitMemBlock()". Myös ongelmana "If infobyte=INFO_SENDING_COORDS()" kun tarkoitit varmaan "If infobyte=INFO_SENDING_COORDS". Sekä sinulla oli client-puolella Rand()-funktiossa liian suuri luku ja se aiheutti overflown CB:n kääntäjässä. Poistin parit nollat perästä ja se kääntyy viimeinkin.

Testaisit edes että koodisi kääntyy kun laitat sen tänne...

EDIT3: Huhhuh, että pistät sitten auttajat vielä fiksaamaan koodisi käyttämään oletusmediaa, koska et jaksanut omaa koodiasi muuttaa / jakaa kuvatiedostoja...

EDIT4: Koodisi on sen verran kommentoimatonta ja epäselvästi rakennettua (et hoida nettiliikennettä samalla tavalla kuin chattiesimerkissä tai NetMatchissa), en ehkä jaksa auttaa. Sain koodit kääntymään ja toimimaan, mutta kun client yhdisti palvelimelle, kaatui homma MAViin. Tässä minun muokkaamani koodinpätkät:

Code: Select all

koodia 
EDIT5: Palvelimen puolella vaihdat kansiota repeat-silmukassa If-lausekkeen sisällä mutta et vaihda takaisin yläkansioon. Näin palvelin ajautuu jossain vaiheessa yrittämään väärään kansioon.

Code: Select all

    If infobyte=INFO_STARTING_CONNECTION Then
        tempid=_Net_GetInt()                  //otetaan talteen ID
        tempidstr=Str(tempid)                 //tehdään siitä merkkijono
        ChDir "clients"                       //työkansio: clients
       
        StartSearch                           //etsitään vastaavuuksia
            Repeat
                currentfile$=FindFile()       //otetaan talteen nyk. tiedosto
                If currentfile=tempidstr Then //Löytyi!
                EndIf
               
                If currentfile="" Then        //ei löytynyt.
                    newclient(tempid)
                EndIf
            Forever
        EndSearch
    EndIf 
EDIT6: Kun korjasin tuon edellisen kohdan lisäämällä EndSearchin jälkeen rivin ChDir "..", toimi palvelin MAVittamatta. Mutta client lagaa armottomasti ja syy johtuu ClientSend:n jatkuvasta aikakatkaisusta (timeoutista).

EDIT7: Lähetä aina jonkinmoinen lopetustavu clientin ja palvelimen puolella, kun dataa ei enää tule. Näin palvelin/client tietää lopettaa lukemisen oikeassa kohdassa.

EDIT8: Et voi tietää, onko clientin ja palvelimen puolella sama määrä tyypin jäseniä varmasti. Lähetä palvelimen puolella ensin tulevien ukkojen ID:den määrä ja sen jälkeen lue dataa vastaavasti.

Code: Select all

    If infobyte=INFO_SENDING_IDS Then
        For iUkko.UKOT = Each UKOT
            count=count+1
            tempid=_Net_GetInt()
            If iUkko\id=0 Then iUkko\id=tempid
            cli(count)=tempid
        Next iUkko
        count=0
    EndIf
EDIT9: Liikaa virheitä. Järjestä clientin ja palvelimen puolella nettiliikenne selkeästi lähetykseen ja lukemiseen. Käytä clientin puolella mielummin ClientSendBack-funktiota, niin pelisi ei lagaa vaikka nettiyhteys on hidas. Ota mallia chattiesimerkistä ja NetMatchista. Minä en enää jaksa yrittää auttaa.
Nuo on korjattu, kiitos ohjeista!
EDIT:

servu ei vastaa. apua?
client:

Code: Select all

Include "cbNetwork.cb"
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248
Type UKOT
    Field obj
    Field id
End Type
Dim cli (27)
FrameLimit 40 'rajoita pelin toimintanopeutta
masterukko = LoadObject("localdata\guy.bmp", 72)
If Not FileExists("localdata") Then MakeDir "localdata"
If Not FileExists("localdata") Then MakeError "creating localdata-folder failed."
ChDir "localdata"
StartSearch
    Repeat
    file$=FindFile()
    If file<>"id" Then
        f=OpenToWrite("id")
        id=Rand(1,2147483647)
        WriteInt f,id
        CloseFile f
        Exit
    EndIf
    If file="id" And file<>"guy.bmp" Then
        f=OpenToRead("id")
        id=ReadInt(f)
        CloseFile f
        Exit
    EndIf
    Forever
EndSearch
ClsColor cbWhite
Color cbBlack
InitClient("localhost",1234)
_Net_InitMemBlock()
_Net_PutByte(INFO_STARTING_CONNECTION)
_Net_PutByte(id)
ClientSendBack()
Repeat
    rtn = ClientRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
    
    If infobyte=INFO_NUM_OF_CLIENTS Then
        numoc=_Net_GetInt()
        For i=1 To numoc
            ukko.UKOT=New(UKOT)
            ukko\obj=CloneObject(masterukko)
        Next i
    EndIf
    
    If infobyte=INFO_SENDING_IDS Then
        For ukko.UKOT = Each UKOT
            count=count+1
            tempid=_Net_GetInt()
            If ukko\id=0 Then ukko\id=tempid
            cli(count)=tempid
        Next ukko
        count=0
    EndIf
        
    If infobyte=INFO_SENDING_COORDS Then
        For ukko.UKOT = Each UKOT
        
            id2=_Net_GetInt()
            
            If id2=id Then
                PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject ukko\obj,_Net_GetInt()
                CloneCameraPosition ukko\obj
            Else
                PositionObject ukko\obj,_Net_GetInt(),_Net_GetInt()
                RotateObject ukko\obj,_net_GetInt()
            EndIf
        Next ukko
    EndIf
    
    If LeftKey() Then turnplus=5
    If RightKey() Then turnplus=-5   
    
    If UpKey() Then moveplus=2
    If DownKey() Then moveplus=-2
    _Net_InitMemBlock()
    _Net_PutByte(INFO_MOVING)
    _Net_PutInt(id)
    _Net_PutByte(moveplus)
    _Net_PutByte(turnplus)
    ClientSendBack()
    If KeyDown(cbKeyEsc) Then shutdown()
    Text 0,0,FPS()
    Text 0,20,infobyte
    DrawScreen

Forever

Function shutdown()
    For ukko.UKOT=Each UKOT
        DeleteObject ukko\obj
        Delete ukko
    Next ukko
    End
End Function 
server:

Code: Select all

Include "cbNetwork.cb"
Dim rtn As integer

Type CLIENTS
    Field id
    Field obj
    Field status As Byte
End Type
SAFEEXIT OFF 
masterukko=LoadObject("clients/masterukko.bmp",360)
Const INFO_STARTING_CONNECTION = 255
Const INFO_CLOSING_CONNECTION  = 254
Const INFO_GET_PLAYERLIST      = 253
Const INFO_MOVING              = 252
Const INFO_GIVE_ID             = 251
Const INFO_NUM_OF_CLIENTS      = 250
Const INFO_SENDING_COORDS      = 249
Const INFO_SENDING_IDS         = 248

If Not FileExists("clients") Then MakeDir "clients"
If Not FileExists("clients") Then MakeError "creating clients-folder failed."


InitServer(1234)
LoadClients()
Repeat
    SendClients()
    SendIds()
    rtn = ServerRead()
    If rtn = 0 Then
        _Net_GetInt()
        infoByte = _Net_GetByte()
    EndIf
    
    If infobyte=INFO_STARTING_CONNECTION Then
        tempid=_Net_GetInt()                  //otetaan talteen ID
        tempidstr=Str(tempid)                 //tehdään siitä merkkijono                     //työkansio: clients
        ChDir "clients"
        StartSearch                           //etsitään vastaavuuksia
            Repeat
                currentfile$=FindFile()       //otetaan talteen nyk. tiedosto
                If currentfile=tempidstr Then //Löytyi!
                EndIf
                
                If currentfile="" Then        //ei löytynyt.
                    newclient(tempid)
                EndIf
            Forever
        EndSearch
        ChDir ".."
    EndIf
    
    If infobyte=INFO_MOVING Then sendstuff()
    If KeyDown (cbKeyEsc) Then shutdown()
    Text 0,0,FPS()
    DrawScreen
Forever

Function LoadClients()
    StartSearch
        Repeat
            file$=FindFile()
            If file="" Then Exit
            If file="masterukko.bmp" Then Goto ignore
            
            f=OpenToRead(file)
                client.CLIENTS = New(CLIENTS)
                client\id=Int(file)
                client\obj=CloneObject(masterukko)
                PositionObject client\obj,ReadInt(f),ReadInt(f)
                RotateObject client\obj,ReadInt(f)
            CloseFile f
            ignore:
        Forever
    EndSearch
End Function

Function newclient(ident)
    client.CLIENTS = New(CLIENTS)
    client\id=ident
    client\status=True
    client\obj=CloneObject(masterukko)
    f=OpenToWrite(Str(client\id))
        WriteInt f,ObjectX(client\obj)
        WriteInt f,ObjectY(client\obj)
        WriteInt f,ObjectAngle(client\obj)
    CloseFile f
End Function

Function sendstuff()
    id=_Net_GetInt()
    For client.CLIENTS = Each CLIENTS
        If client\id=id Then
            MoveObject client\obj,_Net_GetByte()
            TurnObject client\obj,_Net_GetByte()
            _Net_InitMemBlock()
            _Net_PutByte(INFO_SENDING_COORDS)
            _Net_PutInt(client\id)
            _Net_PutInt(ObjectX(client\obj))
            _Net_PutInt(ObjectY(client\obj))
            _Net_PutInt(ObjectAngle(client\obj))
            f=OpenToWrite(Str(client\id))
                WriteInt f,ObjectX(client\obj)
                WriteInt f,ObjectY(client\obj)
                WriteInt f,ObjectAngle(client\obj)
            CloseFile f
        EndIf
    Next client
    ServerSend()
End Function

Function SendClients()
    For client.CLIENTS = Each CLIENTS
        count=count+1
    Next client
    _Net_InitMemBlock()
    _Net_PutByte(INFO_NUM_OF_CLIENTS)
    ServerSend()
End Function

Function SendIds()
    _Net_InitMemBlock()
    _Net_PutByte(INFO_SENDING_IDS)
    For client.CLIENTS = Each CLIENTS
        _Net_PutInt(client\id)
    Next client
    ServerSend()
End Function 

Function shutdown()
    For client.CLIENTS=Each CLIENTS
        DeleteObject client\obj
        Delete client
    Next client
    CloseServer()
    End
End Function

[/edit]

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 5:00 pm
by Konstaduck
Miten saisin palvelimen vastaamaan cbNetworkin lähettämään toplistapyyntöön? Pitäisikö se toteuttaa JavaScriptilla/HTML:llä? Nyt ollaan pelissä jo siinä vaiheessa, että pitäisi saada palvelimelta TOP 5 - listat...

Kiitän jo valmiiksi kaikkia, ketkä vain tuhlaavat kallista aikaansa ja auttavat minua :lol:

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 5:08 pm
by temu92
Lähetät web-palvelimelle HTTP-kutsun (kts. Wikipedia), en muista tukiko cbNetwork niitä jo muutenkin. Palvelin vastaa automaattisesti kutsuun.

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 5:29 pm
by Timblex
Teet php:llä ojelman joka tulostaa nettisivulle top 5 listan ja sen jälkeen cb koodiisi:

Code: Select all

httpget(osoite$)
httpsavecontent("toplista.txt")
toplist=opentoread("toplista.txt")

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 5:44 pm
by valscion
http://www.cbrepository.com/codes/code/34/

Siinä on sinulle toimiva funktio, joka hakee netistä joltain sivulta tekstiä ja palauttaa sen merkkijonona.

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 8:16 pm
by Konstaduck
timpe99 wrote:Teet php:llä ojelman joka tulostaa nettisivulle top 5 listan ja sen jälkeen cb koodiisi:

Code: Select all

httpget(osoite$)
httpsavecontent("toplista.txt")
toplist=opentoread("toplista.txt")
Voihh, pitäisi ruveta sitä PHP:ta(kin) opettelemaan. Nyt juuri on kyllä JavaScript kesken, miten tässä kerkeekään revetä joka suuntaan...?
VesQ wrote:http://www.cbrepository.com/codes/code/34/

Siinä on sinulle toimiva funktio, joka hakee netistä joltain sivulta tekstiä ja palauttaa sen merkkijonona.
Tuollahan saa kätevästi arvot talteen sivuilta, vaan miten tallennettua? :o

Re: CoolBasic & netti = cbNetwork

Posted: Mon Apr 02, 2012 10:34 pm
by valscion

Re: CoolBasic & netti = cbNetwork

Posted: Tue Apr 03, 2012 5:28 pm
by Konstaduck
Mutta jos haluaisin tuon toplistan vaikka omille sivuilleni?
Onhan NetMatchiin:kin nuo serverilistaukset säädetty, ja palvelin vastaa niihin. Miten?

Onko CB:hen funktiot nettisivulle kirjoittelua varten?

Re: CoolBasic & netti = cbNetwork

Posted: Tue Apr 03, 2012 5:37 pm
by Viltzu
Konstaduck wrote:
Mutta jos haluaisin tuon toplistan vaikka omille sivuilleni?
Onhan NetMatchiin:kin nuo serverilistaukset säädetty, ja palvelin vastaa niihin. Miten?

Onko CB:hen funktiot nettisivulle kirjoittelua varten?
CB tekee http kutsun (esim. "http://viltzu.in/index.php?nick=moi&pisteet=1000"), teet PHP:llä (esimerkiksi) että ottaa arvot $_GET:llä (php:ssä) ja tallentelee ja sit sivu joka lataa ja näyttää tulokset. Enempää en jaksa kirjuutella. PHP:llä onnistuu kivasti $_GET:llä.
Vähän topiikkia selaamalla (KLIK THIS) ja voinet lukea myös miten lähetät melko turvallisesti tiedot top listaan

Re: CoolBasic & netti = cbNetwork

Posted: Tue Apr 03, 2012 5:42 pm
by valscion
Konstaduck wrote:Onhan NetMatchiin:kin nuo serverilistaukset säädetty, ja palvelin vastaa niihin. Miten?
https://github.com/VesQ/NetMatch/blob/m ... eg/gss.php

Re: CoolBasic & netti = cbNetwork

Posted: Wed Apr 04, 2012 11:10 pm
by tuhoojabotti
VesQ wrote:
Konstaduck wrote:Onhan NetMatchiin:kin nuo serverilistaukset säädetty, ja palvelin vastaa niihin. Miten?
https://github.com/VesQ/NetMatch/blob/m ... eg/gss.php
Tai https://github.com/VesQ/node-NetMatch/b ... gss/GSS.js ;-)

Re: CoolBasic & netti = cbNetwork

Posted: Thu Apr 05, 2012 3:28 pm
by Konstaduck
Viltzu wrote: CB tekee http kutsun (esim. "http://viltzu.in/index.php?nick=moi&pisteet=1000"), teet PHP:llä (esimerkiksi) että ottaa arvot $_GET:llä (php:ssä) ja tallentelee ja sit sivu joka lataa ja näyttää tulokset. Enempää en jaksa kirjuutella. PHP:llä onnistuu kivasti $_GET:llä.
Vähän topiikkia selaamalla (KLIK THIS) ja voinet lukea myös miten lähetät melko turvallisesti tiedot top listaan
Noniin, alanpas säätäämään tuon PHP:n ja cbNetworkin kanssa. Jospa saisinkin sen toimimaan :D

Re: CoolBasic & netti = cbNetwork

Posted: Sun May 06, 2012 5:57 pm
by VerkkoGuru
Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!

Re: CoolBasic & netti = cbNetwork

Posted: Sun May 06, 2012 9:28 pm
by Konstaduck
VerkkoGuru wrote:Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!
Sulta puuttuu sieltä samasta kansiosta cbNetwork.dll... ;)
EDIT:

Tai se cbNetork.dll on väärä versio sen cbNetwork.cb:n kanssa


Re: CoolBasic & netti = cbNetwork

Posted: Mon May 07, 2012 3:48 pm
by VerkkoGuru
Konstaduck wrote:
VerkkoGuru wrote:Kokeilin tuota Valtzun tutossa olevaa esimerkkiä, joka lataa sivun yle.fi/mobiiliuutiset ja sitten avaa sen selaimeen, valitti tällaista:Incorrect Library version(Cbnetwork.dll)!
Sulta puuttuu sieltä samasta kansiosta cbNetwork.dll... ;)
EDIT:

Tai se cbNetork.dll on väärä versio sen cbNetwork.cb:n kanssa

Kyllä se dll:kin sieltä löytyy. Voi olla, että on väärä versio :l

Re: CoolBasic & netti = cbNetwork

Posted: Mon May 07, 2012 3:55 pm
by valscion
Enpä usko että on väärä versio. Koitappa niin että lähdekoodi/exe ja DLL on samassa kansiossa, josko virhe korjaantuisi. DLL:ää ei tainnut saada ladattua, jos se sijaitsee alikansioissa.