⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainunit.pas

📁 以前写的一个利用P2P 技术的一个通讯的例子。里面用到了 DBISAM 、INDY 控件。
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   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 + -