# Python Anfängerin



## melmager (23. Juli 2020)

Ich versuche mich grade in Python3 mit der socket programmierung auseinander zusetzen

punkt 1: die beispiele die ich im Inet sehe gehen nicht


```
from socket import socket
#from kodierung import string2bytes, bytes2string

server_socket = socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind((socket.gethostbyname(socket.gethostname()),35789))

loop = True
while loop == True:
    server_socket.listen(5)
    client_serve, addr = server_socket.accet()
    print(addr)
    cmd = input("Command :")
    if "quit" not in cmd:
       client_serve.send(cmd.decode())
    else:
        loop = False
    client_serve.close()
    del client_serve
server_socket.close()
del server_socket
```

gestartet bin ich ja mit dem
import socket
wie es so schön in allen beispielen so heisst, aber dann findet der rechner nicht das module
also "from socket import socket" damit findet er das modul scheinbar
denn nu meckert er
"AttributeError: type objekt 'socket' has no attribute 'AF_INET'

wie importiere ich die denn ?

immer wieder schön wenn beispiele im Internet nix taugen ...

oder muss ich suchpfade oder so ein blödsinn anpassen ? oder geht python nur in einem bestimmten Verzeichnis ??

[


----------



## Technipion (23. Juli 2020)

Hallo melmager,
ich bin kurzerhand in die offizielle Dokumentation abgetaucht und habe das hier gefunden:

https://docs.python.org/3/library/socket.html
Habe direkt den IPv4/IPv6 Echo-Server ganz unten ausprobiert. Hier der Code:


Spoiler: server.py





```
# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
```






Spoiler: client.py





```
# Echo client program
import socket
import sys

HOST = 'localhost'        # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))
```




Auf meinem Ubuntu-Rechner hat das auf Anhieb super geklappt. Kommen da bei dir irgendwelche Fehlermeldungen?

Gruß Technipion


----------



## melmager (23. Juli 2020)

nö  geht nicht
client connection refused
server statet ohne fehlermelung aber auch kein port zu sehen mit ss
sprich der macht auch kein port auf

aber er meckert kein modul mehr an .... auch schon ein step weiter
und klar habe ich die firewall abgeschaltet

selbst mit su rechten geht es nicht


----------



## ikosaeder (24. Juli 2020)

Ist das Beispiel für Python2? Mit dir(socket) kannst du dir anzeigen lassen, welche Attribute socket hat. Vielleicht hast du eine falsche Version.


----------



## melmager (24. Juli 2020)

ich habe 2.7 als default
python 3 ,das auch vorhanden ist, ist ein totalausfall - da müsste ich suchpfade setzen damit es geht aber das ist ein andres thema
wenn ich die python console nutze
und import socket mache
liste er ein ganzes arsenal von dingen auf bei dir(socket) aber keine version

ich müsste mal testen was ermacht wenn ich die pythonconsole starte dann mein programm importiere und dann ausführe

aufruf python server-test.py währe natürlich zu einfach ....

sorry für das gehässige , ich schiebe einfach frust
ich bin kurz davor die idee mit python sein zu lassen - dann rege ich mich halt über eine andre programmiersprache auf  ich hätte da noch LUA im angebot .... und sortiere dann python im geist als murx ein

ps: ich habe die beispiele von oben genommen als file gespeichert und direkt ausgeführt
und wenn das auf andren linux distris läuft und auf suse nicht kann es ein problem von suse sein - stimmt -


----------



## melmager (24. Juli 2020)

update : also server geht - man muss nur richtig suchen :-( - mein fehler
ss -tunlp | grep 500
demo nutzt ja port 50007
und da wird gelauscht also der scheint zu gehen der python tcp server

```
tcp    LISTEN     0      1      0.0.0.0:50007              0.0.0.0:*                   users:(("python",pid=7195,fd=3))
```

client bockt noch :-(


```
Traceback (most recent call last):
  File "client-test.py", line 16, in <module>
    s.connect(sa)
  File "/usr/lib64/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused
```

heute morgen auch mal auf die schnelle ein tcp server in java mit vertx erstellt - der horcht auch, aber auf IPv6
da muss ich mal kucken wie man java sagt er möge doch auf ipv4 lauschen ..

nachtrag im client habe ich mal ein print(sa) reingebastelt

```
('::1', 50007, 0, 0)
```

nachtrag 2:
sieht so aus als hätte ich ein IPv4 / IPv6 Problem auf dem rechner

nachtrag 3:
Also IPv6 komplett abgeschaltet 
und schon ändert sich das fehlerbild:
start Server: Server listen
Client start
beide gehen hops mit Attribute error :-(


----------



## Technipion (24. Juli 2020)

melmager hat gesagt.:


> ich habe 2.7 als default





melmager hat gesagt.:


> und sortiere dann python im geist als murx ein


Python 2.x ist 2020 auch Murks! Seit vielen Jahren schon (eigentlich schon Jahrzehnte) ist das veraltet. Guckst du hier:
https://www.python.org/doc/sunset-python-2/
Du musst *unbedingt* auf Python 3.x upgraden. Am besten auf die aktuelle Version 3.8.



melmager hat gesagt.:


> python 3 ,das auch vorhanden ist, ist ein totalausfall - da müsste ich suchpfade setzen damit es geht aber das ist ein andres thema


Wieso das denn? Ich glaube ehrlichgesagt, das ist das zentrale Thema dieses Threads...

Gruß Technipion


----------



## melmager (24. Juli 2020)

jo *python 2.7 ist mist*

aufruf python3 servertest.py
aufruf python3 clienttest.py

geht  

Version 3.6.10

PS: ich habe AF_INET reingebastelt im code
warum es beim ersten versuch nicht ging mit python 3 - kein plan - module werden jedenfalls nicht mehr angemeckert wie es mal war bei python3 - das einzige was ich wissentlich geändert habe ist:
Abschaltung IPv6

Bonusfrage: wie könnte ich Python und Java zwingen auf Ipv4 zu gehen wenn auch IPv6 vorhanden ist - ich hatte da ja ein buntes Mischmasch System bei den TCP Servern/Clients

Info:
Eine grobe Zusammenfassung der Ereignisse:
Im Internet Beispiele gesucht für Python und TCP Server - Im Texteditor eingetippelt und mit python3 gestartet - Module Fehler - sinn gemäß finde Module nicht , dann kam ich auf die spur von den Suchverzeichnissen , habe aber das abgebrochen das zu fixen, dann also den Default python genommen : (den 2.7)  und das Unheil nahm sein Lauf :-(
eine grosse Ahnungslosigkeit führte ins Verderben


----------



## ComFreek (24. Juli 2020)

Keine Sorge, Suchpfade bereiten bei vielen Programmiersprachen und -umgebungen Kopfschmerzen  Letztens erst hatte ich ein Tool (CMake), das sogar mitgeteilt, wo es versucht hat eine Datei zu finden, und mir sagte die Datei sei nicht auffindbar, obwohl der mitgeteilte Pfad einwandfrei existierte!


----------



## melmager (9. August 2020)

Nachtrag auch Python 3.6 hat Bugs
da liefert die intzahl.to_bytes(2,"big") nicht immer richtige Ergebnisse
aufgefallen ist mir das bei dem int wert 39 - da  ist das Ergebnis völliger murks

nee die print function hat mich veralbert


----------



## ComFreek (9. August 2020)

Mit Python 3.7 bekomme ich:

```
>>> (39).to_bytes(2, "big")
b"\x00'"

>>> (39).to_bytes(1, "big")
b"'"
```
Die Ausgaben passen doch, oder? Die byte-Objekte werden halt geprettyprinted von der byte-Klasse. Bis 31 gibt sie Hexadezimalziffern aus, danach das ASCII-Zeichen:

```
>>> (31).to_bytes(1, "big")
b'\x1f'

>>> (32).to_bytes(1, "big")
b' '
```
Es scheint, als ob bei 128 und danach wieder Hexadezimalziffern ausgegeben werden:

```
>>> (127).to_bytes(1, "big")
b'~'

>>> (128).to_bytes(1, "big")
b'\x80'
```

Ich wäre sehr erstaunt, wenn ein Bug in einer solch grundlegenden Funktion vorherrschen würde. Dann wären ja alle Codec-Libraries betroffen, d.h. jede Lib, die irgendwie binäre Daten liest oder schreibt.

Übrigens mit der hex-Methode auf der bytes-Klasse kannst du dir immer Hexadezimalziffern anzeigen lassen: `(39).to_bytes(1, "big").hex()`
Die habe ich in der Python API Doku gefunden: Built-in Types — Python 3.8.5 documentation.


----------



## melmager (10. August 2020)

ComFreek hat gesagt.:


> Mit Python 3.7 bekomme ich:
> 
> ```
> >>> (39).to_bytes(2, "big")
> ...


genau die ausgabe hatte mich verwirrt - mittlerweile habe ich auch mitbekommen das die ausgabe das byte in zeichen umwandelt

Info:
mittlerweile bin ich bei eric als IDE gelandet ... der hilft wenigstens bei den in python lebensnotwendigen einrückungen


----------



## ComFreek (10. August 2020)

melmager hat gesagt.:


> genau die ausgabe hatte mich verwirrt - mittlerweile habe ich auch mitbekommen das die ausgabe das byte in zeichen umwandelt


Sehr gut!

Möglicherweise habe ich in meiner Antwort auch übertrieben mit "die Ausgaben passen doch, oder?"  Ich habe da auch erstmal gestutzt und erst nach Probieren weiterer Werte war mir klar, was passiert.


----------

