2011-01-16 5 views
0

Ich versuche, ein grundlegendes Server- und Klientenskript zu verursachen. Die Idee ist, dass der Client eine Verbindung zum Server herstellen und Befehle ausführen kann. Irgendwie wie SSH, aber sehr einfach. Heres mein Server-Code:Python - Server- und Clientprobleme

import sys, os, socket 


host = ''     
port = 50103 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 
print("Server started on port: ", port) 
s.listen(1) 
while (1): 
    conn, addr = s.accept() 
    print 'New connection from ', addr 
    try: 
     while True: 
      rc = conn.recv(2) 
      pipe = os.popen(rc) 
      rl = pipe.readlines() 
      fl = conn.makefile('w', 0) 
      fl.writelines(rl[:-1]) 
      fl.close() 
    except IOError: 
      conn.close() 

Und hier ist mein Kunde:

import sys, socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = 'localhost' 
port = input('Port: ') 
s.connect((host, port)) 
while (1): 
    cmd = raw_input('$ ') 
    s.send(cmd) 
    file = s.makefile('r', 0) 
    sys.stdout.writelines(file.readlines()) 
    file.close() 

Hier ist mein Problem. Ich starte den Server und führe den Client dann auf demselben Rechner aus. Ich gebe den Port ein und verbinde mich. Dann bekomme ich den raw_input, der das '$' ist. Wenn ich einen Befehl wie 'ls' eintippe, hängt es nur auf der Client-Seite. Ich muss den Server verlassen, damit der Client die Ausgabe von ls erhält. Nebenbei betreibe ich Ubuntu Linux. Nicht sicher, ob das zählt.

+0

Jetzt habe ich den Code für Sie sowieso geschrieben. Die Antwort wird aktualisiert. Du kannst immer noch tun, was auch immer du mit ssh machen willst, weißt du? –

+0

Bitte erfinden Sie SSH nicht neu. Irgendein armer Kerl wird das unterstützen und aufrechterhalten müssen! – Johnsyweb

Antwort

1

Nun, zum einen verbinden Sie nur einmal auf dem Client und auf dem Server schließen Sie den Socket nach jedem Lesevorgang.

Sie sollten sich dieses Beispiel ansehen.

http://ilab.cs.byu.edu/python/socket/echoserver.html

Sie machen ziemlich viele Dinge falsch.

+0

Danke. Ich habe versucht, den Code zu aktualisieren, aber was immer ich versuche, hängt nur auf der Client-Seite:/ Ich habe versucht, einige Dinge in diesem Beispiel zu implementieren, aber es wird immer noch nicht funktionieren. – AustinM

2

Wenn Sie file() auf dem Socket machen und dann readlines() verwenden, wird es fortgesetzt, bis Sie ein Ende der Datei erreichen, die im Socket-Fall ist, dass es vom anderen Ende geschlossen wurde.

Die Verwendung von Makefile() macht in diesem Fall keinen Sinn für mich, vor allem, da Sie es erstellen und nach jedem Befehl schließen. Verwenden Sie einfach send() und recv() an beiden Enden.

Sie möchten wahrscheinlich auch eine Art von "Protokoll" haben, so dass der Server den Client "HIER KOMMT EINE ANTWORT" und "DAS IST DAS ENDE DER ANTWORT", so dass der Client weiß. Sonst wird es schwer zu wissen, wann man auf mehr Antwort warten sollte. :)

-Update mit einem Beispiel, das funktioniert:

server.py:

import sys, os, socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(('', 50500)) 
print("Server started") 
s.listen(1) 
while True: 
    print "Accepting" 
    conn, addr = s.accept() 
    print 'New connection from ', addr 
    while True: 
     try: 
      rc = conn.recv(1024) 
      print "Command", rc 
      if not rc.strip(): 
       continue 

      if rc.strip() == 'END': 
       print "Close" 
       conn.send("**END**") 
       conn.close() 
       break 
      else: 
       conn.send("This is the result of command %s\n" % rc) 
     except Exception: 
      conn.close() 
      sys.exit() 

client.py

import sys, os, socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('localhost', 50500)) 
while True: 
    cmd = raw_input('$ ') 
    s.send(cmd) 
    result = s.recv(1024) 
    print result 
    if result == "**END**": 
     print "Ending" 
     break 
+0

Danke dafür. Obwohl es nicht funktioniert, da ich die Ausgabe nicht bekomme. Ich habe mit dem Code herumgespielt. Ich habe es so gemacht, dass es output = os.system (rc) vorformuliert und dann unten conn.send (output). Jetzt wird der Befehl auf der Serverseite vorkonfiguriert, aber nicht an den Client gesendet. Irgendwelche Ideen? – AustinM

+1

@AustinM: Nun, wie wäre es mit dem Senden? Und Sie * können * immer noch genau das tun, was Sie jetzt versuchen, indem Sie "ssh " eingeben, und Sie haben immer noch nicht erklärt, warum Sie das nicht tun. –

+0

Ich versuche es zu senden, ich conn.send (Ausgabe), während die Ausgabe auf os.system (rc) eingestellt ist. Und es ist für ein einfaches Projekt, das ich beenden muss. – AustinM