Seite 1 von 1
String in Bytes?
Verfasst: Sonntag 19. Mai 2013, 11:14
von SemperPython
In einer PDF-Datei namens "Netzkommunikation" fand ich 2 Scripte, besser gesagt 2 Socket Scripte.Der Server sollte Strings empfangen und die Zeichenfolge alphabetisch sortieren.Leider kommt dabei eine Fehlermeldung raus:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Users\User\Desktop\Sort_Client.py", line 9, in <module>
clientsocket.send("Hello Server")
TypeError: 'str' does not support the buffer interface
Sort_Client.py:
Code: Alles auswählen
from socket import *
serverHostName = '127.0.0.1'
serverPort = 5007
clientsocket = socket(AF_INET, SOCK_STREAM)
clientsocket.connect((serverHostName, serverPort))
clientsocket.send("Hello Server")
data = clientsocket.recv(1024)
print("Client received:", data)
clientsocket.send("How are you")
data = clientsocket.recv(1024)
print("Client received:", data)
clientsocket.close()
input()
Sort_Server.py:
Code: Alles auswählen
from socket import *
myHostName = ''
myPort = 5007
def answer(s):
l = list(s.upper())
l.sort()
return "".join(l)
mainsocket = socket(AF_INET, SOCK_STREAM)
mainsocket.bind((myHostName, myPort))
mainsocket.listen(1)
while 1:
connection,address = mainsocket.accept()
print("Server connected by", address)
while 1:
data = connection.recv(1024)
if not data: break
print("received:",data)
connection.send(answer(data))
connection.close()
Ich kann leider das Problem leider nicht erkennen.Anscheinend ist ein Datentyp falsch, wie muss ich ihn aber verändern, sodass die Scripte funktionieren?Soll ich den String etwa in Bytes umwandeln?
Anmerkung: Die Scripte waren eigentlich für eine ältere Version gedacht.Ich benutzte 2to3.py um sie in die neue Version umzuwandeln.
Re: String in Bytes?
Verfasst: Sonntag 19. Mai 2013, 11:19
von Sirius3
@SemperPython: Du hast doch das Problem in Deiner Überschrift korrekt umschrieben. »send« kann nur Bytes und keine Strings senden. Schau Dir mal »str.encode« und »byte.decode« an.
Re: String in Bytes?
Verfasst: Sonntag 19. Mai 2013, 12:39
von SemperPython
Die jeweiligen Scripte sehen jetzt so aus:
Sort_Client.py:
Code: Alles auswählen
from socket import *
serverHostName = '127.0.0.1'
serverPort = 5007
clientsocket = socket(AF_INET, SOCK_STREAM)
clientsocket.connect((serverHostName, serverPort))
message1 = "Hello Server"
message2 = bytes(message1, "utf-8")
clientsocket.send(message2)
data = clientsocket.recv(1024)
print("Client received:", data)
clientsocket.close()
input()
Sort_Server.py:
Code: Alles auswählen
from socket import *
myHostName = ''
myPort = 5007
def answer(s):
s = bytes.decode(s)
l = list(s.upper())
l.sort()
return "".join(l)
mainsocket = socket(AF_INET, SOCK_STREAM)
mainsocket.bind((myHostName, myPort))
mainsocket.listen(1)
while 1:
connection,address = mainsocket.accept()
print("Server connected by", address)
while 1:
data = connection.recv(1024)
if not data: break
print("received:",data)
connection.send(answer(data))
connection.close()
Ganz problemlos läuft es immer noch nicht:
Code: Alles auswählen
Server connected by ('127.0.0.1', 3173)
received: b'Hello Server'
Traceback (most recent call last):
File "C:\Users\User\Desktop\Sort_Server.py", line 23, in <module>
connection.send(answer(data))
TypeError: 'str' does not support the buffer interface
Re: String in Bytes?
Verfasst: Dienstag 21. Mai 2013, 19:56
von SemperPython
Hilfe, ich komm einfach nicht mehr weiter. :K
Re: String in Bytes?
Verfasst: Dienstag 21. Mai 2013, 20:08
von BlackJack
@SemperPython: Na Du versuchst schon wieder eine Zeichenkette zu versenden statt Bytes. Genau wie beim Client.
Re: String in Bytes?
Verfasst: Donnerstag 23. Mai 2013, 18:23
von SemperPython
Das weiß ich ja.Aber diesmal weiß ich nicht, wie ich das Lösen soll.Ich habe schon etliches ausprobiert, geklappt hat aber leider nichts. ._.
Re: String in Bytes?
Verfasst: Donnerstag 23. Mai 2013, 18:30
von EyDu
Exakt so wie beim Client auch. Zerleg halt einfach mal die Ausdrücke und schau dir die Typen an.
Re: String in Bytes?
Verfasst: Montag 27. Mai 2013, 16:50
von SemperPython
Irgendwie habe ich keine Ahnung. Ich hab jetzt einiges ausprobiert, komm aber nicht auf die Lösung.
Re: String in Bytes?
Verfasst: Montag 27. Mai 2013, 16:59
von BlackJack
@SemperPython: Du hast die Lösung doch schon in eine Richtung angewendet, wieso kannst Du das nicht in die andere auch? Programmieren ist nicht reines rumprobieren bis es geht, sondern auch verstehen warum es am Ende geht und vorher nicht.
Re: String in Bytes?
Verfasst: Montag 27. Mai 2013, 17:09
von SemperPython
Wenn ich die Daten, die ich bekomme sortiere, bekomme ich ja eine Liste. Die machte ich zu einem String, die ich dann wiederum in Bytes konvertiert habe und dann verschicken wollte. Das war eigentlich meine Idee. Funktioniert aber nicht.
Re: String in Bytes?
Verfasst: Montag 27. Mai 2013, 17:32
von BlackJack
@SemperPython: Das sollte aber so funktionieren. Wobei Du in der Beschreibung jetzt den Teil vergessen hast, dass die Daten die Du bekommst vor dem sortieren erst in eine Zeichenkette und dann in eine Liste mit den Zeilen umgewandelt werden müssten.
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 11:31
von SemperPython
Ich weiß nicht, wie ich das Problem handhaben soll. Kannst du mir bitte Code-Beispiele geben?
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 11:41
von Sirius3
@SemperPython: Du verrätst uns ja nicht, was Du probiert hast und was nicht funktioniert, aber von Deinem Code ganz weit oben ausgehend: «answer(data)» liefert einen String und den mußt Du in Bytes umwandeln, bevor Du ihn an «send» übergeben kannst. Und das machst Du genau so, wie Du im Client «message1» in Bytes umwandelst.
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 12:33
von SemperPython
Zwischenzeitlich sah mein Code mal so aus:
Code: Alles auswählen
def answer(got):
as_string = bytes.decode(got)
as_list = list(got.upper())
as_sorted = as_list.sort()
joined = "".join(as_list)
as_bytes = bytes(joined, "utf-8")
Der ist aber sowas von falsch ._.
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 13:02
von Sirius3
Die Funktion hat kein »return«. »as_sorted« ist so ziemlich überflüssig, da es nicht benutzt und sowieso immer »None« enthält.
Was ist daran sonst noch »sowas von falsch«?
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 14:02
von SemperPython
Die meisten Variablen haben den Datentyp None.
Re: String in Bytes?
Verfasst: Donnerstag 30. Mai 2013, 15:17
von BlackJack
@SemperPython: 1 von 5 ist bei Dir „die meisten”? Wo ist denn jetzt genau das Problem mit `answer()` bei welchen Eingabedaten, mit welcher Fehlermeldung, oder welchem unerwartetem Ergebnis, was Du Dir nicht erklären kannst? Was denkst Du denn was in der ersten Zeile passiert wenn `got` Bytes mit Werten ausserhalb von ASCII enthält? Wo verwendest Du `as_string` überhaupt? Was erwartest Du wenn Du `list()` auf eine Zeichen- oder Bytekette anwendest? Hast Du mal nachgeprüft ob diese Erwartung erfüllt wird?