으로 간단한 문자열 값을 보내고받는 것은 WriteLN과 ReadLN을 사용하지 않고 간단한 텍스트 (문자열 값)를 보낼 수있는 방법이 있습니까?
ReadLn
함수는 LF char을 필요로하고, winsock을 통해 Indy에 문자 메시지를 보내면 ReadLn
은 메시지를 올바르게받을 수 없으며 일부 예외가 계속 발생합니다.Indy (Delphi)
답변
종료 문자 (WriteLn/ReadLn 이렇게하는 방법)를 사용하지 않으려면 먼저 보내려는 바이트 수를 소켓에 쓴 다음 쓰거나 그 많은 바이트를 읽으십시오 다른쪽에. 당신은 정당하게 모자에서 꺼낸 개행 문자와 다른 종결 문자를 사용할 수도 있습니다. 아마 Chr (251), 그것은 좋은 것이다.
결국에는 WriteLn/ReadLn으로 돌아갈 것입니다. 그것은 간단하고 예상되며 작동합니다.
* 결국, 당신은 WriteLn/ReadLn으로 돌아갈 것입니다. 왜냐하면 그것은 간단하고 예상되며 작동하기 때문입니다. * 내가 말했듯이, 서버에서 ReadLn을 사용할 때 알 수없는 클라이언트 (예 : winsock)가 LF char없이 메시지를 보내면 계속해서 예외가 발생합니다! 참조! 시각 기본에서 우리는 'SendData'와 'GetData'메서드를 사용하여 LF char 및 데이터 길이를 지정하지 않고 문자열 값을 보낼 수있었습니다. indy를 통해이 작업을 수행 할 것으로 예상됩니다. 감사합니다. – Kermia
내가 읽은 바로는 GetData가 SendData에 대한 단일 호출이 정확히 무엇을 읽는지 보장 할 수 없습니다. SendData에 대한 여러 호출은 단일 데이터 블록으로 그룹화 될 수 있습니다. 그게 너 한테 일어난 적이 없다면 네가 운이 좋았던 것 같은데, 케르 미아. 결론은 발신자와 수신자가 공통 * 프로토콜 *을 사용하여 * 협업해야한다는 것입니다. 수신자가 * 모든 것을 읽지 않아야한다면, 멈추어야 할 시점을 알거나, "읽는 것을 멈추라"는 의미의 특별한 데이터 시퀀스를 인식해야한다. WriteLn을 사용하는 한 ReadLn도 좋습니다. –
@Kermia : continos 예외에 관해서는, 올바르게 연결 해제를 처리하지 않습니다. 서버 코드가 catch 된 모든 예외를 무시하는 try/except 블록에 읽기를 래핑하는 경우에만 설명하는 내용이 발생할 수 있습니다. Indy 자신의 EIdException 파생 예외 중 을 버리지 마십시오.그들을 잡으면 다시 던져서 서버가 내부적으로 처리하게하십시오. –
텍스트에 종료 문자가 있습니까? 그렇다면, ReadLn의 ATerminator 매개 변수를 설정할 수 있습니다. LF 문자 대신 정의 된 종료 문자에 도달하면 읽기를 종료합니다.
정의 된 종료 문자가 있지만 텍스트의 최대 길이를 알고있는 경우 ReadLn의 AMaxLineLength 매개 변수를 설정할 수 있습니다. 그러면 ReadLn은 길이가 AMaxLineLength보다 작은 텍스트 만 받아들입니다.
정의 된 종료 문자가없고 수신 된 텍스트의 최대 길이를 모르는 경우 ReadLn 대신 AReadUntilDisconnect 매개 변수를 True로 설정하여 ReadStream을 사용할 수 있습니다. 물론 ReadStream은 데이터를 바이트 스트림으로 읽습니다. 받은 바이트를 문자열로 가질 수 있도록 TStringStream을 할당 할 수 있습니다. AReadUntilDisconnect 매개 변수는 클라이언트가 연결을 끊을 때까지 수신 된 데이터를 계속 읽도록 ReadStream에 지시합니다. 따라서이 매개 변수를 설정하면 클라이언트가 텍스트를 서버로 보내 자마자 연결을 끊어야합니다.
AReadUntilDisconnect 매개 변수가 True로 설정된 상태에서 ReadStream을 사용할 때 클라이언트가 서버에서 (ReadLn과 함께) 응답을 받아야 연결을 닫을 수 없습니다. – Kermia
문자열의 전체 길이를 미리 알고 있으면 ReadLn() 대신 ReadString()을 사용하십시오. ReadLn()의 AMaxLineLength 매개 변수를 사용하고 클라이언트가 해당 문자를 보내지 않으면 ReadLn()은 결코 도착하지 않는 데이터를 기다리는 동안 차단됩니다. –
@Remy Lebeau, 의견에 감사드립니다. – vcldeveloper
- 1. Delphi 2009에 최신 Indy 10 빌드를 설치하십시오.
- 2. Delphi 2010의 Indy IdHttp Post 문제
- 3. Delphi/Indy IdHttpServer가 멀티 스레드되지 않았습니까?
- 4. Delphi 6와 Indy SSL 연결이 작동하지 않습니다.
- 5. DELPHI/INDY/IdHTTP invision power board 포럼에 로그인 하시겠습니까?
- 6. Delphi - Indy HTTP 클라이언트를 사용하여 서버에 응답 보내기
- 7. Indy "SSL 라이브러리를로드 할 수 없습니다"와 Delphi 2007/Apache
- 8. Delphi Indy : SSL 라이브러리를 처음으로로드 할 수 없습니다. 재시도가 작동합니다.
- 9. Delphi 2009의 Indy 10 기본 설치를 업데이트하는 적절한 방법은 무엇입니까?
- 10. "Indy"(Delphi)에서 "WriteLn"으로 특수 문자열 보내기
- 11. Gmail 사용 DELPHI (Indy)에서 보내는 SMTP (TLS를 사용)
- 12. Indy IMAP 클라이언트 (Delphi 2009)로 전자 메일 도착 알림
- 13. Indy 연결 호출을 방해 할 수 있습니까?
- 14. Indy 9를 사용하기 위해 필자가 작성한 프로그램을 고객 사이트에서 Indy 10을 사용할 수 있습니까?
- 15. Indy FTP TransferType
- 16. indy 다운로드 속도 줄이기
- 17. RTMP Delphi 클라이언트 라이브러리
- 18. Delphi IRC 구성 요소
- 19. Indy 10 FTP 비어있는 목록
- 20. 내 응용 프로그램 (Indy/Delphi)에서 ASP 페이지로 그리고 다른 서버 (Amazon S3)로 파일 보내기
- 21. 하나의 특정 요청에 대해 잘린 데이터를 반환하는 Delphi Indy IdTcpClient 읽기 작업
- 22. Delphi 2010에 내장 된 Indy 배포판을 사용하여 컴파일러 오류가 발생하는 이유는 무엇입니까?
- 23. Indy 9와 Windows Server 2003 간의 비 호환성?
- 24. Delphi 2009의 "Delphi Fundamentals"
- 25. Delphi 2006 앱에 웹 서비스를 추가하는 방법은 무엇입니까?
- 26. Gmail의 SMTP 및 Indy 10을 사용하여 전자 메일을 보내려면 어떻게합니까?
- 27. Delphi의 Indy 클라이언트에서 TCP RST를 보낼 수 있습니까?
- 28. winsock2 및 IOCP를 사용하여 Delphi TClientSocket을 대체 하시겠습니까?
- 29. Indy HTTP : 403에서 응답 내용 읽기
- 30. Indy 소켓 9에서 AccessViolation을받는 이유 IdTcpServer ServerExecute?
코드 예제를 게시 할 수 있습니까? –