Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Winsock

Sivun loppuun

Jamma [30.03.2005 18:40:00]

#

Termos
Sellasen asian kanssa olen tässä pähkäilly jo jonkin aikaa kun kun Winsockin avulla lähetetään tekstiä toiselle clientille (Winsock1.SendData ) niin miten pystyn samalla lähetyksellä lähettämään tiedot nimi, teksti niin että vastaanottopäässä ne osataan erottaa toisistaan. Nyt siis vastaanotto tapahtuu näin (Soodan exampleista modattu http://sooda.dy.fi:8080/~sooda/foo/ceedee/ ):

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
    Dim kaikki As String
    ws.GetData kaikki
    taulu = Split(kaikki, KOMMAND_Loppu)
    For i = 0 To UBound(taulu)
        tieto = taulu(i)
        If tieto = SEND_TEXT Then
           nimi, teksti...
        End If
        DoEvents
    Next
End Sub

Vaikea selittää, mutta toivottavasti joku saa selkoa

gceppoo [30.03.2005 19:34:46]

#

Erottamalla tietokentät toisistaan jollain merkillä, vaikkapa ;.
Ja sitten Split:ssa määritellään erottimeksi tuo ";".
Kokeile tätä niin huomaat miten se menee:

Dim kaikki As String
kaikki = "visuaali;pasikki"
taulu = Split(kaikki, ";")
For i = 0 To UBound(taulu)
    tieto = taulu(i)
    If tieto = SEND_TEXT Then
       'nimi, teksti...
    End If
    DoEvents
Next
Print "nimi: " & taulu(0)
Print "teksti: " & taulu(1)

nomic [30.03.2005 22:25:27]

#

miksi ei käytetä tietueita?

type datapaketti
  nimi as string
  teksti as string
  tiedot as string
end type

dim teksti as datapaketti

teksti.nimi = "joku123"
teksti.teksti = "moikka!"
teksti.tiedot = "normi teksti"

Ja sitten kun lähetetään, lähetetään toi teksti-juttu. Toisessa päässä sitten vastaanotetaan:

data "teksti" vastaanotettu, tässä tapauksessa:

If teksti.tiedot = "normi teksti" then
  chattiteksti.text = chattiteksti.text & vbcrlf & teksti.nimi & ": " & teksti.teksti
Endif

sooda [31.03.2005 08:23:21]

#

Tietääkseni winsockilla ei voi lähettää tietueita.

esakom [31.03.2005 10:11:45]

#

Tietääkseni voi, mutta joutuu kikkailemaan. Muistelisin että olisin joskus laittanut binäärinä yli ja sitten kopsannut copymemory-apilla tietue-rakenteeseen. Mahdolliset stringit piti muistaakseni olla kiinteän mittaisia... Helpointa on kyllä pistää kaikki samaan stringiin, kuten aikaisemmin ehdotettiin.

Antti [31.03.2005 10:50:25]

#

Hmmm... tietue ei ole muuta kuin datajono siinä missä mikä tahansa. Kyllä Winsockilla voi tietueen lähettää.

Helpointa on kyllä käyttää MSXML:ää. Muutat tietueen XML:ksi - heität yli ja muutat takaisin recordsetiksi...

esakom [31.03.2005 11:28:46]

#

Onkohan se tietueen muuttaminen XML:ksi miten helppoa vb6:ssa, eikö sen joudu kuitenkin tekemään kenttä kerrallaan? .NET:ssähän tuki löytyy suoraan.

Antti [31.03.2005 11:40:25]

#

Katsoppa MSXML-dokumentaatio. Myös ADO 2.8 tukee recordsetin lukemista suoraan XML:ksi:

Dim DataConn As New ADODB.Connection
Dim ADOCmd As New ADODB.Command
Dim strXML as String
Dim rstXML As New ADODB.Recordset
Dim astStream As New ADODB.Stream

DataConn .ConnectionString = "...MyConnectionString..."
DataConn.Open
ADOCmd.ActiveConnection = DataConn
ADOCmd.CommandType = adCmdText
ADOCmd.CommandText = "Select * from MyTable"
Set ADOCmd.ActiveConnection = DataConn

Set astStream = New ADODB.Stream
Set rstXML = ADOCmd.Execute

If rstXML.EOF = False Then
    rstXML.Save astStream, adPersistXML
    strXML = astStream.ReadText(adReadAll)
Else
    strXML = ""
End If

esakom [31.03.2005 11:58:01]

#

tottakai recordsetistä, mutta puhe kai oli (ainakin alunperin) UDT-tietueista?

Antti [31.03.2005 12:29:32]

#

No jos nyt tarkkoja ollaan - kyse taisi olla tekstijonosta, jossa arvot oli eroteltu esim. puolipisteellä.

No mikäs ongelma sitä nyt tekstijonoa kaikenkaikkiaan on lähettää??? Ei sitä tarvitse pilkkoa eikä muutenkaan muuttaa miksikään.

Ratkaisu kysymykseen on ymmärtääkseni jo gceppoon vastauksessa.

Tietuetta siirrettäessä yleensä oletetaan sen olevan tietuemuotoinen - oli sitten tietue tuotettu tietokannasta tai ei. Recordsetin voi luoda myös muistin varaisesti, sijoittaa datan siihen ja muuttaa se XML:ksi (ks. edellinen vastaus: rstXML.Save astStream, adPersistXML).

Tällä tavoin saadaan aikaan DTD, joka itsessään sisältää tiedon jokaisesta sarakkeesta ja niiden tietotyypistä. Tieto on helposti jaettavissa ja tallennettavissa haluttuun muotoon.

tesmu [31.03.2005 20:54:06]

#

Mid ja instr lauseetkin ovat käteviä tässä tapauksessa esim

if mid(data,1,4)="msg " then msgbox mid(data,4)

Sivun alkuun

Vastaus

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

Tietoa sivustosta