Netzwerk-Programm starten...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Mit welchem Aufruf kann man jetzt dieses Programm bitte starten ?
Muss man noch irgendwelche Netzwerksachen installieren für import socket ?

Ich habe nur Python 2.7.5 installiert.

Danke.

Gruss


Code: Alles auswählen

import socket

HOST = 'localhost'
PORT = 42001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

def sendCMD(cmd):
    n = len(cmd)
    a = []
    a.append((n >> 24) & 0xFF)
    a.append((n >> 16) & 0xFF)
    a.append((n >> 8) & 0xFF)
    a.append(n & 0xFF)
    b = ''
    for i in list(range(len(a))):
        b = b+a[i]
    s.send(bytes(b+cmd,'UTF-8'))

sendCMD('broadcast"hello"')
BlackJack

@funkheld: Das kann man mit dem Python-Interpreter starten. Einfach den Pfad der Datei als Argument übergeben. Allerdings ist das da für Python 3.x geschrieben, denn bei 2.7 kennt `bytes()` kein Kodierungsargument und da wäre das auch nicht notwendig weil `str` dort noch das ist was in Python 3 von `bytes` übernommen wurde.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup, danke.

Ich habe gerade diese Fehlermeldung erhalten:

Traceback (most recent call last):
File "F:\Python27\pebi-py\cmmmi.py", line 21, in <module>
sendCMD('broadcast"hello"')
File "F:\Python27\pebi-py\cmmmi.py", line 18, in sendCMD
b = b+a
TypeError: cannot concatenate 'str' and 'int' objects

Wie sieht denn dieser Code in 2.7.5 aus ?
Kannst du mir da mal bitte weiterhelfen ?

danke.

Gruss
BlackJack

@funkheld: *Der* Teil funktioniert in keiner Python-Version. Das ist schlicht falsch. Der Grund steht in der Ausnahme: Man kann Zeichenketten und Zahlen nicht addieren. Macht ja auch keinen Sinn.

Edit: Man würde das letztendlich sowieso anders lösen. Und zwar mit dem `struct`-Modul.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup, danke.
Da ich nicht soviel davon verstehe, kann ich es wohl wegpacken ?
Ich wollte einfach nur diese Daten in Scratch1.4 empfangen.

Das habe ich aus einem englischen Artikel für die Sprache Scratch1.4

Danke.

Gruss
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@funkheld: für Python 2.7 sähe das ungefähr so aus:

Code: Alles auswählen

#!/usr/bin/env python
import socket
import struct
 
HOST = 'localhost'
PORT = 42001

class CommandSocket(object):
    def __init__(self, host, port):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((host, port))
 
    def send_command(self, command):
        data = command.encode('utf-8')
        self.socket.send(struct.pack('>I', len(data)) + data)
 
if __name__=='__main__':
    command_socket = CommandSocket(HOST, PORT)
    command_socket.send_command('broadcast"hello"')
Ich ging jetzt mal davon aus, daß die Länge des kodierten Strings gesendet wird, in der Annahme, daß die Entwickler des Protokolls sich nicht das Leben unnötig schwer gemacht haben.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup danke.
Es läuft schon soweit, nur der String ist leer.
Ich habe mal einen kleinen Server gebastelt.

Wenn ich den Server starte sagt er "String: "

Vielleicht kannst mir noch einmal weiterhelfen, zumal dein Programm versucht zu senden ?

Danke.
Gruss
BlackJack

Das ``send`` in Zeile 15 sollte man durch ``sendall`` ersetzen.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Jup, danke.
Der String ist noch leer.

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hmmm..., kann man mir bitte einmal erklären, was für eine umständliche Sache im obersten Programm gemacht wird mit dem String ?
Das versteh ich nicht.

Code: Alles auswählen

    n = len(cmd)
    a = []
    a.append((n >> 24) & 0xFF)
    a.append((n >> 16) & 0xFF)
    a.append((n >> 8) & 0xFF)
    a.append(n & 0xFF)
    b = ''
    for i in list(range(len(a))):
        b = b+a[i]
    s.send(bytes(b+cmd,'UTF-8'))
Danke.

Gruss
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@funkheld: da es fehlerhaft ist, kann man höchstens versuchen zu erklären, was gemacht werden soll: Bytes bestehen aus 8 Bit, die Länge des Strings soll aber 32 Bit haben, also 4*8 Bit. Und der Code macht diese Aufspaltung in 8Bit-Häppchen.
So wäre es auch richtiges Python 3:

Code: Alles auswählen

n=len(cmd)
b = bytes((n>>b)&0xff for b in (24,16,8,0))
s.sendall(b+bytes(cmd,'utf-8'))
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Hmmm..., danke. Ganz ist es noch nicht drin, aber ein bisschen :roll:
Jetzt hast du etwas erzählt, was mir dort bei dem Sratch1.4-Team auffiel, die schrieben bei der Übertragung immer von 32 Bit.

Kannst du das von dir mal bitte so in etwa in Basic erklären, was da so alles stattfindet:
n=len(cmd)
b = bytes((n>>b)& 0xff for b in (24,16,8,0))
s.sendall(b+bytes(cmd,'UTF-8'))

Der String den ich empfange hat immer noch 0Bytes bzw der Inhalt vom Wert als byte ist "0". :cry:
Aber es läuft in Python 3...

Hier ist mal auf Englisch, was die wollen:
http://wiki.scratch.mit.edu/wiki/Remote ... s_Protocol

Danke.
Antworten