2013-10-27 47 views
-1

我一直在尝试发送消息在tcp上,但这些代码似乎给Delphi 7上的奇怪错误,你我在Delphi XE上试过类似的代码,它工作正常。用印10两个XE和Delphi林7在Delphi 7中通过TCP发送消息

type 
    TClient = class(TIdContext) 
    PeerIP  : String;   
    RcvdMsg  : String; 

    procedure SendResponse(const AResponse: String); 
    end; 

...

procedure TForm1.IdTCPServer1Connect(AContext: TIdContext); 
var 
    NewClient: TClient; 
begin 
    with TClient(AContext) do 
    begin 
    NewClient.PeerIP  := Connection.Socket.Binding.PeerIP; 
    NewClient.RcvdMsg  := Connection.Socket.ReadLn; 
    end; 
end; 

...

procedure TForm1.BitBtn1Click(Sender: TObject); 
var 
    Context: TClient; 
    List: TList; 
    I: Integer; 
begin 

    List := IdTCPServer1.Contexts.LockList; 
    try 
    for I := 0 to List.Count-1 do 
    begin 
     Context := TClient(List[I]); 
     MessageBox(0,pChar(Context.PeerIP),0,0); // shows wierd string 
(*  if (Context.PeerIP = IP) then 
     begin 
     //didn't get to here 
     Context.SendResponse('msg'); 
     Break; 
     end    *) 

    end; 
    finally 
    IdTCPServer1.Contexts.UnlockList; 
    end; 
end; 

什么办法解决呢?

编辑:

type 
     TClient = class(TIdServerContext) 
     PeerIP  : String;   
     RcvdMsg  : String; 

     procedure SendResponse(const AResponse: String); 
     end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 

    IdTCPServer1.Bindings.Add.Port := 1234; 
    IdTCPServer1.Active := not IdTCPServer1.Active; 
    IdTCPServer1.ContextClass := TClient; 
end; 

我仍然无法发送消息。

procedure TForm1.BitBtn1Click(Sender: TObject); 
    var 
     Context: TClient; 
     List: TList; 
     I: Integer; 
    begin 

     List := IdTCPServer1.Contexts.LockList; 
     try 
     for I := 0 to List.Count-1 do 
     begin 
      Context := TClient(List[I]); 
      MessageBox(0,pChar(Context.PeerIP),0,0); // blank 
    (*  if (Context.PeerIP = IP) then 
      begin 
      //didn't get to here 
      Context.SendResponse('msg'); 
      Break; 
      end    *) 

     end; 
     finally 
     IdTCPServer1.Contexts.UnlockList; 
     end; 
    end; 
+1

是输出真正的“怪异字符串” ? –

+0

我的意思是奇怪的ascii字符,或者我不知道你们叫什么 – user1979304

回答

2

TClient需要从TIdServerContext,不TIdContext派生。并确保您激活服务器之前分配TIdTCPServer.ContextClass财产,如果你没有这样做,否则你的类型转换将是无效的:

type 
    TClient = class(TIdServerContext) 
    ... 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    IdTCPServer1.ContextClass := TClient; 
    ... 
end; 
+0

谢谢你的帮助,我居然试过'TIdServerContext',但结果是一样的,如果加了IdTCPServer1也不行.ContextClass:= TClient;'...我编辑了我的文章 – user1979304

+0

在激活服务器之前,您必须设置'ContextClass' **,否则可能会导致客户端连接到服务器并最终使用默认的'TIdServerContext'类在更新'ContextClass'之前使用您的自定义类。 –