2012-11-05 10 views
5

python kullanarak bir sunucu programını kodladım.Sadece bir bayt soketinden

Bir dize almaya çalışıyorum ama sadece bir karakterim var! Bir ipucu nasıl alabilirim?

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

olmayan engelleme soketleri kullanıyorsunuz:

Bu sunucu nasıl görüneceğine dair bir örnek? – cdarke

cevap

5

TCP/IP bağlantıları ile mesajınız parçalara ayrılabilir. Her seferinde bir harf gönderebilir veya tüm partiyi bir kerede gönderebilir - asla emin olamazsınız.

Programlarınızın bu parçalanmayı işleyebilmesi gerekir. Sabit uzunlukta bir paket kullanın (bu sayede her zaman X bayt okuyorsunuz) veya her bir paketin başlangıcında verinin uzunluğunu gönderin. Sadece ASCII harfleri gönderiyorsanız, aktarımın sonunu işaretlemek için belirli bir karakteri de kullanabilirsiniz (örn. \n). Bu durumda, ileti bir \n içeriyor kadar okudu.

recv(200) 200 bayt almayı garanti etmiyor - 200 en yüksek değerdir.

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

bu yüzden, elde ettiğim verilerin \ n ile eşit olup olmadığını kontrol edecek bir döngü yapmam gerekiyor. – programmer

+0

Dediğim gibi, bunu birkaç yolla yapabilirsiniz. Mesajınız asla \ n içermezse, bunu bir sonlandırıcı olarak kullanabilirsiniz. İletiyi istemcideki sonuna gönderin ve sunucuda \ n'yi görene kadar veri okuyun. Cevabım için hızlı bir örnek kod ekledim. – Tim