📄 mainunit.pas
字号:
if _IsLogin = IsTrue then
begin
ServerIP := _PeerIP;
ServerPORT := _PeerPORT;
MyPublicIP := LogonData.MyPublicIP;
MyPublicPORT := StrToInt(LogonData.MyPublicPORT);
MyAccount := LogonData.Account;
SendMsgButton.Enabled := true;
P2PTestButton.Enabled := true;
LogoutButton.Enabled := true;
LogonButton.Enabled := false;
StatusBar1.Panels.Items[0].Text := '登录成功...';
end;
end;
//接收到用户注销处理
function TClient.ProcRecvLogoutData(ThisBinding: TIdSocketHandle; LogoutData: TLogoutData): boolean;
var
_Account, _tempIP, _PeerIP: string;
i, TheTag, _tempPort, _PeerPORT: Integer;
_tempUserBasicInfo: TServerUserBasicInfo;
LogoutDataPackage: TLogoutDataPackage;
begin
_Account := LogoutData.Account;
if _Account = MyAccount then
begin
MyAccount := '';
MyPublicIP := '';
MyPublicPort := 0;
SendMsgButton.Enabled := false;
P2PTestButton.Enabled := false;
LogonButton.Enabled := true;
LogoutButton.Enabled := false;
end
else //好友离线
begin
for i := 0 to UserList.Items.Count - 1 do
begin
if UserList.Items.Item[0].Caption = _Account then
begin
UserList.Items.Delete(i);
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']Frien is Offline,From:[' + _Account + '] ');
Break;
end;
end;
end;
_PeerIP := thisbinding.PeerIP;
_PeerPORT := thisbinding.PeerPort;
end;
//收到好友列表处理
function TClient.ProcRecvFriendData(ThisBinding: TIdSocketHandle; UserData: TUserData): Boolean;
var
_Account, _FriendIP, _FriendPort: string;
tempItem: TListItem;
HandDataPackage: THandDataPackage;
begin
_Account := UserData.Account;
_FriendIP := UserData.IP;
_FriendPort := UserData.PORT;
if UserData.IsFirstOne = IsTrue then
begin
UserList.Items.Clear;
end;
tempItem := UserList.Items.Add;
tempItem.Caption := _Account;
tempItem.SubItems.Add(_FriendIP);
tempItem.SubItems.Add(_FriendPort);
with HandDataPackage do
begin
Head.MsgType := IntToStr(HandSign);
StrPCopy(Body.Account, MyAccount);
StrPCopy(Body.Mark, '');
StrPCopy(Body.DesIP, MyPublicIP);
StrPCopy(Body.DesPORT, IntToStr(MyPublicPORT));
StrPCopy(Body.NeedReBack, IsTrue);
//
end;
UdpClient.SendBuffer(_FriendIP, StrToInt(_FriendPort), HandDataPackage, SizeOf(HandDataPackage));
end;
//处理握手P2P请求
function TClient.ProcRecvP2PData(ThisBinding: TIdSocketHandle; HandData: THandData): boolean;
var
_Account, Mark, toIP, toPort: string;
HandDataPackage: THandDataPackage;
tempItem: TListItem;
begin
_Account := HandData.Account;
toIP := HandData.DesIP;
toPort := HandData.DesPORT;
Mark := HandData.Mark;
if HandData.NeedReBack = IsTrue then
begin
with HandDataPackage do
begin
Head.MsgType := IntToStr(HandSign);
Body.Account := HandData.Account;
Body.DesIP := HandData.DesIP;
Body.DesPORT := HandData.DesPORT;
Body.NeedReBack := IsFalse;
//Head.DataSize:=SizeOf(HandDataPackage);
end;
if HandData.IsDirected = IsTrue then
UdpClient.SendBuffer(ThisBinding.PeerIP, ThisBinding.PeerPort, HandDataPackage, SizeOf(HandDataPackage))
else
UdpClient.SendBuffer(toIP, StrToInt(toPort), HandDataPackage, SizeOf(HandDataPackage));
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']Recv HandData,From:[' + _Account + '] [' + toIP + ':' + toPORT + '] SentBack!');
Sleep(1);
end
else
begin
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']Recv HandData,From:[' + _Account + '] [' + toIP + ':' + toPORT + '] ');
end;
if Mark = IsTrue then //是好友的上线信息
begin
tempItem := UserList.Items.Add;
tempItem.Caption := _Account;
tempItem.SubItems.Add(toip);
tempItem.SubItems.Add(toPort);
end;
end;
//处理聊天消息
function TClient.ProcRecvChatMsgData(ThisBinding: TIdSocketHandle; ChatData: TChatData): boolean;
var
ChatDataPackage: TChatDataPackage;
_fromAccount, _Msg: string;
begin
_fromAccount := ChatData.fromAccount;
_Msg := ChatData.Msg;
if ChatData.IsNeedReBack = IsTrue then
begin
with ChatDataPackage do
begin
Head.MsgType := IntToStr(ChatMsgSign);
StrPCopy(Body.fromAccount, MyAccount);
StrPCopy(Body.Msg, '');
StrPCopy(Body.IsNeedReBack, IsFalse);
StrPCopy(Body.IsReBackSigh, IsTrue);
//
UdpClient.SendBuffer(ThisBinding.PeerIP, ThisBinding.PeerPort, ChatDataPackage, SizeOf(ChatDataPackage));
end;
end;
//接收到的是消息
if ChatData.IsReBackSigh = IsTrue then
begin
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']Peer Recv ChatMsg OK,From:[' + _fromAccount + ']');
end
else
begin
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']Recv ChatMsg From:[' + _fromAccount + ']');
RecvEdit.Lines.Add('[' + IntToStr(RecvEdit.Lines.Count) + ']' + _Msg);
end;
end;
//发送消息
procedure TClient.SendMsgButtonClick(Sender: TObject);
var
ChatDataPackage: TChatDataPackage;
_ToIP, _SendMsg, _ToAccount: string;
_ToPORT: Integer;
tempItem: TListItem;
begin
tempItem := UserList.Selected;
if (not assigned(tempItem)) or (tempItem = nil) then
begin
MessageBox(self.Handle, '请选择消息接收者! ', '提示', 0);
exit;
end;
_ToAccount := tempItem.Caption;
_ToIp := tempItem.SubItems[0];
_ToPORT := StrToInt(tempItem.SubItems[1]);
_SendMsg := SendMsgEdit.Text;
if length(_SendMsg) > 500 then
exit;
with ChatDataPackage do
begin
Head.MsgType := IntToStr(ChatMsgSign);
StrPCopy(Body.fromAccount, MyAccount);
StrPCopy(Body.toAccount, _ToAccount);
StrPCopy(Body.Msg, _SendMsg);
if CheckBox1.Checked then
StrPCopy(Body.IsNeedReBack, IsTrue)
else
StrPCopy(Body.IsNeedReBack, IsFalse);
StrPCopy(Body.IsReBackSigh, IsFalse);
//
end;
UdpClient.SendBuffer(_ToIP, _ToPORT, ChatDataPackage, SizeOf(ChatDataPackage));
end;
procedure TClient.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CallLogout();
end;
//发送握手信息P2P
function TClient.SendHandData(toIP: string; toPORT: Integer): Boolean;
var
HandDataPackage: THandDataPackage;
LogoutDataPackage: TLogoutDataPackage;
begin
with HandDataPackage do
begin
Head.MsgType := IntToStr(HandSign);
StrPCopy(Body.Account, MyAccount);
StrPCopy(Body.DesIP, toIP);
StrPCopy(Body.DesPORT, IntToStr(toPORT));
StrPCopy(Body.NeedReBack, IsTrue);
StrPCopy(Body.IsDirected, IsTrue);
//Head.DataSize:=SizeOf(HandDataPackage);
end;
UdpClient.SendBuffer(toIP, toPort, HandDataPackage, SizeOf(HandDataPackage));
Sleep(1);
end;
procedure TClient.P2PTestButtonClick(Sender: TObject);
var
_ToIP, _SendMsg, _ToAccount: string;
_ToPORT: Integer;
tempItem: TListItem;
begin
tempItem := UserList.Selected;
if (not assigned(tempItem)) or (tempItem = nil) then
begin
MessageBox(self.Handle, '请选择消息接收者! ', '提示', 0);
exit;
end;
_ToAccount := tempItem.Caption;
_ToIp := tempItem.SubItems[0];
_ToPORT := StrToInt(tempItem.SubItems[1]);
SendHandData(_toIP, _ToPORT);
end;
procedure TClient.Button1Click(Sender: TObject);
begin
RecvEdit.Clear;
end;
procedure TClient.Button2Click(Sender: TObject);
begin
AboutBox := TAboutBox.Create(self);
AboutBox.ShowModal;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -