两程序通讯,用了SocketClient, SocketServer 两控件: 用客户端的 SocketClient.SendStream(SStrem); 此时,服务器端 SocketServer.OnClientRead 事件,它会因SStrem
的大小而触发一次或多次。问题:我实在不知我要如何来获得READ来的数据呀,我快调试风了,下面是我写的最有可能的事件,但,老出错,,神啊,救救我吧…………var
  Buf : Pchar;
begin
  Buf := AllocMem(Socket.ReceiveLength);
  try
    Socket.ReceiveBuf(Buf^, Socket.ReceiveLength);
    Str.Write(Buf^, StrLen(Buf)); //Str 是一个全局的 TStream.
  except
  end;
  FreeMem(Buf);
end;

解决方案 »

  1.   

    看帮助好象用Socket.ReceiveLength不是很准确,试试读取固定字节:const BUF_SIZE = 1024;
    var
      Buf : Pchar;
      bytesRead: Integer;
    begin
      Buf := AllocMem(BUF_SIZE);
      try
        repeat
          bytesRead := Socket.ReceiveBuf(Buf^, BUF_SIZE);
          if bytesRead > 0 then
            Str.Write(Buf^, bytesRead); //Str 是一个全局的 TStream.
        until (bytesRead = -1) or (bytesRead <> BUF_SIZE);
      except
      end;
      FreeMem(Buf);
    end;
      

  2.   

    同意楼上
    http://www.csdn.net/cnshare/soft/11/11463.shtm
      

  3.   

    var
      Buf : Pchar;
      bytesRead : integer;
    begin
      Buf := AllocMem(1024);
      try
        repeat bytesRead  :=  Socket.ReceiveBuf(Buf^,  1024);
          if  bytesRead    >  0  then
             Str.Write(Buf^,  bytesRead);  //Str  是一个全局的  TStream.
        until  (bytesRead  =  -1) or (bytesRead <> 1024);
       except
       end;  FreeMem(Buf);
    end;
    ==============================
    好像搞不定呀…………运行时抱错……
    Access violation at address 000000DB. Write of address 0155B452.
      

  4.   

    To:BZM(白乙川)楼上的主要是告诉你解决这问路的思路,你也该自己多动动脑调试程序.另外,这句有点不对..
    until  (bytesRead  =  -1) or (bytesRead <> 1024);
    改成
    until  (bytesRead  =  -1) or (bytesRead = 0); //读到出错或者无数据可读.
      

  5.   

    TO:哈欠:没关系了,来看一看,坐一坐也好呀, 其实,我真有点交头烂鹅了如果有人调式过, 与有更好的 SOCKET 二进制传送方式,也行呀
      

  6.   

    非阻塞的没试过,阻塞的试过。
    你到网络版找精华贴有一个文件传输的例子。你的代码这样改改:
    先发Stream的Size过去,然后再SendStream;count := Stream.Size;
    Socket.SendBuf(count, Sizeof(Integer));
    recv:const
      Buf_Size = 1024 * 6;int ret := Socket.ReceiveBuf(Count, SizeOf(Integer));
    GetMem(Buffer, Buf_Size);
    while Count > 0 do
    begin
      Ret := Socket.ReceiveBuf(Buffer^, Buf_Size);
      if Ret > 0 then
      begin
        Str.WriteBuffer(Buffer^, ret);
        Dec(Count, Ret);
      end;
    end;
    FreeMem(Buffer);
      

  7.   

    我调试过那段代码,完全没有问题。
    多半问题出在你的那个流上
            Str.Write(Buf^,  bytesRead);  //Str  是一个全局的  TStream.
    Str它已经创建了的吧?
      

  8.   

    TO:哈欠,
      STR :TStream;  应该没问题, 我把那句 //Str.Write(..... 注释了,也一样出错  可以把你的调式成功的代码贴上吗?谢谢非常TO:copy_paste(木石三) ,
      阻塞 与 非阻塞 有什么具体不同呢? 唉,DELPHI上的E文应该全讲了的吧,,,只是我,,唉,
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        Memo1: TMemo;
        Button1: TButton;
        Button2: TButton;
        procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
        procedure Button1Click(Sender: TObject);
        procedure ClientSocket1Connect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ClientSocket1Disconnect(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        FStr:String;
        Fo:TStream;
        procedure DisplayMsg(s:string);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      s:string;
      iSize:Integer;
    begin
      FSTr:='';
      SetLength(s,3);
      repeat
        iSize:=Socket.ReceiveBuf(pchar(s)^,3);
        if iSize>0 then
        begin
          SetLength(s,iSize);
          Fo.Write(pchar(s)^,iSize);
          FStr:=FSTr+s;
        end
      until (iSize<>3) or (iSize=-1);
      DisplayMsg(FStr);
    end;procedure TForm1.DisplayMsg(s: string);
    begin
      memo1.Lines.Add(s)
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      ClientSocket1.Active:=true;
    end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Fo:=TFileStream.Create('d:\test.txt',FmCreate);
    end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      Fo.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ClientSocket1.Active:=false;
    end;end.
      

  10.   

    var
      Buf : Pchar;
    begin
      Buf := AllocMem(Socket.ReceiveLength);
      try
        Socket.ReceiveBuf(pointer(Buf)^, Socket.ReceiveLength);
                             ~~~~~~~~~~~~~
        Str.Write(pointer(Buf)^, StrLen(Buf)); //Str 是一个全局的 TStream.
                    ~~~~~~~~~~~~~
      except
      end;
      FreeMem(Buf);
    end;试一下这个!
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var s: string;
        MyStream: TMemotyStream;
    begin
    s := memo1.Lines.Text;
    MyStream := TMemoryStream.Create;
    MyStream.Write(s,length(s));
    form1.TcpClient1.SendStream(MyStream);
    end;procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
      var DataLen: Integer);
    var s: string;
        p: pchar;
    begin
    form1.TcpClient1.ReceiveBuf(p^,datalen);
    s := strpas(p);
    Memo2.Lines.Add(s);
    end;
    各位老兄看一下这段代码有错吗?为什麽编译的时候MyStream没有值呢?
    收到的信息都是乱码,这到底是那错了,那位给解释一下
      

  12.   

    MyStream.Write(s,length(s));
    这句错了.应该是:
    MyStream.Write(pchar(s)^,length(s));//---------------------------------------------
    procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
      var DataLen: Integer);
    var s: string;
        p: pchar;
    begin
    form1.TcpClient1.ReceiveBuf(p^,datalen);//错了,这儿的P^没有分配内存.
    s := strpas(p);
    Memo2.Lines.Add(s);
    end;//可以改成这样
    procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
      var DataLen: Integer);
    var 
       s: string;
      
    begin
      setlength(s,DataLen);
      DataLen:=form1.TcpClient1.ReceiveBuf(pchar(s)^,Datalen);
      setlength(s,DataLen);
      Memo2.Lines.Add(s);
    end;
      

  13.   

    老兄问题又出来了
    MyStream.Write(s,length(s));
    form1.TcpClient1.SendStream(MyStream);//这的MyStream还是没有值
    况且procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
      var DataLen: Integer);
    不执行,发送代码执行完就结速了,
      

  14.   

    写错了MyStream.Write(s,length(s));
    应该是:MyStream.Write(Pchar(s)^,length(s));