我用NMUDP写了一个局域网内的聊天小程序,存在一个奇怪的问题,我可以给自己发送消息,但是不能给局域网内的别的机器发送消息,但是,如果我在两台机器上先分别给自己发送消息(可以发送成功),然后在互相发送消息,就可以发送成功了,也就是说,必须先给自己发送一条消息后才可以发送消息给别的机器,请教高手这是什么原因,我跟踪代码,发现是TNMUDP空间的OnDataReceived事件时如下代码出现错误:procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
MyReciveTxt: String;
begin
MyStream := TMemoryStream.Create; {建立流}
try
NMUDP1.ReadStream(MyStream);{接收流} ----》出错!!!
SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数}
MyStream.Read(MyReciveTxt[1],NumberBytes);{读数据}
//MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt);
MsgHistory.Lines.Add(MyReciveTxt);
finally
MyStream.Free; {释放流}
end;
end;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream: TMemoryStream;
MyReciveTxt: String;
begin
MyStream := TMemoryStream.Create; {建立流}
try
NMUDP1.ReadStream(MyStream);{接收流} ----》出错!!!
SetLength(MyReciveTxt,NumberBytes);{NumberBytes为接收到的字节数}
MyStream.Read(MyReciveTxt[1],NumberBytes);{读数据}
//MemoReceive.Lines.Add('接收到来自主机'+FromIP+'的信息:'+MyReciveTxt);
MsgHistory.Lines.Add(MyReciveTxt);
finally
MyStream.Free; {释放流}
end;
end;
解决方案 »
- C#基于access的成绩录入系统
- Delphi中的ShellTreeview控件里的目录或文件能否多选中?
- 我想在Form_Close事件中用Initialization节却出现“Statement expected but 'INITIALIZATION' found”错误
- 请教控件隐藏规律问题,在线等
- 小问题急
- 利用决策立方控件做多维统计,最终结果不一致?
- 关于线程问题,请教各位高手
- 不懂就问
- 谁知道Excel剪切板的数据格式
- 什么是DELPHI?
- ActiveX 控件在IE中使用,提示DAX Access错误,请liuxiaowei (巍巍)来帮忙!
- 请问我在DEPHI自带的安装程序installshield里,怎么样才能把BDE捆绑进去呀,
解决方法
begin
这里加
if NumberBytes<=0 then
return;
这样就可以避免自己收自己,因为这时NumberBytes=-1;
我的经验是这样的,如果可以确定,最好是NumberBytes<=0或Port!=9999或FromIP!=NMUDP1.RemoteHost都跳出接收