String in Bytes?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
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.
Zuletzt geändert von SemperPython am Samstag 1. Juni 2013, 17:24, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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
SemperPython

Hilfe, ich komm einfach nicht mehr weiter. :K
BlackJack

@SemperPython: Na Du versuchst schon wieder eine Zeichenkette zu versenden statt Bytes. Genau wie beim Client.
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. ._.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Exakt so wie beim Client auch. Zerleg halt einfach mal die Ausdrücke und schau dir die Typen an.
Das Leben ist wie ein Tennisball.
SemperPython

Irgendwie habe ich keine Ahnung. Ich hab jetzt einiges ausprobiert, komm aber nicht auf die Lösung.
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.
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.
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.
SemperPython

Ich weiß nicht, wie ich das Problem handhaben soll. Kannst du mir bitte Code-Beispiele geben?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
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 ._.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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«?
SemperPython

Die meisten Variablen haben den Datentyp None.
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?
Antworten