2012-11-05 36 views
5

Tôi đã mã hóa chương trình máy chủ bằng python.Chỉ nhận một byte từ ổ cắm

Tôi đang cố gắng lấy chuỗi nhưng tôi chỉ nhận được một ký tự! Làm thế nào tôi có thể nhận được một chuỗi?

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

Bạn đang sử dụng ổ cắm non-blocking? – cdarke

Trả lời

5

Với kết nối TCP/IP, thư của bạn có thể bị phân mảnh. Nó có thể gửi một lá thư tại một thời điểm, hoặc nó có thể gửi toàn bộ lô cùng một lúc - bạn không bao giờ có thể chắc chắn.

Chương trình của bạn cần có khả năng xử lý phân đoạn này. Sử dụng gói tin có độ dài cố định (vì vậy bạn luôn đọc X byte) hoặc gửi độ dài của dữ liệu ở đầu mỗi gói. Nếu bạn chỉ gửi các chữ cái ASCII, bạn cũng có thể sử dụng một ký tự cụ thể (ví dụ: \n) để đánh dấu kết thúc truyền. Trong trường hợp này, bạn sẽ đọc cho đến khi tin nhắn chứa \n.

recv(200) không được đảm bảo nhận 200 byte - 200 chỉ là mức tối đa.

Đây là một ví dụ về máy chủ của bạn có thể trông như sau:

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

vì vậy tôi cần tạo một vòng lặp để kiểm tra xem dữ liệu tôi nhận được có bằng \ n không, sau đó chọn kiểm tra "trợ giúp". – programmer

+0

Như tôi đã nói, bạn có thể làm điều đó một vài cách. Nếu thông điệp của bạn sẽ không bao giờ chứa '\ n', bạn có thể sử dụng nó như một terminator. Gửi nó ở cuối thư của bạn trong máy khách và trong máy chủ đọc dữ liệu cho đến khi bạn thấy '\ n'. Tôi đã thêm một số mã mẫu nhanh vào câu trả lời của tôi. – Tim

Các vấn đề liên quan