各位老师好,小弟在学习INDY,想做一个类似QQ那样的局网通信软件。
就是生成一个在线列表,双击图标之后,生成一个窗口能够互传信息。
并且能够同时和多个人说话,只要是1对1就行。于是想动态生成UDPServer,其他部分完成,
可是在端口监听部分出现了问题。UDPRead不执行。
我的代码片段
TMyUDP=class(TComponent)//定义个对象,事件和udpread一样。我觉得这里有问题
public
procedure myUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
end; TFchat = class(TForm)
_do: TADOQuery;
L3: TLabel;
........
private
{ Private declarations }
_userID, _myID , _name, _myIP, _objIP, _chatSession: string;
_objport, _myport : integer; //目标端口
public
{ Public declarations }
end;var
Fchat: TFchat;
testPort: TServerSocket;
UDPS : TIdUDPServer;
myUDPServer : TMyUDP;procedure TFchat.FormShow(Sender: TObject);
var filename, _sql, _now: string;
begin
..........
_myip := NameToIP(GetHostName);//获取本机IP
_objip := _do.Fields[0].AsString;//从数据库取目标ip,之前的sql语句我删除了
UDPS := TIdUDPServer.Create(nil);//生成udp
myUDPServer := TmyUDP.Create(nil);
UDPS.Bindings.Clear;
UDPS.Bindings.Add.IP := NameToIP(GetHostName);
UDPS.DefaultPort := _myport;
UDPS.OnUDPRead := myUDPServer.myUDPRead;
UDPS.Active := true;
PortCaption.Caption := '当前IP : '+_myip +' 使用端口: ' + inttostr(_myport) + ' 对方IP:'+_objIP+'对方端口:'+inttostr(_objPort);
Chat.Clear;
Msg.SetFocus;
end;procedure TMyUDP.myUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var theMessage, appMessage:string;
getMessage:TStringList;
begin
theMessage := BytesToString(AData);
if theMessage <> '' then begin
getMessage := TStringList.Create;
ExtractStrings(['|'], [' '], pchar(theMessage), getMessage);
if getMessage[0] = 'Msg' then begin
Fchat.Chat.SelAttributes.Color := clBlack;
Fchat.Chat.SelAttributes.Size := 11;
Fchat.Chat.SelAttributes.Name := '宋体';
Fchat.Chat.Lines.Append(getMessage[1]);
end;
getMessage.Free;
end;
end;
琢磨了很久,百度也没有解决。于是来这里请教各位老师,帮我指点一下。
能有代码例子更是感激。
我的QQ 49987968
就是生成一个在线列表,双击图标之后,生成一个窗口能够互传信息。
并且能够同时和多个人说话,只要是1对1就行。于是想动态生成UDPServer,其他部分完成,
可是在端口监听部分出现了问题。UDPRead不执行。
我的代码片段
TMyUDP=class(TComponent)//定义个对象,事件和udpread一样。我觉得这里有问题
public
procedure myUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
end; TFchat = class(TForm)
_do: TADOQuery;
L3: TLabel;
........
private
{ Private declarations }
_userID, _myID , _name, _myIP, _objIP, _chatSession: string;
_objport, _myport : integer; //目标端口
public
{ Public declarations }
end;var
Fchat: TFchat;
testPort: TServerSocket;
UDPS : TIdUDPServer;
myUDPServer : TMyUDP;procedure TFchat.FormShow(Sender: TObject);
var filename, _sql, _now: string;
begin
..........
_myip := NameToIP(GetHostName);//获取本机IP
_objip := _do.Fields[0].AsString;//从数据库取目标ip,之前的sql语句我删除了
UDPS := TIdUDPServer.Create(nil);//生成udp
myUDPServer := TmyUDP.Create(nil);
UDPS.Bindings.Clear;
UDPS.Bindings.Add.IP := NameToIP(GetHostName);
UDPS.DefaultPort := _myport;
UDPS.OnUDPRead := myUDPServer.myUDPRead;
UDPS.Active := true;
PortCaption.Caption := '当前IP : '+_myip +' 使用端口: ' + inttostr(_myport) + ' 对方IP:'+_objIP+'对方端口:'+inttostr(_objPort);
Chat.Clear;
Msg.SetFocus;
end;procedure TMyUDP.myUDPRead(Sender: TObject; AData: TBytes;
ABinding: TIdSocketHandle);
var theMessage, appMessage:string;
getMessage:TStringList;
begin
theMessage := BytesToString(AData);
if theMessage <> '' then begin
getMessage := TStringList.Create;
ExtractStrings(['|'], [' '], pchar(theMessage), getMessage);
if getMessage[0] = 'Msg' then begin
Fchat.Chat.SelAttributes.Color := clBlack;
Fchat.Chat.SelAttributes.Size := 11;
Fchat.Chat.SelAttributes.Name := '宋体';
Fchat.Chat.Lines.Append(getMessage[1]);
end;
getMessage.Free;
end;
end;
琢磨了很久,百度也没有解决。于是来这里请教各位老师,帮我指点一下。
能有代码例子更是感激。
我的QQ 49987968
我在ide里逐步执行,发现TMyUDP.myUDPRead 没有执行过