官网
http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdTCPServer_OnExecute.html
IdUDPServer1中文汉字乱码,用IndyTextEncoding_OSDefault字符编码就解决问题了
IdUDPServer1.Send(1.1.1.1,8080,'中国人',IndyTextEncoding_OSDefault);
发送字节
IdUDPServer1.SendBuffer(const System::UnicodeString AHost, const System::Word APort, const Idglobal::TIdBytes ABuffer);
TIdBytes 就是TBytes就是TByteDynArray
udp bytes byte
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
lastMsg := BytesToString(AData, IndyTextEncoding_OSDefault);
end;
TCP,IdTCPClient
IndyTextEncoding
IdTCPClient1.IOHandler.WriteLn(sendData,IndyTextEncoding(TEncoding.ANSI));
发送中文如果是乱码请用这种方法编码修改就可以了,ansi、 utf8等看对方的要求编码格式了。
bs:TBytes;
setlength(bs,8);
IdTCPClient1.IOHandler.Write(TIdBytes(bs));
c++
String rstr = BytesToString(AData, IndyTextEncoding_UTF8());
https://stackoverflow.com/questions/13839094/how-to-read-all-bytes-from-server-using-indy-client-in-delphi
https://forums.embarcadero.com/thread.jspa?threadID=211952
IdTCPClient1->Host =GStack->LocalAddress;;
IdTCPClient1->Port = 9080;
IdTCPClient1->Connect();
TCP发送buff
TFileStream *fs; String FilePath=”c:\\test.data"; fs = new TFileStream(fileNamePath, fmOpenRead); IdTCPClient1->IOHandler->WriteBufferOpen(); IdTCPClient1->IOHandler->WriteLn(fileName); IdTCPClient1->IOHandler->Write(fs,false,True); delete fs; IdTCPClient1->IOHandler->WriteBufferClose();
TCP接收buff
void __fastcall TFrmServer::IdTCPServer1Execute(TIdContext *AContext)
{
TFileStream *fs; try { FileName = AContext->Connection->IOHandler->ReadLn("",0); } catch(...) { return; } if( FileName.IsEmpty() ) return; FileNew = DataFilePath + FileName;
fs = new TFileStream(FileNew, fmCreate); AContext->Connection->IOHandler->ReadStream (fs,-1,false); delete fs;
//新版没有这个线程函数了
//AContext->Connection->Synchronize(frmksjg->BitBtn1->Click);
}
https://stackoverflow.com/questions/10361446/delphi-indy-10-demo-application-client-server
https://stackoverflow.com/questions/25438309/indy10-idtcpclients-iohandler-send-additional-data
https://stackoverflow.com/questions/25438309/indy10-idtcpclients-iohandler-send-additional-data
https://forums.embarcadero.com/thread.jspa?threadID=115603
// 在线程中
// while(!Terminated && MainForm->IdTCPClient1->Connected())
{
IdTCPClient1->Socket->CheckForDataOnSource(100);
if (IdTCPClient1->Socket->InputBufferIsEmpty() == false)
{
int nReceive = IdTCPClient1->Socket->InputBuffer->Size;
char Buf[10240];
// nReceive = Min(nReceive, sizeof(Buf));
TIdBytes tmp;
IdTCPClient1->Socket->ReadBytes(tmp, nReceive); // 读数据
BytesToRaw(tmp, Buf, nReceive);
// MainForm->fsUpdateFile->Write(Buf, nReceive); //写入文件
}
}
看客户发完等待接收
Sleep(1000);
idbuf:TIdBytes; while True do begin tcpClient1.IOHandler.CheckForDataOnSource(); if tcpClient1.IOHandler.InputBuffer.Size >0 then begin SetLength(barray, tcpClient1.IOHandler.InputBuffer.Size); tcpClient1.IOHandler.ReadBytes( idbuf, tcpClient1.IOHandler.InputBuffer.Size,false); sret := tencoding.Default.GetString(idbuf); break; end; end;
c++
TBytes bv;
IdTCPClient1->IOHandler->CheckForDataOnSource(); if (!IdTCPClient1->IOHandler->InputBufferIsEmpty()) { int nReceive = IdTCPClient1->IOHandler->InputBuffer->Size; bv.set_length(0); bv.set_length(nReceive); IdTCPClient1->IOHandler->ReadBytes(bv, nReceive, false); sret = TEncoding::Default->GetString(bv); }