做了个简单的三层测试程序,客户端用SocketConnection连接服务器。
    服务器网络状况:局域网络内的一台机器连接到陆游器,陆游器有公网ip,并做了端口到主机的影射,21,25,80,5988四个端口可用,最后一个端口空闲,其它三个已经做了web,ftp,mail服务端口。开始的时候怎么也连不上。后面用了最后一个端口,提示出错“Invalid Data Packet”,不知道是什么原因??
    找了很久资料还是没有解决,不知能否告知怎么通过SocketConnection连接远程服务器??

解决方案 »

  1.   

    client:procedure TForm1.FormCreate(Sender: TObject);
    var
      remotehost : String;
    begin
      Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'LesterSoft.ini');
      LFactoryName := Ini.ReadString('Factory','Name','');
      //IniData := TIniFile.Create(ExtractFilePath(Application.ExeName) +LFactoryName+DateToStr(Now)+'.ini');
      remotehost := Ini.ReadString('SERVER','IP','');
      if trim(remotehost)<>''then
      begin
        if Cs.Active then
        Cs.Active := True;
        Cs.Port := 5000;
        Cs.Host := remotehost;
        try
          Cs.Active := true;
        except
          showmessage('连接失败!');
        end;
      end;end;
    -------------------procedure TForm1.SendBtnClick(Sender: TObject);
    var
      fs : TFileStream;
      Buf : Pointer;
    begin
      fs := TFileStream.Create(edit1.Text,
            fmOpenRead or fmShareDenyNone);
      GetMem(Buf,fs.size);
      fs.Seek(0,soFromBeginning);
      fs.ReadBuffer(Buf^,fs.Size);
      Richedit1.Lines.Add(DateToStr(Date)+
                           ''+ TimeToStr(time)+
                           '==>>'+
                           '共发送 :'+
                           IntToStr(Cs.Socket.SendBuf(Buf^,fs.Size))+
                           '字节.');
      self.Close;
    end;server :
    procedure TForm1.SSClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      Df : PDataFlag;
      cmd : String;
      Buffer : Pointer;
      nRetr : Integer;
      fs : TFileStream;
      s: TStringList;
      const bufferSize = 1024;
    begin
      //showmessage('00000');
      Df := Socket.Data;
      case Df.WorkFlag of
      0,3:
      begin
        cmd := trim(Socket.ReceiveText);
        //showmessage(cmd+'');
        s := TStringList.Create;
        s.Add(cmd);
        s.SaveToFile(label2.Caption+'NXOD'+dateToStr(Date)+'.ini');
    ....
      

  2.   

    hugoon(ギギ孤独code客ギギ) :我做东西主要是连接数据库的,但实际上我的remotedatamodule里面没有任何数据库控件,我现在想知道怎么样才能让客户端通过Socketconnection 连接到应用程序服务器上面.
      

  3.   

    cncharles(旺仔) :中间层已经运行了scktsrvr.exe
      

  4.   

    hzfbb(青宇) :能否把你的例程给我发一份,上面出现的那个错误是在同一个网络里面出的,我在远程Internet上面试怎么也连接不上。
      

  5.   

    hzfbb(青宇) :刚才我又试了一下, 在客户端uses 一下MIDASLIB,出现的问题就只有这个了,是不是一定就是端口的问题啊?
      

  6.   

    这个问题可能我看错了,我说得跟你这个有点不一样,你应该是通过socket传递CLientDataSet.Data这个属性,而不是我想得用SocketConnetion控件,我也是解决不了你的那个问题,才用SocketConnection控件的
      

  7.   

    我用的也是SocketConnetion控件啊,在局域网中连接就没有任何问题,但是internet上就有问题了,还有我的Remote Data Module 里面没有任何的控件,就是一个空的
      

  8.   

    我现在是在服务器端放一个数据集,然后放一个接口控件TDataSetProvider,然后客户端用ClientDataSet直接连接就可以了
      

  9.   

    陆游器有外网ip,服务器也通过端口映射到了外网ip ,222.243.13.191