2012-11-21 3 views
2

로컬 컴퓨터 (127.0.0.1)에서 실행되는 exe가 있습니다. 이 exe는 포트 1234에 쓰고 5678에서 읽습니다. exe는 매번 50 초 후에 정수 값 1212, 4545, 6767 등을 씁니다. 그 정수 값을 읽고 표시하고 싶습니다. 그래서 Indy Client를 사용하여 그 목적을 달성했습니다. 나는 다음 코드 스 니펫을 개발했다.delphi에서 tcp ip 연결을 만드는 동안 메시지를 읽을 수 없습니다

IdTCPClient1.Port := 1234; //Set port to connect to 
IdTCPClient1.Host := '127.0.0.1'; //Set host to connect to 
IdTCPClient1.Connect; //Make connection 

sMsg := IdTCPClient1.Socket.ReadLn; //Read the response from the server 
ShowMessage(sMsg); 

하지만 독서가 아닙니다. 디버깅하는 동안이 줄에 걸리면 (SMSG : = IdTCPClient1.Socket.ReadLn)

나는이 텔넷 127.0.0.1 1234 일부 기타 또는 특수 문자 같은 텔넷 명령을 사용하여이 작업을 수행하려고 정기적 후에 표시됩니다 interval은 서버가 보내는 정수 값이 아닙니다.

해결 방법을 제안하십시오.

+2

우선,'ReadLn' 함수는 리턴하기 전에 개행을 기다릴 때까지 기다립니다. 일반 개행이나 캐리지 리턴 및 개행 조합은 잘 모르겠습니다. 또한이 숫자를 바이너리 데이터 또는 텍스트 문자열로 어떻게 보내나요? –

+0

서버 응용 프로그램은 50 초 후에 정수 값만 전송합니다 (4 바이트 큰 블록에서 전보가 정수 값으로 전송 됨). 그게 내가 아는 전부 야. ReadLn 대신 무엇을 사용해야합니까? –

+0

저는 집에 델파이가 없지만'ReadLn'이라는 함수는 바이너리 데이터가 아닌 텍스트 데이터를 기대한다고 생각합니다.임의의 데이터에 대해 사용해야하는'Read' 또는'Receive' 또는 유사한 함수가 있어야합니다. –

답변

3

어디에 문제가 있는지 잘 모르겠습니다. 따라서 기본 인디 (Indy) 서버 및 클라이언트 응용 프로그램을 만들기위한 전체 예제를 게시하고 있습니다.

먼저 서버 응용 프로그램에 IdTCPServer 구성 요소와 버튼이 있습니다. 관련 속성은 다음과 같습니다

object Button1: TButton 
    Text = 'Listen' 
    OnClick = Button1Click 
end 
object IdTCPServer1: TIdTCPServer 
    DefaultPort = 1234 
    OnExecute = IdTCPServer1Execute 
end 

및 서버의 IdTCPServer.OnExecuteButton.OnClick 방법은 다음과 같습니다

procedure TServerForm.Button1Click(Sender: TObject); 
begin 
    IdTCPServer1.Active := not IdTCPServer1.Active; 
    if IdTCPServer1.Active then 
    Button1.Text := 'Close' 
    else 
    Button1.Text := 'Listen'; 
end; 

procedure TServerForm.IdTCPServer1Execute(AContext: TIdContext); 
var 
    Num: Integer; 
begin 
    while (IdTCPServer1.Active) and (AContext.Connection.Connected) do 
    begin 
    Num := Random(MaxInt); 
    AContext.Connection.IOHandler.WriteLn(IntToStr(Num)); 
    Sleep(1000); 
    end; 
end; 

당신이 볼 수 있듯이, 연결된 각 클라이언트에 대해, 우리는 루프를 입력 할 경우 각 초 의지 임의의 숫자 (문자열)를 소켓에 씁니다.

내가 서버를 실행하고 음악을 감상 할 수있는 버튼을 누르면, 열려있는 포트를 허용하도록 경고 방화벽을 받아들이고 나서 성공적으로 연결하고 텔넷을 통해이 서버에서 정보를 얻을 : 이제

telnet connected to my server

클라이언트 응용 프로그램을 만들었습니다.

object Button1: TButton 
    Text = 'Connect' 
    OnClick = Button1Click 
end 
object Memo1: TMemo 
end 
object IdTCPClient1: TIdTCPClient 
    Host = 'localhost' 
    Port = 1234 
end 

과 코드는 다음과 같습니다 : 양식에

버튼, 메모 및 IdTCPClient, 관련 속성은

: 런타임시

procedure TClientForm.ReadResults; 
var 
    S: string; 
begin 
    while IdTCPClient1.Connected do 
    begin 
    S := IdTCPClient1.IOHandler.ReadLn; 
    Memo1.Lines.Add(S); 
    //don't repeat this approach in production code, it's just a test here 
    Application.ProcessMessages; 
    end; 
end; 

procedure TClientForm.Button1Click(Sender: TObject); 
begin 
    if IdTCPClient1.Connected then 
    begin 
    IdTCPClient1.Disconnect; 
    Button1.Text := 'Connect'; 
    end 
    else 
    begin 
    IdTCPClient1.Connect; 
    Button1.Text := 'Disconnect'; 
    Button1.Repaint; 
    ReadResults; 
    end; 
end; 

그것은 다음과 같습니다 client and server running

프로젝트는 Delphi X가 포함 된 FireMonkey로 제작되었습니다. E3이지만, VCL에서도 Indy 10을 지원하는 Delphi 버전에서 작동해야합니다.

+0

자세한 사례를 게시 해 주신 jachguate에게 감사드립니다. 하지만 내 문제는 어떤 언어로 서버 코드가 작성되었는지 알 수 없다는 것입니다. 나는 exe 파일 만 받았고 매 50 초마다 일부 정수 값을 반환한다는 것을 알고 그 정수를 읽으려면 xphi2에서 응용 프로그램을 개발해야합니다. –

+0

숫자가 _written_ 인 형식을 설명하는 사양 문서가 있습니까? 그것이 바이너리 형식으로 쓰여 있다면, 그것은 완전히 다른 이야기이고 클라이언트 측에서 서버가 올바르게 구현하기 위해 쓰는 것과 일치시키기 위해 사용할 수있는 데이터 유형을 알 수 있습니다 _MUST_. 귀하의 질문에, 당신이 그것을 텔넷을 사용하여 읽을 수 없거나 서버가 제대로 작성하지 않거나 바이너리 형식 인 경우 - 바이너리 파일을 반향하는 것과 같이 텔넷에서 _rare_ 인쇄물을 얻습니다. – jachguate

+0

바이너리 형식으로 생각합니다. 텔넷 응답 스크린 샷을 찾으십시오. https://docs.google.com/document/d/1AeVywDHW5QvW8Hunu-mB4-3J4ohS5iB5PrWA_m_U6AM/edit 이제 어떻게해야합니까? 어떻게 읽을 수 있습니까? –

관련 문제