用的indytcpserver和indytcpclient来进行网络通信,程序需要主动连接到别的机器,也需要接收别的机器的连接,所以我在一个unite里同时用了这两个控件。但是在设置了server的port之后,(例如设成5000)再设置client的port的时候(例如设置成5001)就会出错了。这个怎么处理?
目前我的需求是:server需要一个端口来侦听,client需要一个端口来连接上别的server,两个用不同的端口(当然如果能用同一个端口更好)另外:有一个公网固定ip的server,如果连接它的client里有通过代理服务器上internet的,其他client怎么连接到这个client?
静候高手指点。有实例更好
[email protected]
先谢谢了

解决方案 »

  1.   

    在IdTCPServer被激活的情况下,在因服务器要一直监听该TCP端口,所以是不能被别的控件或程序使用的,同理UDP的SERVER也是一样的,但你的情况是使用使用了不一样的端口,这是可以的。要使用同一个端口实现类似的功能,据我所知,只能使用TCP+UDP的方式了不知道楼主要实现什么功能,讲得具体点
      

  2.   

    1.client端好像是一对一的吧,SERVER是一对多,你可以放两个client控件啊.
    2.通过Server中转即可.client对client很难穿越局域网内部.
      

  3.   

    indytcpclient只需要设置要连接的远程主机端口,本机端口不用设置,系统会自动分配。
    indytcpclient一般向indytcpserver连接,如果即要做client有要做server,只要放1个indytcpclient和1个indytcpserver控件
      

  4.   

    to getit911(Windows转Linux中):一个Client可以连两个Server吗?
      

  5.   

    idTcpServer在收到连接请求建立连接后,要自动分配线程给新连接,而且新连接的端口号是在自身端口号基础上上递增的,你server的端口号是5000,新连接自然第一个就是5001,会不会有问题呢?
      

  6.   

    其实我做的这个东西是一个类似qq的东西,一个server端,一个client端,server端在公网上有固定ip,client端连接上server之后再和其他client发送消息.一个是不知道client端的端口怎么处理,一个是不知道代理服务器怎么处理.求各位达人帮忙.有实例更好.拜托了..时间紧迫...
      

  7.   

    只需要一个indytcpclient和一个indytcpserver控件。
    客户端的通讯,也需要通过server端中转的。类似与聊天室程序,你可以去下载demo来看。delphi自带的有indy的demo的网址。
    大概过程是这样的:
    1、idTcpServer在收到连接请求建立连接后,会自动分配线程给新连接。此时要把该客户端的ip地址等信息加入到一个列表里。
      GetMem(NewClient, SizeOf(TClient));  NewClient.DNS         := AThread.Connection.LocalName;
      NewClient.Connected   := Now;
      NewClient.LastAction  := NewClient.Connected;
      NewClient.Thread      :=AThread;  AThread.Data:=TObject(NewClient);  try
        Clients.LockList.Add(NewClient);
      finally
        Clients.UnlockList;
      end;2、客户端发过来的请求,其中会有“要发给谁”的一些信息,server端收到后从列表里选出该主机的一些信息,发消息给它。
            with Clients.LockList do
            try
              for i := 0 to Count-1 do
              begin
                RecClient:=Items[i];
                if RecClient.DNS=CommBlock.ReceiverName then  // we don't have a login function so we have to use the DNS (Hostname)
                begin
                  RecThread:=RecClient.Thread;
                  RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);
                end;
              end;
            finally
              Clients.UnlockList;
            end;
    3、客户端的接收程序:可建立一个线程,监听端口,收到后做一些处理:如
    procedure TClientHandleThread.Execute;
    begin
      while not Terminated do
      begin
        if not ClientFrmMain.Client.Connected then
          Terminate
        else
        try
          ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
          Synchronize(HandleInput);
        except
        end;
      end;
    end;
    去下载这个demo吧
      

  8.   

    谢谢楼上.通过服务器中转消息的话就只需要客户端连接到服务器端就够了,但是客户端数量很多的时候服务器端的的负担就很重了,我希望能做成客户端可以p2p连接的,而且最好能穿越内网的.因为不仅需要发送即时消息,还要传送文件.
    qq是怎么实现p2p连接的呢?