Einfacher Netzwerkserver und Client

Code-Stücke können hier veröffentlicht werden.
Antworten
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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)
Zuletzt geändert von ProgChild am Sonntag 1. Januar 2006, 12:30, insgesamt 1-mal geändert.
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Bigfoot29deu hat geschrieben:Gibts noch mehr derartige Code-Schnippel irgendwo?
Allerdings: [wiki]Forum Code Snippets[/wiki]
Zuletzt geändert von jens am Mittwoch 11. Januar 2006, 15:18, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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
Zuletzt geändert von jens am Mittwoch 11. Januar 2006, 15:18, insgesamt 1-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

hi
hey das gefällt mir richtig gut. :D
gibts davon noch mehr?

lg icepacker
ubuntu linux !!
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Ich hab das jetzt einfach mal übernommen :-)

Zu finden unter [wiki]Netzwerkserver mit Client[/wiki]
TUFKAB – the user formerly known as blackbird
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

rayo hat geschrieben:Irgendwie fehlt mir einfach die close Methode :).
Hab ich noch ergänzt
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

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]
Antworten