麻烦大家看一下这个聊天程序,为什么不能通信啊???online.... ( 积分: 100 )

  • 主题发起人 gigglegile
  • 开始时间
G

gigglegile

Unregistered / Unconfirmed
GUEST, unregistred user!
刚开始学udp,在网上下了一段代码,是用来聊天的,我在局域网上的两台电脑上测试,可是并不能通信,请问是什么原因???
代码如下:


Indy Udp聊天实例

unit frmMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, IdBaseComponent, IdComponent,
IdUDPBase, IdUDPClient, IdAntiFreezeBase, IdAntiFreeze, IdUDPServer,
IdSocketHandle;

type
TCommBlock = record // 通讯结构
SenderName, // 发信方名字
Msg : string[100]; // 消息
end;

TFrmChat = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
RemoteIP: TLabeledEdit;
RemotePort: TLabeledEdit;
NickName: TLabeledEdit;
LocalPort: TLabeledEdit;
InputBox: TEdit;
BitSend: TBitBtn;
IdUDPClient: TIdUDPClient;
ChatLog: TMemo;
IdUDPServer: TIdUDPServer;
BitSet: TBitBtn;
procedure BitSendClick(Sender: TObject);
procedure IdUDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
procedure BitSetClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmChat: TFrmChat;

implementation

const
RECIEVETIMEOUT = 5000; // 毫秒

{$R *.dfm}

procedure TFrmChat.BitSendClick(Sender: TObject);
var
Comm:TCommBlock;
begin
Comm.SenderName:=NickName.Text;
Comm.Msg:=InputBox.Text;
ChatLog.Lines.Add(Comm.SenderName+':' + Comm.Msg);
IdUDPClient.SendBuffer(Comm,sizeof(Comm));
end;

procedure TFrmChat.IdUDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
Comm : TCommBlock;
begin
AData.ReadBuffer(Comm,AData.Size);
ChatLog.Lines.Add(Comm.SenderName+':'+Comm.Msg);
end;

procedure TFrmChat.BitSetClick(Sender: TObject);
begin
IdUDPClient.Host := RemoteIP.Text;
IdUDPClient.Port := StrToInt(RemotePort.Text);
IdUDPClient.ReceiveTimeout := RECIEVETIMEOUT;
IdUDPServer.DefaultPort := StrToInt(LocalPort.Text);
IdUDPServer.Active := True;
BitSend.Enabled:=True;
end;

end.
 
udp通讯,用一个idudpserver就够了,此东东既能收又能发。
具体可以看我给出的一个demo例子,实现了广播和定向收发。
http://ufo2003.ys168.com
在“我的源码”目录内,打开页面后点击文字“我的源码”不要去点那个文件夹图标
然后下载那个 udpdll.rar
 
我先看看!
 
ufo:
网页打不开呀!!!
 
那你再试试这个 http://f.ys168.com/?ufo2003
我这里是可以打开的,永硕的网盘还是比较稳定的,如果还打不开,你给个邮箱,我发给你
 
不好意思,已经下载了!
现在正在学习中!!
 
頂。。。。。。。。。。
 
大家能不能看看这个程序到底为什么不能进行通信!
难道是一些属性我没有设置正确??
 
哥们,你要使用 IdUDPClient.SendBuffer(Comm,sizeof(Comm));
这样的语句,那么必须设置如下参数:
idudpclient1.Host:= 'ip';
idudpclient1.Port:='目标端口';

或者这样:IdUDPClient.SendBuffer('192.168.1.20',1080,Comm,sizeof(Comm));
 
好的,ufo老大!
我会努力的,等着我的好消息!!
 
我在BitSendClick中添加
IdUDPClient.Host := RemoteIP.Text;
IdUDPClient.Port := StrToInt(RemotePort.Text);
但是还是不行啊!
ufo:谢谢你了,看来我要明天来解决这个问题了!
 
1.接收方程序的server端口是否已经启动监听?
2。接收方是否有网络防火墙阻挡了数据包?
3。RemoteIP.Text里面是否是正确的接收方ip?
4。StrToInt(RemotePort.Text);是否是正确的接收方开放的端口号?
5。有用我的那个demo程序试过吗?是否可以正常收发?
 
UFO:
1:在BitSetClick事件中有IdUDPServer.Active := True;
2:没有网络防火墙,因为你的demo可以正常通过!
3:RemoteIP.Text的ip地址是正确的,可以用showmessage()来查看!
4:同3一样,可以用showmessage()来查看!
5:你的demo可以正常收发!!
 
这个程序很简单啊。
你看看这两个端口是否一致:
IdUDPClient1.Port := ;
IdUDPServer1.DefaultPort := ;

如果这两个端口设置不同,你是收不到数据的。
为稳妥起见,我把上面的代码试着运行了一下,在本机可以通讯(我这只有一台电脑)
 
ufo:
程序可以了!
不知道是什么原因,现在还是原来的代码,又能通信了!
估计是电脑的问题!
真实不好意思,麻烦你了!不过还是好好谢谢你![:D]
还有一个问题问一下:IdUDPServer中有一个bindings属性,我有时候点开它,然后再执行程序的时候就会报错,请问是怎么回事??
 
bindings是绑定ip,有些电脑有多ip,而你只需监听某指定ip就行,设置这个属性后会忽略发给其他ip的数据。
 
Thank you !!
接分了!!1
 
顶部