IdTCPClient 发送消息包含中文的变成乱码,麻烦看下我这个代码

estly 2010-05-07 03:37:00
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, RzPrgres, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, ExtCtrls, XPMan, ComCtrls, Buttons;

type
TForm1 = class(TForm)
XPManifest1: TXPManifest;
tmrCheckServerMsg: TTimer;
IdTCPClient: TIdTCPClient;
mmoinfo: TMemo;
Edtmsg: TEdit;
btnDisconect: TButton;
btnConnect: TButton;
pbProgress1: TRzProgressBar;
pbProgress: TProgressBar;
BitBtn1: TBitBtn;
procedure btnDisconectClick(Sender: TObject);
procedure EdtmsgKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure btnConnectClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure IdTCPClientWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure tmrCheckServerMsgTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses TypInfo;
{$R *.dfm}

procedure TForm1.btnConnectClick(Sender: TObject);
var
Response: string;
UserName: string;
name:pchar;len:dword;
begin
len:=30;
getmem(name,30);
getcomputername(name,len);
IdTCPClient.ConnectTimeout := 5000;
IdTCPClient.Connect;
username:=name;
//UserName := Format('U%.5d', [Random(99999)]);
IdTCPClient.IOHandler.WriteLn(UserName);
Response := IdTCPClient.IOHandler.ReadLn;
if SameText(Response, 'LOGINED') then
begin
btnDisconect.Enabled := True;
btnConnect.Enabled := False;
tmrCheckServerMsg.Enabled := True;
Caption := 'Client - ' + UserName;
end
else raise Exception.CreateFmt('登录失败: "%s"', [Response]);
end;

procedure TForm1.btnDisconectClick(Sender: TObject);
begin
 btnConnect.Enabled:=True;
 btnDisconect.Enabled:=False;
 tmrCheckServerMsg.Enabled:=False;
 Caption:='Client';
 IdTCPClient.Disconnect;
end;

procedure TForm1.EdtmsgKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_RETURN then
 begin
  if not IdTCPClient.Connected then Exit;
  if edtMsg.Text<>''then
  begin
   IdTCPClient.IOHandler.WriteLn(edtMsg.Text);
//edtmsg.Text:= EnCodeUTF8(edtMsg.Text);
   mmoInfo.Lines.Add(Format('发送消息:"%s"',[edtMsg.Text]));
   edtMsg.Clear;
  end;
  Key:=0;
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
  if IdTCPClient.Connected then
   btnDisconect.Click;
 except
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
 IdTCPClient.Host:='127.0.0.1';
 IdTCPClient.Port:=7982;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
form1.btnConnect.Click;
end;

procedure TForm1.IdTCPClientWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
//
pbProgress.Position:=AWorkCount;
 Application.ProcessMessages;
end;

type
TSizeType = (stB, stK, stM, stG, stT);
function FormatFileSize(Size: Extended; MaxSizeType: TSizeType; var ReturnSizeType: TSizeType;
const IncludeComma: Boolean = True): string; overload;
const
FormatStr: array[Boolean] of string = ('0.##', '#,##0.##'); {do not localize}
var
DivCount: Integer;
begin
ReturnSizeType := stB;
DivCount := 0;
while (Size >= 1024) and (ReturnSizeType <> MaxSizeType) do
begin
Size := Size / 1024;
Inc(DivCount);
case DivCount of
1: ReturnSizeType := stK;
2: ReturnSizeType := stM;
3: ReturnSizeType := stG;
4: ReturnSizeType := stT;
end;
end;
Result := FormatFloat(FormatStr[IncludeComma], Size);
end;

function FormatFileSize(Size:Extended;MaxSizeType:TSizeType;
 constIncludeComma:Boolean=True):string;overload;
resourcestring
 RSC_BYTE='字节';
var
 ReturnSt:TSizeType;
begin
 Result:=FormatFileSize(Size,stT,ReturnSt,True)+''+
  Copy(GetEnumName(TypeInfo(TSizeType),Ord(ReturnSt)),3,1);
 if ReturnSt=stB then
 begin
  Delete(Result,Length(Result),1);
  Result:=Result+RSC_BYTE;
 end
 else
  Result:=Result+'B';{donotlocalize}
end;

procedure TForm1.tmrCheckServerMsgTimer(Sender: TObject);
var
 CmdStr:string;
 FSize:Int64;
 FStream:TFileStream;
 SaveFileName:string;
begin
 CmdStr:='';
 if IdTCPClient.Connected then
 begin
  IdTCPClient.IOHandler.CheckForDataOnSource(250);
  if not IdTCPClient.IOHandler.InputBufferIsEmpty then
  begin
   tmrCheckServerMsg.Enabled:=False;
   try
   // CmdStr:=IdTCPClient.IOHandler.ReadLn(enUTF8);
CmdStr := IdTCPClient.IOHandler.ReadLn;
    CmdStr:=System.UTF8Encode(CmdStr);
    if SameText(Copy(CmdStr,1,4),'FILE')then
    begin
     SaveFileName:=Trim(Copy(CmdStr,5,Length(CmdStr)));
     mmoInfo.Lines.Add('准备接收文件....');
     IdTCPClient.IOHandler.WriteLn('SIZE');
     FSize:=IdTCPClient.IOHandler.ReadInt64(False);
     if FSize>0 then
     begin
      pbProgress.Max:=FSize;
      pbProgress.Position:=0;
      mmoInfo.Lines.Add('文件大小 =' + FormatFileSize(FSize, stK) + '; 正在接收中...');
IdTCPClient.IOHandler.WriteLn('READY');
      while True do
      begin
       if FileExists(ExtractFilePath(ParamStr(0))+SaveFileName)then
        SaveFileName:='~'+SaveFileName
       else Break;
      end;
      FStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))
       +SaveFileName,
       fmCreate);
      try
       IdTCPClient.IOHandler.LargeStream:=True;
       IdTCPClient.IOHandler.ReadStream(FStream,FSize);
       IdTCPClient.IOHandler.LargeStream:=False;
       IdTCPClient.IOHandler.WriteLn('OK');
       if IdTCPClient.IOHandler.ReadLn='DONE' then
        mmoInfo.Lines.Add('接收成功!')
      finally
       FStream.Free;
      end;
     end
     else begin
      mmoInfo.Lines.Add('接收失败!');
      IdTCPClient.IOHandler.WriteLn('CANCEL');
     end;
    end
    else
     mmoInfo.Lines.Add('接收文本信息:'+CmdStr)
   finally
    tmrCheckServerMsg.Enabled:=True;
   end;
  end;
 end;
end;



end.

收到的消息 中文部分为 '????' 是怎么回事, 麻烦哪位高手指教一下我这个 代码

新手分不多 ,见谅
...全文
1126 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaiqol 2012-10-26
  • 打赏
  • 举报
回复
我也正在用这个控件 不过问题不是你这个
wylton 2012-10-26
  • 打赏
  • 举报
回复
都那年那月的帖子??也没人结贴。
oushengfen 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
服务端与客户端统一编码。
服务端:
cmdstr := AContext.Connection.IOHandler.ReadLn(TEncoding.UTF8);
AContext.Connection.IOHandler.WriteLn('我是中国人', TEncoding.UTF8);

客户端:
IOHandler.WriteLn(cmd, TEncoding.UTF8);
s……
[/Quote]

此方法应该可以解决问题
tianwu_feng 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
Ansistring 试试
[/Quote]
建议试试这个!
wangsj741 2012-08-23
  • 打赏
  • 举报
回复
服务端与客户端统一编码。
服务端:
cmdstr := AContext.Connection.IOHandler.ReadLn(TEncoding.UTF8);
AContext.Connection.IOHandler.WriteLn('我是中国人', TEncoding.UTF8);

客户端:
IOHandler.WriteLn(cmd, TEncoding.UTF8);
s := IOHandler.ReadLn(TEncoding.UTF8);
lybingyu 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

TIdTCPClient OnConnect Event

IdTCPClient1.IOHandler.DefTextEncoding := TIdTextEncoding.Default;

TIdTCPServer OnConnect Event

AContext.Connection.IOHandler.DefTextEncoding := TIdTextEncod……
[/Quote]

我的是delphi7+indy10.5.7测试很好,我也正在找乱码解决方法,谢谢
yxhua240 2011-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhouzhangkui 的回复:]
C/C++ code

void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdTCPClient1->IOHandler->WriteLn(Memo1->Text,enUTF8);
}
//------------------------------------------------------------------……
[/Quote]
AContext.Connection.IOHandler.ReadLn(SysUtils.TEncoding.UTF8);
yxhua240 2011-11-21
  • 打赏
  • 举报
回复
没答案?
zhuang_bx 2011-11-21
  • 打赏
  • 举报
回复
都按字节收发应该没问题,不能发用字节byte,收用string,这样肯定会出错。
服务端,客户端都用byte试试
hello009527 2010-05-15
  • 打赏
  • 举报
回复
Ansistring 试试
火星牛 2010-05-15
  • 打赏
  • 举报
回复
在英文操作系统接收吗?发送Unicode字串,客户端按unicode显示。
sczyq 2010-05-13
  • 打赏
  • 举报
回复
TIdTCPClient OnConnect Event

IdTCPClient1.IOHandler.DefTextEncoding := TIdTextEncoding.Default;

TIdTCPServer OnConnect Event

AContext.Connection.IOHandler.DefTextEncoding := TIdTextEncoding.Default;
estly 2010-05-07
  • 打赏
  • 举报
回复
那样就复杂了,

那我只要发送消息时不用流 要怎样办

风之谷 2010-05-07
  • 打赏
  • 举报
回复
有流的话 就对流数据进行编码,base64 编码后传输,
estly 2010-05-07
  • 打赏
  • 举报
回复


这一段应该是吧

    pbProgress.Max:=FSize;
      pbProgress.Position:=0;
      mmoInfo.Lines.Add('文件大小 =' + FormatFileSize(FSize, stK) + '; 正在接收中...');
IdTCPClient.IOHandler.WriteLn('READY');
      while True do
      begin
       if FileExists(ExtractFilePath(ParamStr(0))+SaveFileName)then
        SaveFileName:='~'+SaveFileName
       else Break;
      end;
      FStream:=TFileStream.Create(ExtractFilePath(ParamStr(0))
       +SaveFileName,
       fmCreate);
      try
风之谷 2010-05-07
  • 打赏
  • 举报
回复
你代码太长了,我大概问下你里面是否有 流
estly 2010-05-07
  • 打赏
  • 举报
回复
楼上的朋友, 我这是delphi

我在里面加入 enUTF8为何不对呢
estly 2010-05-07
  • 打赏
  • 举报
回复
我是新手,麻烦帮忙改进一下这个,谢谢了
周药师 2010-05-07
  • 打赏
  • 举报
回复

void __fastcall TForm1::Button1Click(TObject *Sender)
{
IdTCPClient1->IOHandler->WriteLn(Memo1->Text,enUTF8);
}
//------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
String date = AContext->Connection->IOHandler->ReadLn();
Memo2->Lines->Add(date);
}
风之谷 2010-05-07
  • 打赏
  • 举报
回复
编码处理,网络传输二进制流 必须编码 有可能丢失数据

base64编码 后 传输,接收后解码
加载更多回复(2)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧