Seite 1 von 1

Einfacher Netzwerkserver und Client

Verfasst: Donnerstag 4. August 2005, 14:04
von ProgChild
Für Alle, die sich mit Sockets auseinander setzten wollen, hab ich hier mal den wohl einfachsten Server und den einfachsten Client erstellt.

Der Server:

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-

# Dieser Server sendet alle Daten, die er empfängt an den
# Client als Antwort zurück

from socket import *

# Der standard Echo Port ist nicht sehr nützlich, da er root
# Rechte erfordert. Wir nehemen den Port 50007
ECHO_PORT = 50007
BUFSIZE = 1024

def main():
	# Socket erstellen und an Port binden
	s = socket(AF_INET, SOCK_STREAM)
	s.bind(('', ECHO_PORT))
	s.listen( 1 )
	
	print "Server gestartet"
	
	# Warte auf eine Verbindung zum Server
	conn, (remotehost, remoteport) = s.accept()
	print 'Verbunden mit %s:%s' % (remotehost, remoteport)
	
	while 1:
		# Empfange daten vom Client
		data = conn.recv(BUFSIZE)
		print "Echo: %s" % (data)
		if not data:
			# Die Verbindung wurde getrennt
			break # Abbruch

		# Sende die Daten zurück zum client
		conn.send(data)

	# Socket schließen
	s.close()

main()
Der Client:

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-

# Dieser Client Sendet eine Nachricht an einen Server und
# wartet auf eine Antwort.

from socket import *

SERVER_PORT = 50007
BUFSIZE = 1024

def main():
	print "Server Addresse: "
	host = raw_input()
	
	print
	print "Nachricht: "
	msg = raw_input()
	
	# Ein INet Streaming (TCP/IP) Socket erzeugen
	s = socket( AF_INET, SOCK_STREAM)
	
	# Zum Server verbinden
	s.connect( (host, SERVER_PORT) )
	
	# Unsere Nachricht senden
	s.send( msg )
	
	# Auf Daten vom Server warten
	data = s.recv( BUFSIZE )
	
	# Daten anzeigen
	print
	print "Daten: %s" % (data)

	# Verbindung trennen
	s.close()

main()
Den Server einfach auf einem PC im Netzwerk starten. Dann den Client starten. Im Client müsst ihr dann die Addresse des Server PCs eingeben. Wenn ihr Client und Server auf dem Selben PC ausführt, müsst ihr localhost eingeben. Das wisst ihr aber bestimmt schon :wink:

Viel Spaß damit!

Update1:
Verbindung mit close schließen (siehe unten)

Verfasst: Montag 5. Dezember 2005, 14:21
von Bigfoot29deu
Das nenn ich doch mal ein nettes Tutorial... Danke :D

Gibts noch mehr derartige Code-Schnippel irgendwo? Grad die Netzwerkprogrammiererei hat es mir angetan, aber mit Frameworks wie Twisted etc. kann ich nicht allzu viel anfangen :/

Gruß, Bigfoot29

Verfasst: Montag 5. Dezember 2005, 15:56
von jens
Bigfoot29deu hat geschrieben:Gibts noch mehr derartige Code-Schnippel irgendwo?
Allerdings: [wiki]Forum Code Snippets[/wiki]

Verfasst: Montag 5. Dezember 2005, 19:10
von mitsuhiko
jens hat geschrieben:
Bigfoot29deu hat geschrieben:Gibts noch mehr derartige Code-Schnippel irgendwo?
Allerdings: [wiki]Forum Code Snippets
[/wiki]
NEIN!!!

bitte keine Foren_Code_Snippets. Bitte alles schön in [wiki=Tipps_und_Tricks]Tipps und Tricks[/wiki] eintragen.

Verfasst: Dienstag 6. Dezember 2005, 16:28
von XT@ngel
blackbird hat geschrieben:bitte keine Foren_Code_Snippets. Bitte alles schön in Tipps und Tricks eintragen.
Sorry für die vielleicht dumme Frage aber - Wieso? :mrgreen:
Wo isn der snippet Index jetzt?

MfG
Andreas

Verfasst: Dienstag 6. Dezember 2005, 16:35
von jens
Die Idee war, nicht nur eine riesen Link liste zu bauen, sondern lieber die Essenz aus dem Thread direkt in Wiki zu bringen, so wie die paar Sachen, die schon da sind: [wiki]Tipps und Tricks[/wiki]

Nach wie vor gibt es noch: http://pythonwiki.de/PythonSnippets

Verfasst: Freitag 16. Dezember 2005, 16:32
von icepacker
hi
hey das gefällt mir richtig gut. :D
gibts davon noch mehr?

lg icepacker

Verfasst: Samstag 31. Dezember 2005, 23:22
von mitsuhiko
Ich hab das jetzt einfach mal übernommen :-)

Zu finden unter [wiki]Netzwerkserver mit Client[/wiki]

Verfasst: Sonntag 1. Januar 2006, 12:04
von rayo
Hi

Irgendwie fehlt mir einfach die close Methode :).


Klar wird der Socket bei Scriptende auch geschlossen, aber es soll ja ein kleines Beispiel sein und da, f inde ich, gehört es einfach rein.

Beim Client einfach bei

Code: Alles auswählen

  34     print "Daten: %s" % (data)
         s.close()
Gruss

Verfasst: Sonntag 1. Januar 2006, 12:30
von ProgChild
rayo hat geschrieben:Irgendwie fehlt mir einfach die close Methode :).
Hab ich noch ergänzt

Verfasst: Donnerstag 5. Januar 2006, 15:33
von tabellar
Mir fehlt hier noch die Unterscheidung von TCP und UDP Sockets. Das Server
Beispiel von ProgChild ist ein TCP Server mit TCP Client. TCP (Transmission Control Protocol)
ist eine zuverlässige, verbindungsorientierte Kommunikationsform. UDP (User Datagram Protocol)
ist eine verbindungslose Kommunikation.

Ich hab hier mal einen UDP-Server und UDP Client dazugestellt, was natürlich
dann auch im PythonWiki stehen könnte ;-).

Tabellar

UDP-Server

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-
"""
      EINFACHER UDP-SERVER
      ====================

      Dieser UDP (user datagram protocol) Server ermöglicht
      eine verbindungslose Netzwerkkommunikation. Der
      Server sendet alle Daten, die er empfängt, an den
      Client als Antwort zurück. Durch eine ".stop" Nachricht
      kann der Server ordnungsgemäss beendet werden.

"""

from socket import *

#Server Port
PORT = 50007
#Maximale Grösse der zu lesenden Daten am Socket
BUFSIZE = 1024

def main():
    #Bindung des Servers an einen UDP-Socket
    s = socket(AF_INET, SOCK_DGRAM)                              
    s.bind(("", PORT))
    print "UDP-Server gestartet..."

    while 1:
        #Lesen der Daten am Socket
        data, (client_ip,client_port) = s.recvfrom(BUFSIZE)      
        #Anzeige der Client-Adresse und der Daten
        print "[%s %s]: %s" % (client_ip,client_port,data)       
        #Reaktion auf Daten
        if data == "":
           s.sendto("keine Daten",(client_ip,client_port))
        elif data == ".stop":
           s.sendto("Server beendet",(client_ip,client_port)) 
           break
        elif data != "" or data != ".stop":
           s.sendto(data,(client_ip,client_port)) 


    #Socket schliessen
    s.close()                                                    

if __name__ == '__main__':
   main()
UDP-Client

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-
"""
      EINFACHER UDP-CLIENT
      ====================

      Der UDP-Client sendet Daten an den Server, die er als
      Antwort wieder empfängt. Durch den ".stop" Befehl wird der
      Server ordnungsgemäss beendet. Mit ".quit" wird der
      Client beendet.

"""

from socket import *

SERVER_IP   = "127.0.0.1"
SERVER_PORT = 50007
CLIENT_PORT = 50008
#Maximale Grösse der zu lesenden Daten am Socket
BUFSIZE = 1024

def main():
    #Bindung des Clients an einen UDP-Socket
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(("",CLIENT_PORT))                   

    while 1:
        #Benutzereingabe
        msg_out = raw_input("CLI>: ")
        if msg_out==".quit":
           s.close()
           break
        #Senden der Daten an den Server
        s.sendto(msg_out,(SERVER_IP,SERVER_PORT))
        #Lesen der Daten am Socket
        msg_in,(client_ip,client_port)=s.recvfrom(BUFSIZE)
        print msg_in

if __name__ == '__main__':
   main()
[/b]