2012-11-05 9 views
5

Zakodowałem program serwera przy użyciu Pythona.Tylko odbierając jeden bajt z gniazda

Próbuję uzyskać ciąg, ale mam tylko postać! Jak mogę otrzymać ciąg?

def handleclient(connection):           
    while True:        
     rec = connection.recv(200) 
     if rec == "help": #when I put help in the client program, rec = 'h' and not to "help" 
      connection.send("Help Menu!") 


    connection.send(rec) 
    connection.close() 

def main(): 
    while True: 
     connection, addr = sckobj.accept() 
     connection.send("Hello\n\r") 
     connection.send("Message: ") 
     IpClient = addr[0] 
     print 'Server was connected by :',IpClient 


     thread.start_new(handleclient, (connection,)) 
+1

Używasz gniazd non-blocking? – cdarke

Odpowiedz

5

Dzięki połączeniom TCP/IP Twoja wiadomość może być pofragmentowana. Może wysłać jedną literę na raz lub może wysłać cały los na raz - nigdy nie możesz być tego pewien.

Twoje programy muszą obsługiwać tę fragmentację. Użyj pakietu o stałej długości (aby zawsze czytać bajty X) lub przesyłaj długość danych na początku każdego pakietu. Jeśli wysyłasz tylko litery ASCII, możesz również użyć określonego znaku (np. \n), aby oznaczyć koniec transmisji. W takim przypadku należy czytać, dopóki wiadomość nie będzie zawierać numeru \n.

recv(200) nie ma gwarancji otrzymania 200 bajtów - 200 to tylko maksimum.

Jest to przykład tego, jak może wyglądać Twój serwer:

rec = "" 
while True: 
    rec += connection.recv(1024) 
    rec_end = rec.find('\n') 
    if rec_end != -1: 
     data = rec[:rec_end] 

     # Do whatever you want with data here 

     rec = rec[rec_end+1:] 
+0

, więc muszę utworzyć pętlę, która sprawdzi, czy dane, które otrzymałem, są równe \ n, a następnie sprawdź, czy nie ma "pomocy". – programmer

+0

Jak już powiedziałem, możesz zrobić to na kilka sposobów. Jeśli twoja wiadomość nigdy nie będzie zawierała '\ n', możesz użyć jej jako terminatora. Wyślij go na końcu wiadomości w kliencie, a na serwerze odczytaj dane, aż zobaczysz '\ n'. Dodałem krótki kod przykładowy do mojej odpowiedzi. – Tim