zoukankan      html  css  js  c++  java
  • indy

    IdTCPServerConnect方法作为IdTCPServer 的OnConnect事件响应过程,向客户端发送欢迎信息。OnConnect事件在一个客户连接请求被接受时发生,为该连接创建的线程AThread被作为参数传递给IdTCPServerConnect方法。

    IdTCPServerExecute方法是IdTCPServer 的OnExecute事件响应过程。OnExecute事件在TIdPeerThread对象试图执行其Run方法时发生。OnExecute事件与通常的事件有所不同,其响应过程是在某个线程上下文中执行的,参数AThread就是调用它的线程。这一点很重要,它意味着可能有多个OnExecute事件响应过程被同时执行。在连接被断开或中断前,OnExecute事件响应过程会被反复执行。

    在IdTCPServerExecute方法中,首先读入一条指令,然后对指令进行判别。如果是DATA指令,就解出数据并显示它。如果收到的是QUIT指令,则断开连接。需要特别指出的是,由于IdTCPServerExecute方法在某一线程上下文中执行,因此显示数据和添加事件记录都是将相应的方法传递给Synchronize调用来完成的。




     if AnsiStartsText('DATA ', sCommand) then

          FReceived := RightStr(sCommand, Length(sCommand)-5);


    这句处理中文出错!!
    发送了:Data 123456中文
    收到:a 123456中文
    晚上来分析!

    晕,已经第二天了..
    现在来看看
    rightstr的源码
    function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
    begin
      Result := Copy(WideString(AText), Length(WideString(AText)) + 1 - ACount, ACount);
    end;
    这句里面用了widestring把atext转成了widestring.说明可以支持中文
    在widestring中是把中文当成2个字符统计的,而ansistring是把中文当成一个字符统计

    所以
     if AnsiStartsText('DATA ', sCommand) then

          FReceived := RightStr(sCommand, Length(sCommand)-5);

    发送了:Data 123456中文
    收到:a 123456中文
    这句中Length(sCommand)算的是15
    也就是说FReceived收到的是RightStr(sCommand, 10);
    在rightstr中
    Result := Copy(WideString(AText), Length(WideString(AText)) + 1 - ACount, ACount);
    变为
    Result := Copy(WideString(AText), Length(WideString(AText)) + 1 - ACount, ACount);
                                                                ~~~~~~~~~~
                                                                  13
    Result := Copy(WideString('Data 123456中文'),13 + 1 - 10, 10);
    Result := Copy(WideString('Data 123456中文'),4, 10);
    得到了a 123456中文

    from delphi help
    For single-byte and multibyte strings, Length returns the number of bytes used by the string. For Unicode (WideString) strings, Length returns the number of bytes divided by two.


    解决方法:
     if AnsiStartsText('DATA ', sCommand) then

          FReceived := RightStr(sCommand, Length(widestring(sCommand))-5);

    loop's blog
  • 相关阅读:
    NSArray的几个方法的简单使用
    内存管理常用知识点总结
    iOS是开发之 对数组中的元素排序后输出
    iOS开发之——单例的几种设计方式
    图论二:图的存储
    图论一:基本概念
    树状数组(hdu-4325,hdu-1166,pat-1057)
    pat1079+1086+1090+1094(树的遍历)感想
    pat 甲级 1086(树的遍历||建树)
    static关键字的功能
  • 原文地址:https://www.cnblogs.com/goodloop/p/49108.html
Copyright © 2011-2022 走看看