소켓

2012-11-05 3 views
5

에서 1 바이트 만 받기 파이썬을 사용하여 서버 프로그램을 코딩했습니다.소켓

나는 문자열을 얻으려고하고 있지만 캐릭터는 하나뿐입니다! 문자열을 수신하려면 어떻게해야합니까?

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

당신이 비 블로킹 소켓을 사용하고 있습니까 :

이 서버가 볼 수있는 방법의 예입니다? – cdarke

답변

5

메시지가 조각화 될 수 있습니다. 한 번에 한 글자 씩 보낼 수도 있고 한 번에 많은 편지를 보낼 수도 있습니다.

프로그램이이 조각화를 처리 할 수 ​​있어야합니다. 고정 길이 패킷 (항상 X 바이트를 읽음)을 사용하거나 각 패킷의 시작 부분에서 데이터의 길이를 보냅니다. ASCII 문자 만 보내는 경우 특정 문자 (예 : \n)를 사용하여 전송 끝을 표시 할 수도 있습니다. 이 경우 메시지에 \n이 포함될 때까지 읽습니다.

recv(200)은 200 바이트를 수신하는 것이 보장되지 않습니다. 200은 최대 값입니다.

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

그래서 데이터를 받는지 확인하려면 루프를 만들 필요가 있습니다. \ n 다음에 "도움말"을 확인하십시오. – programmer

+0

내가 말했듯이, 당신은 몇 가지 방법으로 그것을 할 수 있습니다. 메시지에'\ n '이 포함되지 않으면 터미네이터로 사용할 수 있습니다. 클라이언트에서 메시지가 끝날 때 보내면'\ n'이 나타날 때까지 서버에서 데이터를 읽습니다. 내 대답에 몇 가지 간단한 샘플 코드를 추가했습니다. – Tim