私は以前の投稿で助けられましたが、コメントを扱う方法がわからないという別の問題が出てきました。Delphi XE3、Indy TCPServerおよびTCPClient。
私は、行の最後にCRLFでWriteLnを行う方法を知る必要があります。私は1つを送っていると思ったが、それが終わっていないように私は間違ってそれを処理していると信じている。ここにメッセージの1つのフレームがあります。これは人間が読める形式のメッセージで、人間が読めるものを実際の制御コードに置き換えることによって変換されます。
<STX>1H|\^~||||||||||P|1|20150724124402<CR><ETX>91<CR><LF>
<STX>2P|1|PP00015906|||Sox^White||19550506||||||<CR><ETX>56<CR><LF>
<STX>3O|1|G-13-00005||^^^CT/GC|R||||||N||||||||||||||O<CR><ETX>23<CR><LF>
<STX>4O|2|G-13-00005||^^^HPV^HPV|R||||||N||||||||||||||O<CR><ETX>F6<CR><LF>
<STX>5L|1|N<CR><ETX>DF<CR><LF>
私は、実際の制御コードを人間が読める「コード」からのメッセージを変換するとき、私はおそらく何か間違ったことをやっていると仮定します。フレームの中央にある制御コードはOKになります。それは終わりではないかもしれないフレームの終わりです。
// replace human readable codes with control codes
pantherastmframe := StringReplace(pantherastmframe, '<STX>', #2, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<CR>', #13, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<ETX>', #3, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<LF>', #10, [rfReplaceAll]) ;
クライアントで次のコードを使用して制御コードを確認しています。
MsgIn := PantherIdTCPClient.IOHandler.ReadLn ;
crlffound := 'False' ;
if Pos(#13#10, MsgIn) > 0 then
crlffound := 'True' ;
わかりやすくするために、完全なコードを記載しました。
オンコネクトコード。
procedure TTasksForm.IdTCPServer1Connect(AContext: TIdContext);
begin
AContext.Connection.IOHandler.DefStringEncoding := Indy8BitEncoding ;
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +' OnConnect') ;
// connected message
AContext.Connection.IOHandler.WriteLn('Connected');
end;
OnDisconnect code。
procedure TTasksForm.IdTCPServer1Disconnect(AContext: TIdContext);
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' OnDisconnect') ;
end;
ここはOnExecuteコードです。
procedure TTasksForm.IdTCPServer1Execute(AContext: TIdContext);
var
lastline : String;
lastcmd : String ;
lastbyte : Byte ;
i : integer ;
pantherastmframe : string ;
begin
lastline := '' ;
lastcmd := '' ;
lastbyte := (AContext.Connection.IOHandler.ReadByte) ;
if lastbyte = $5 then // <ENQ>
begin
lastcmd := '<ENQ>' ;
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <ENQ>') ;
end);
AContext.Connection.IOHandler.Write(Byte(6)) ; // <ACK>
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' => <ACK>') ;
end);
LastPantherByte := lastbyte ; // <ENQ>
end
else
if lastbyte = $4 then // <EOT>
begin
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <EOT>') ;
end);
// are there messages to transmit
if ConsolidatedASTMMessagesMemo.Lines.Count > 0 then
begin
// turn off panther timer
TThread.Synchronize(nil,
procedure
begin
PantherProcessTimer.Enabled := False ;
end);
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' => <ENQ>') ;
end);
AContext.Connection.IOHandler.Write(Byte(5)) ; // <ENQ>
lastbyte := (AContext.Connection.IOHandler.ReadByte) ;
if lastbyte = $6 then // <ACK>
begin
lastcmd := '<ACK>' ;
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <ACK>') ;
end);
// transmit frames
for i := 0 to ConsolidatedASTMMessagesMemo.Lines.Count-1 do
begin
pantherastmframe := ConsolidatedASTMMessagesMemo.Lines[i] ;
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' => ' + pantherastmframe) ;
end);
// replace human readable codes with control codes
pantherastmframe := StringReplace(pantherastmframe, '<STX>', #2, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<CR>', #13, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<ETX>', #3, [rfReplaceAll]) ;
pantherastmframe := StringReplace(pantherastmframe, '<LF>', #10, [rfReplaceAll]) ;
AContext.Connection.IOHandler.WriteLn(pantherastmframe) ;
// wait for <ACK>
lastbyte := (AContext.Connection.IOHandler.ReadByte) ;
if lastbyte = $6 then // <ACK>
begin
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <ACK>') ;
end);
end
else
if lastbyte = $21 then // <NAK>
begin
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <NAK>') ;
end);
end ;
end ; // transmit frames
TThread.Synchronize(nil,
procedure
begin
ServerTrafficMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now) +
' <= <EOT>') ;
end);
// tell panther you are done for now
AContext.Connection.IOHandler.WriteLn(#4) ; // <EOT>
LastPantherByte := lastbyte ; // <EOT>
ConsolidatedASTMMessagesMemo.Clear ;
end ;
// turn on panther timer
TThread.Synchronize(nil,
procedure
begin
PantherProcessTimer.Enabled := True ;
end);
end ;
end;
end;