两程序通讯,用了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;
的大小而触发一次或多次。问题:我实在不知我要如何来获得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;
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;
http://www.csdn.net/cnshare/soft/11/11463.shtm
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.
until (bytesRead = -1) or (bytesRead <> 1024);
改成
until (bytesRead = -1) or (bytesRead = 0); //读到出错或者无数据可读.
你到网络版找精华贴有一个文件传输的例子。你的代码这样改改:
先发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);
多半问题出在你的那个流上
Str.Write(Buf^, bytesRead); //Str 是一个全局的 TStream.
Str它已经创建了的吧?
STR :TStream; 应该没问题, 我把那句 //Str.Write(..... 注释了,也一样出错 可以把你的调式成功的代码贴上吗?谢谢非常TO:copy_paste(木石三) ,
阻塞 与 非阻塞 有什么具体不同呢? 唉,DELPHI上的E文应该全讲了的吧,,,只是我,,唉,
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.
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;试一下这个!
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没有值呢?
收到的信息都是乱码,这到底是那错了,那位给解释一下
这句错了.应该是:
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;
MyStream.Write(s,length(s));
form1.TcpClient1.SendStream(MyStream);//这的MyStream还是没有值
况且procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PChar;
var DataLen: Integer);
不执行,发送代码执行完就结速了,
应该是:MyStream.Write(Pchar(s)^,length(s));