2010-07-30 3 views
0

으로 간단한 문자열 값을 보내고받는 것은 WriteLN과 ReadLN을 사용하지 않고 간단한 텍스트 (문자열 값)를 보낼 수있는 방법이 있습니까?
ReadLn 함수는 LF char을 필요로하고, winsock을 통해 Indy에 문자 메시지를 보내면 ReadLn은 메시지를 올바르게받을 수 없으며 일부 예외가 계속 발생합니다.Indy (Delphi)

+0

코드 예제를 게시 할 수 있습니까? –

답변

2

종료 문자 (WriteLn/ReadLn 이렇게하는 방법)를 사용하지 않으려면 먼저 보내려는 바이트 수를 소켓에 쓴 다음 쓰거나 그 많은 바이트를 읽으십시오 다른쪽에. 당신은 정당하게 모자에서 꺼낸 개행 문자와 다른 종결 문자를 사용할 수도 있습니다. 아마 Chr (251), 그것은 좋은 것이다.

결국에는 WriteLn/ReadLn으로 돌아갈 것입니다. 그것은 간단하고 예상되며 작동합니다.

+0

* 결국, 당신은 WriteLn/ReadLn으로 돌아갈 것입니다. 왜냐하면 그것은 간단하고 예상되며 작동하기 때문입니다. * 내가 말했듯이, 서버에서 ReadLn을 사용할 때 알 수없는 클라이언트 (예 : winsock)가 LF char없이 메시지를 보내면 계속해서 예외가 발생합니다! 참조! 시각 기본에서 우리는 'SendData'와 'GetData'메서드를 사용하여 LF char 및 데이터 길이를 지정하지 않고 문자열 값을 보낼 수있었습니다. indy를 통해이 작업을 수행 할 것으로 예상됩니다. 감사합니다. – Kermia

+1

내가 읽은 바로는 GetData가 SendData에 대한 단일 호출이 정확히 무엇을 읽는지 보장 할 수 없습니다. SendData에 대한 여러 호출은 단일 데이터 블록으로 그룹화 될 수 있습니다. 그게 너 한테 일어난 적이 없다면 네가 운이 좋았던 것 같은데, 케르 미아. 결론은 발신자와 수신자가 공통 * 프로토콜 *을 사용하여 * 협업해야한다는 것입니다. 수신자가 * 모든 것을 읽지 않아야한다면, 멈추어야 할 시점을 알거나, "읽는 것을 멈추라"는 의미의 특별한 데이터 시퀀스를 인식해야한다. WriteLn을 사용하는 한 ReadLn도 좋습니다. –

+1

@Kermia : continos 예외에 관해서는, 올바르게 연결 해제를 처리하지 않습니다. 서버 코드가 catch 된 모든 예외를 무시하는 try/except 블록에 읽기를 래핑하는 경우에만 설명하는 내용이 발생할 수 있습니다. Indy 자신의 EIdException 파생 예외 중 을 버리지 마십시오.그들을 잡으면 다시 던져서 서버가 내부적으로 처리하게하십시오. –

1

텍스트에 종료 문자가 있습니까? 그렇다면, ReadLn의 ATerminator 매개 변수를 설정할 수 있습니다. LF 문자 대신 정의 된 종료 문자에 도달하면 읽기를 종료합니다.

정의 된 종료 문자가 있지만 텍스트의 최대 길이를 알고있는 경우 ReadLn의 AMaxLineLength 매개 변수를 설정할 수 있습니다. 그러면 ReadLn은 길이가 AMaxLineLength보다 작은 텍스트 만 받아들입니다.

정의 된 종료 문자가없고 수신 된 텍스트의 최대 길이를 모르는 경우 ReadLn 대신 AReadUntilDisconnect 매개 변수를 True로 설정하여 ReadStream을 사용할 수 있습니다. 물론 ReadStream은 데이터를 바이트 스트림으로 읽습니다. 받은 바이트를 문자열로 가질 수 있도록 TStringStream을 할당 할 수 있습니다. AReadUntilDisconnect 매개 변수는 클라이언트가 연결을 끊을 때까지 수신 된 데이터를 계속 읽도록 ReadStream에 지시합니다. 따라서이 매개 변수를 설정하면 클라이언트가 텍스트를 서버로 보내 자마자 연결을 끊어야합니다.

+0

AReadUntilDisconnect 매개 변수가 True로 설정된 상태에서 ReadStream을 사용할 때 클라이언트가 서버에서 (ReadLn과 함께) 응답을 받아야 연결을 닫을 수 없습니다. – Kermia

+1

문자열의 전체 길이를 미리 알고 있으면 ReadLn() 대신 ReadString()을 사용하십시오. ReadLn()의 AMaxLineLength 매개 변수를 사용하고 클라이언트가 해당 문자를 보내지 않으면 ReadLn()은 결코 도착하지 않는 데이터를 기다리는 동안 차단됩니다. –

+0

@Remy Lebeau, 의견에 감사드립니다. – vcldeveloper

관련 문제