NMUDP出现EWriteError疑问?附代码 --快破产了:)(200分)

B

Blabber

Unregistered / Unconfirmed
GUEST, unregistred user!
我用NMUDP进行两台机器之间的通讯。假设是甲乙双方,两个均用sendstream和onDataReceived下的readStream来读。
现在假设乙方没有打开程序进行监听甲方,那么在甲方sedstream之后会触发甲方程序中的onDataReceived事件,
而此事件下的“NMUDP1.ReadStream(MyStream);”语句一执行就出现EWritrClass with message"Stream Write Error"的错误。
现在我想用异常处理来解决这个问题,但是根本没用。
问题:为什么会出现EWriteError而不是ReadError?
甲方发数据为什么会触发自己的DataReceived?
为什么我的异常处理不能起作用,该如何解决?
如何才能让甲方只管发数据而不管乙方是否接受?
BTW:这一切在乙方也打开程序的时候是不会出现的。
代码:
procedure TMain.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream : TMemoryStream;
order : string;
begin
MyStream := TMemoryStream.Create;
try
try //处理EWriteError异常???????
NMUDP1.ReadStream(MyStream);
except
On EWriteError do
sbBar.SimpleText := '控制端还没有进行接受准备!';
end;
SetLength(order,NumberBytes);
MyStream.Read(order[1],NumberBytes);
if order = 'run' then
begin
ShowMessage('run');
end
else if order = 'stop' then
begin
ShowMessage('STOP');
end;
finally
MyStream.Free;
end;
end;
 
procedure TMain.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream : TMemoryStream;
order : string;
begin
//add////////////////
if numberbytes=-1 then
exit;
//end add////////////////试试有没有用?
MyStream := TMemoryStream.Create;
try
try //处理EWriteError异常???????
NMUDP1.ReadStream(MyStream);
except
On EWriteError do
sbBar.SimpleText := '控制端还没有进行接受准备!';
end;
SetLength(order,NumberBytes);
MyStream.Read(order[1],NumberBytes);
if order = 'run' then
begin
ShowMessage('run');
end
else if order = 'stop' then
begin
ShowMessage('STOP');
end;
finally
MyStream.Free;
end;
end;
不是我的我不会去争,如果是我的一定要给我!!!!!!!!!!!!!1
 

在DataReceived事件中加下面这句就行了,
if NumberBytes=-1 then exit;

我以前也碰到过地也是问了好久才知道地
哈哈

可以结束了
 
哥哥快结帖吧,
当NMUDP1.ReadStream(MyStream);会触发NMUDP1DataReceived事件,
自然返回是一个空值,NumberBytes=-1,NMUDP1.ReadStream(MyStream);
这样你什么也读不出来,呵呵!
不是我的我不会去争,如果是我的一定要给我!!!!!!!!!
 
这分肯定给你!:)
你能解释一下吗?
甲方并没有ReadStream怎么会触发DataReceived事件呢?
我觉得DataReceived应该是由监听的端口有数据达到来触发的,然后在这一事件里面读数据。
 
其实DataReveived事件是一直在运行的,你看底层的SOCKET里,
服务器端为了收到信息,一般处理都是使用
While (1){ Recv(socket,……);}
在Socket里面,当有数据流入,Recv()>0,没有,那么Recv()<0;
所以,在你的程序里面,你没有判断是否有数据发到,就调用readstream()向mystream
写入数据,那么,自然就报EWrite的错误了。
Over
 
smallbee的回答很到位,因为大富翁2002先解决了问题,所以还是为他加130分。
如果不均,多多包涵:)
 
哈哈,分数有啥子用哦。

delphibbs得乐趣在于大家讨论问题并得出结果这个过程。^_^
 
顶部