如何在ClientSocketRead事件里面屏蔽socketerror信息? (26分)

  • 主题发起人 主题发起人 carem1
  • 开始时间 开始时间
C

carem1

Unregistered / Unconfirmed
GUEST, unregistred user!
程序经常会弹出一些乱码的错误信息。请问如何用errorcode:=0来屏蔽这些错误信息??(必须在read里面增加)
error里面可以这样写
procedure Tform1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Errorcode := 0; {不弹出出错窗口}
end;

但是下面这里面怎么写呢?
procedure Tform1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
//Errorcode := 0; {不弹出出错窗口} 在这里面应该怎么写阿?
end;

 
拦截错误当然要在ClientSocket1Error里面 为什么要在read里?
 
因为是视频传输的问题。我查到是数据传输回来的时候缓冲的问题。但是read里面也可以用。但是怎么用??
 
加一个try试试。
 
to:ranksun

怎么加??能否说明白一点?
 
我无法测试,也只是想法而已,

try
//代码
except
//
end;
 
to:ranksun

no way
 
明白你的意思了,就是你经常接收到一些非法的数据,导致程序运行时出现错误,

在socket里经常有这样的问题,你要写数据格式封装你的数据,收到数据后要校验,是不是

你发的数据,当然,发送数据的时候也要按格式发送,还有,注意处理 net tel 。。

 
to:ranksun,
你帮我看看代码,出事那里我做了注释

procedure Tform1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
S: string;
MyBmp: TBitmap;
MyJpg: TJpegimage;
begin
StatusBar1.SimpleText := '正在接收来自 '+computername+' 的数据......';
if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
begin
S := Socket.ReceiveText;
MySize := Strtoint(S); {设置需接收的字节数}
Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}
end
else
begin {以下为图象数据接收部分}
MyReceviceLength := socket.ReceiveLength; {读出包长度}
StatusBar1.SimpleText := '正在接收 '+computername+' 的数据,数据大小为: ' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
MyStream.Position := 0;
MyBmp := tbitmap.Create;
MyJpg := tjpegimage.Create;
try
MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
MyBmp.Assign(MyJpg); {将JPG转为BMP}
StatusBar1.SimpleText := '正在监视 '+computername+' 的屏幕';
form2.Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
finally {以下为清除工作 }
MyBmp.free;
MyJpg.free;
MyStream.Clear;
MySize := 0;
sleep(50);//这里可以调大一点。但是,不现实~!!!
Socket.SendText('cam');//添加此句即可连续抓屏 }
/////////////////////////////////我现在是连续抓屏幕,但是会出错。这怎么搞??
end;
end;
end;
end;
 
在ClientSocket1Read中定义MyClientSocketError方法,当触发ClientSocket1Error时转给MyClientSocketError处理(ClientSocket1.OnError := MyClientSocketError;)
 
能否具体一点??
 
还是出错。是不是我的格式不对??帮我看看吧~!!
procedure TForm1.MyClientSocketError;
begin
..........
.........
end;
然后在read里面写
StatusBar1.SimpleText := '正在监视 '+computername+' 的屏幕';
form2.Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
form1.ClientSocket1.OnError:=MyClientSocketError;//这里出错。是不是格式不对??
finally {以下为清除工作 }


 
呵呵,不明白呀不明白,为什么不能在ClientSocket1Error里屏蔽错误信息,而一定要在ClientSocket1Read中屏蔽?要不你干脆用winsock API吧,可以完全控制错误的处理。
 
to:ego 你是不是说这样??我就是因为这样不行才找问题。发现是在read的过程中。缓冲出了问题。你看看jingtao的那篇流的应用。你就会明白我与上什么问题了~!!!
procedure Tform1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Errorcode := 0; {不弹出出错窗口}
end;
 
你的MyClientSocketError方法的参数必须与ClientSocket1Error相同
 
socket.OnErrorEvent :=form1.ClientSocket1.OnError ;

好像还是不行~!!!

其实就是jingtao的那段屏幕传输的问题。连续传输就会出错。怎么解决?
 
在error事件中加上errorcode=0试试
 
后退
顶部