当然你要有服务器端。,服务器端放在INTERNET上,客户放入局域网。这样才可以,
还有TCP穿透强

解决方案 »

  1.   

    基本上是不可能的,因为另一个连接在Internet上的局域网,它内部的IP在Internet基本上是无效的,除非那个局域网都有Internet上合法的IP,我想除了IBM,MS等世界级的大公司外,其他公司是不可能有那么多Intenet IP可供他们自己分配的.当然你肯定能够访问已经直接连在Intenet上的某台机器(一般来说,此机器可能就是代理或防火墙之类的),如果你能成功突破这类机器,那么一般情况下,你是可以访问连接在它之后的其它局域网机器了,当然这么做的话,好象有点Hacker的味道了,Good Luck
      

  2.   

    我同意asmcos(hjs)的看法。
    实际上应该这样说的,就是Server一定要直接连接到Internet上,即是Server一定要有固定的有效IP Address,而无论客户端身置何处,只要能够通过有效的途径可以和Internet连接上,那么
    这个局域网便可以被访问,其他的Client通过Server提供的相关服务亦能与之通讯(当然如果该局域网添加了诸如防火墙之类的安全设备,可能要另当别论了)。因为每当客户端与服务器建立连接(Socket连接)时,就确定了与服务器通讯的IP Address以及Port,只要确认服务器要访问的客户端的IP和Port那么就能够访问该Client机了,具体做法是:
      每当Client和Server建立连接时,在Server里将ClientSocket的RemoteAddress和RemotePort保存到一个可维护的登录用户列表中或者刷新其中的相关信息。(这是很重要的)
    接着就如下处理了:
      Var UserID: String;//是指定要访问的登录者
          iK: integer;
          CurrentUser: PUser;//PUser就是存放客户信息的指针
          UserList: TList;//用于保存客户信息的列表,应该是全局变量,而且事先已经Create
      for iK:=0 to UserList.Count-1 do
      begin
        CurrentUser:= UserList.Items[iK];
        if CurrentUser.UserID=UserID then Break;
      end;
      for iK:=0 to ServerSocket.Socket.ActiveConnections-1 do
      begin
        if (ServerSocket.Socket.Connections[iK].RemoteAddress=CurrentUser.IPAdress) and 
           (ServerSocket.Socket.Connections[iK].RemotePort=CurrentUser.Port) then
        begin
          ServerSocket.Socket.Connections[iK].SendText('要发送的内容');
          //或者是ServerSocket.Socket.Connections[iK].SendBuf(Buf,Count);
          Break;
        end;
      end;