Terve
Jatkoin projektiani taas sairasloman jälkeen, ja nyt saan virhettä:
ValueError: invalid literal for int() with base 10: '\\x00\\x00\\x00\\x00... (jne)'
Koitan lähettää numeroita, mutta Python 3. versiossa datan pitää olla bitteinä tai bufferina (Häh?). Kun muutan numeroarvon (Nyt 255) biteiks, saan yllä olevan mössön tulokseksi. Miten voin lähettää numeroita sokketeilla?
Jos lähettäisit koodisi, olisi vähän helpompi selvittää ongelmaa, tuosta tulosteesta kun ei paljoa näe.
No ei siinä muuta ole, kuin socket.send(bytes(255)). Asiakas vastaanottaa sen socket.recv(1024).
Muistahan nyt ensiksi, että bitti (bit) on aivan eri asia kuin tavu (byte). Katso vaikka Wikipediasta, jos et vielä tiedä.
Nyt koodisi lähettää tyhjän, 255 tavua pitkän taulukollisen tavuja. Oikea tapa tekstin lähettämiseen olisi tehdä ensin se teksti ja enkoodata se sitten tavuiksi, kuten oppaassa Pythonin merkistöistä kerrotaan. Kannattaa lukea koko opas, huomaa myös lisäys Python 3:sta.
Joo, noi menee sillon tällön sekasin, bitit ja tavut nimittäin. Nyt data lähtee. Mutta, miten voisin lukea dataa vain sen verran kuin sitä tulee? Jos lopetusmerkki on vaikka |, niin miten siihen asti voi lukea dataa? Nyt tulee päällekkäisyyksiä, kuten toisessa aiheessa sanoin.
Eli siis luetaan aina yksi merkki lisää, kunnes tulee |.
Vaihtoehtoja on kaksi: joko voit kirjata datan alkuun, miten pitkä pala tulee, tai voit lukea tavu kerrallaan ja lisätä saadun datan aina vanhan perään, kunnes löytyy lopetuskohta. TCP-yhteyden kohdalla suosittelen tavoista ensimmäistä. Pituusilmoituksen on tietenkin parasta olla vakiomittainen, esimerkiksi alle 256 tavun paketeille yksi tavu riittää kertomaan pituuden.
Metabolixin mainitsemista tavoista toisen kerroin jo aiemmin toisessa viestiketjussa.
Jos lähetät merkkijonoja (esim. chat-ohjelma), niin tavu kerrallaan lukeminen on ihan ok ja merkkijonon lopetusmerkkinä kannattaa käyttää CRLF:ää tai pelkkää LF:ää. Muuhun siirtoon Metabolixin mainitsema tapa 1 on yleensä parempi vaihtoehto.
Koitin tätä, mutta ei toiminut.
maara = 1 while True: data = asiakas.recv(maara) data = data.replace("b\'", "") # Koska bytes() lisää tommoiset data = data.replace("\'", "") # Koska bytes() lisää tommoiset if data: if data[maara] != "|": maara = maara + 1 else: print(data) break
Esimerkiksi datalla b'AskingCurrentVolume|'
se jää vain pyörimään tuohon while silmukkaan, kun ei löydy tuota | -merkkiä. Vai, palauttaako data[maara] kaikki merkit maara-kohtaan asti?
Macro kirjoitti:
Koska bytes() lisää tommoiset
Bytes ei suinkaan lisää mitään, vaan bytes-muotoista dataa ruudulle tulostettaessa siihen lisätään tuollaiset, aivan kuten pitkiin lukuihin lisätään loppuun L-kirjain.
Jos nyt vähän mietit koodiasi, niin eihän tuossa ole mitään järkeä. Haet ensin yhden tavun, sitten seuraavat kaksi tavua, sitten seuraavat kolme tavua ja niin edelleen. Jos siirrettävä data on vaikka "abcdefg|", ensimmäisellä kierroksella saat tavut "a", toisella kierroksella "bc", kolmannella "def" ja niin edelleen.
Onko tosiaan niin vaikea lukea kirjaimellisesti, mitä on neuvottu? "Voit lukea tavu kerrallaan ja lisätä saadun datan aina vanhan perään, kunnes löytyy lopetuskohta."
data = b'' lopetus = b'|' while True: tavu = asiakas.recv(1) if tavu == lopetus: break else: data = data + tavu
Katsopas tuota silmukkaasi hiukan tarkemmin ajatuksella: miksi vastaanotat aina maara verran tavuja? Pitäisiköhän aina vastaanottaa yksi tavu eikä maara verran tavuja? Pitäisikö maara muuttujaa käyttää vain viimeisen alkion indeksin laskurina? ...
Joohei, joskus se lukeminen onkin vaikeaa. :D Joo, mutta kiitos. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.