Benutzer:Moerdn/ Netzwerk Setup
Ein Einfaches Netzwerk Setup kann man sich ganz einfach mit dem Socket Modul implementieren. Um von dem Client Server Gedanken weg zu kommen, werde ich in der Terminologie die Begriffe Sender und Empfänger verwenden. Jeder Knoten im Netzwerk kann so Nachrichten empfangen, als auch senden und wird aus Geschwindigkeitsgründen über einen Verbindungslosen UDP Kanal kommunizieren.
Die Sender Klasse
[Bearbeiten]Der Sender wird als Klasse implementiert und kann nach belieben erzeugt und gelöscht werden. Als Parameter kann eine Default Nachricht, der Port und die IP verwendet werden. Man sollte beachten, das auf Posix System Port Nummer > 1000 verwendet müssen, da die ersten 1000 für das Betriebssystem reserviert sind
# Beispiel 1.1. Die Sender Klasse.
import socket
class Sender(object):
def __init__(self, msg="", port=1001, ip=""):
if ip == "":
self.ip = socket.gethostname() # An localhost
else:
self.ip = ip
self.msg = msg
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.connect((ip, self.port))
def send(self, msg=""):
if msg != "":
self.msg = msg
self.sock.send(self.msg)
#END 1.1.
Die Sender Klasse verwenden
[Bearbeiten]# Beispiel 1.2. Die Sender Klasse verwenden.
from Sender import *
s = Sender("nachricht text", port=6666, ip="192.168.178.31")
s.send() # Default Nachricht verschicken
s.send("neue nachricht")
#END 1.2.
Die Reciever Klasse
[Bearbeiten]# Beispiel 1.3. Die Reciever Klasse.
import socket
class Reciever(object):
def __init__(self, port=6666, ip="192.168.178.31"):
self.port = port
self.ip = ip
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((ip, port))
self.sock.setblocking(0)
def recieve(self, buf_size=1024):
try:
return self.sock.recvfrom(buf_size)
except socket.error:
return None
#END 1.3.
Die Reciever Klasse verwenden
[Bearbeiten]Der Empfänger muss zunächst einmal erzeugt werden und wird als Property des GameObjects gespeichert. Danach wird nur noch die recieve() Methode aufgerufen und im Falle von erhaltenen Daten, können diese ausgewertet werden.
# Beispiel 1.4. Die Reciever Klasse.
from bge import logic as GL
import socket
from Sender import Sender
def main(con):
own = con.owner
if not 'rec' in own:
rec = Reciever(6665)
data = own['rec'].recieve()
if data is not None:
print(data)
#END 1.4.
Die eigene IP Adresse ermitteln
[Bearbeiten]Unter Windows ist es sehr leicht die eigene IP Adresse zu ermitteln, unter Linux muss man dagegen etwas mehr Arbeit verrichten. Das folgende Code Fragment zeigt einen Weg, die Daten OS - unabhängig zu ermitteln.
# Beispiel 1.5. Die eigene IP Adresse ermitteln.
import os
import socket
class IPAdress():
def __init__(self):
self.ip = socket.gethostbyname(socket.gethostname())
if self.ip.startswith("127.") and os.name != "nt":
interfaces = ["eth0","eth1","eth2","wlan0",
"wlan1","wifi0","ath0","ath1","ppp0"]
for ifname in interfaces:
try:
self.ip = self.__get_interface_ip__(ifname)
break
except IOError:
pass
def __get_interface_ip__(self, ifname):
import fcntl
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def getRange(self, start=0, end=255):
addr = self.ip.split('.')
addr_range = []
for nbr in range(start, end+1):
addr[-1] = str(int(nbr))
addr_range.append('.'.join(addr))
return addr_range
def __str__(self):
return self.ip
##
# Verwendung der IPAdress Klasse
#
ip = IPAdress()
print(str(ip))
#END 1.5.