请大家不要把Delphi7下面的Demo给我,那样没有分的。

解决方案 »

  1.   

    给你一段Server端的代码。
    var
      s: string;
    begin
      try
        s := ClientSocket.Receiveln;
        while s <> '' do
        begin
          SocketResult := s;
          S := ClientSocket.Receiveln;
        end;
        if LengTh(Trim(SocketResult)) > 1 then
        begin
          //处理告警
        end;
      finally
    //
      end;end;
      

  2.   

    1. tcpclient从tcpserver接收数据:  TReceiveThread = class(TThread)
      private
        FMsg: string;
      protected
        procedure Execute; override;
      end;var
      FThread: TReceiveThread;
    procedure TReceiveThread.Execute;
    begin
      while not Terminated do
      begin
        if Form1.IdTCPClient1.Connected then
        begin
          FMsg := Form1.IdTCPClient1.ReadLn;
          Sleep(100);
        end;
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FThread := TReceiveThread.Create(False);
      IdTCPClient1.Host := Edit1.Text;
      IdTCPClient1.Port := 10001;
      if not IdTCPClient1.Connected then
        IdTCPClient1.Connect;
    end;2. tcpserver向tcpclient发送数据
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
      i : Integer;
      AThread : TIdPeerThread;
    begin
      try
        with IdTCPServer1.Threads.LockList do
        for I := 0 to Count - 1 do
        begin
          AThread := Items[I];
          if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
            AThread.Connection.WriteLn(s);
        end;
      finally
        IdTCPServer1.Threads.UnlockList;
      end;
    end;
      

  3.   

    设置
      IdTCPServer1.DefaultPort := 10001;
      IdTCPServer1.Active := True;  IdTCPClient1.Host := '服务端地址'
      IdTCPClient1.Port := 10001;
      if not IdTCPClient1.Connected then
        IdTCPClient1.Connect1. 客户端发送:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      IdTCPClient1.WriteLn('ok');
    end;2. 服务端接收:
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      s: string;
    begin
      s := AThread.Connection.ReadLn;
    end;
    3.. 客户端接收数据:(用线程;)  TReceiveThread = class(TThread)
      private
        FMsg: string;
      protected
        procedure Execute; override;
      end;var
      FThread: TReceiveThread;
    procedure TReceiveThread.Execute;
    begin
      while not Terminated do
      begin
        if Form1.IdTCPClient1.Connected then
        begin
          FMsg := Form1.IdTCPClient1.ReadLn;
          Sleep(100);
        end;
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FThread := TReceiveThread.Create(False);
      IdTCPClient1.Host := Edit1.Text;
      IdTCPClient1.Port := 10001;
      if not IdTCPClient1.Connected then
        IdTCPClient1.Connect;
    end;2. 服务端发送数据
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var
      i : Integer;
      AThread : TIdPeerThread;
    begin
      try
        with IdTCPServer1.Threads.LockList do
        for I := 0 to Count - 1 do
        begin
          AThread := Items[I];
          if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
            AThread.Connection.WriteLn(s);
        end;
      finally
        IdTCPServer1.Threads.UnlockList;
      end;
      

  4.   

    1.阻塞模式编程建议用INDY的IDTCPCLIENT IDTCPSERVER
    2.非阻塞模式建议用D6中的CLIENTSOCKET SERVERSOCKET,D7中可以通过 COMPONENT->
      INSTALL PACKAGES->add->DELPH7\BIN\DCLSOCKETS70.BPL来添加。
    3。TCPCLIENT,TCPSERVER在D7中的DEMOS是用的阻塞模式,当客户端连接后建立了线程来处理和客户端的通讯问题。BLOCKMODE:=BMTHREADBLOCKING;
    4。TCPCLIENT,TCPSERVER也可以工作在非阻塞模式,BLOCKMODE:=BMNOBLOCKING;这样就象CLIENTSOCKET SERVERSOCKET了,但是TCPCLIENT 可以象CLIENTSOCKET一样又ONREAD,ONWRITE,而TCPSERVER确没有看到象SERVERSOCKET那样的ONCLIENTREAD,ONCLIENTREAD.
    5.查看TCPSERVER的源代码,发现他和TCPCLIENT一样最终是继承于TBaseSocket的,那么应该也可以有ONREAD,ONWRITE。
    6。如果我们象TCPCLIENT那样作个procedure TcpServerReceive(Sender: TObject; Buf: PAnsiChar;  var DataLen: Integer),你面写处理代码,然后TCPSERVER1.OnReceive:=TcpServerReceive; OnSend也如此类推,应该就可以了。
    7。这个方法没有测试,但原理是这样的,只不过TCPSERVER的OnReceive,OnSend在设计时看不到而已,不等于他没有。
      

  5.   

    感谢大家贴的这么长的代码,可是我要得是TTcpClient和TTcpServer的,不是TIDTcpServer的。
      

  6.   

    而且现在的问题是,TcpClient的OnReceive事件总是不被触发,所以,我根本没办法使用OnReceive事件。
      

  7.   


    var
      Form1: TForm1;
      m:TMemorystream;
      Buf:array[0..10000] of byte;
    implementation{$R *.dfm}procedure TForm1.WMNCHitTest(var Msg: TMessage);
    begin
    inherited; // 这样,移动就不可能了...
    //edit1.Text:=inttostr(msg.Result);
    {if (msg.Result=2)or(msg.Result=3) then msg.Result:=1
    else
    if (msg.Result=1) then msg.Result:=2;}
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    ClientSocket1.Socket.SendText(edit2.Text);
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
    memo1.Lines.Add('客户端说:'+socket.ReceiveText);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    ServerSocket1.Socket.Connections[0].SendText(edit1.Text);
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
      var len:integer;JPG:TJpegimage;B:TBitmap;
    begin
    memo1.Lines.Add('服务端说:'+socket.ReceiveText);
    Len:=socket.ReceiveLength;//读出包的长度
    socket.ReceiveBuf(Buf,len);//读包并存入Buf
    m.Write(Buf,Len);//追加到 m流
    JPG.LoadFromStream(m);
    B.Assign(JPG);
    Image1.Picture.Bitmap.Assign(B);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    ServerSocket1.Open;
    ClientSocket1.Open;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ServerSocket1.Close;
    ClientSocket1.Close;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var B:TBitmap;JPG:TJpegimage;
    desk:TCanvas;
    begin
    B:=TBitmap.Create;
    desk:=TCanvas.Create;
    JPG:=TJpegimage.Create;
    desk.Handle:=GetDC(hwnd_desktop);
    B.Width:=screen.Width;B.Height:=Screen.Height;
    B.Canvas.CopyRect(b.Canvas.ClipRect,desk,desk.ClipRect);
    B.SaveToFile('scr.bmp');
    JPG.Assign(B);
    JPG.SaveToFile('SCR.jpg');
    JPG.SaveToStream(m);
    m.Position:=0;
    ClientSocket1.Socket.SendStream(m);
    B.Free;
    JPG.Free;
    end;end.
      

  8.   

    回复人: jiaai(逍遥游) ( ) 信誉:99 -----------------------------------
    乱说,表误导人了~
    D7的Tcp控件需要自己控制,当然它们都写了基础方法,可以直接调用,取消使用了消息机制,我想这可能是以后的趋势
    tcpclient好使用,已经给出了select方法,可随意使用,onreceive是需要自己触发的!TBaseSocket只是建立了基础socket而已,并没WSA消息
    tcpserver要自己新继承线程控制,在getthread里~
      

  9.   

    例子吗就在delphi\demos\indy,不过可能要去网上下载