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

📄 unitmessage.~pas

📁 企业通comicq是一个通讯工具软件,一个通讯工具软件
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
procedure TTYICQ.SendLoginMsg(const IP:String);
var
  Msg:String;
begin
  Login := True;
  Msg   := Format('%-1s%-15s%-6s%-255s',[Mp_CHAT,LocalIP,'Login',ComputerName]);
  Msg   := Trim(Msg);
  breadText := True;       //置接收状态为读文本
  ClientSocket.Socket.SendText(Msg);
end;

procedure TTYICQ.SendLogoutMsg;
var
  Msg:String;
  i:integer;
  MsgLen:integer;
  MyStream:TMemoryStream;
begin
  Login := False;
  Msg   := Format('%-15s%-6s',[LocalIp,'Logout']);
  for i:=0 to IPList.Count-1 do
  begin
    UDP.RemoteHost := IPList[i];
    Msg      := Format('%-15s%-6s%-255s',[LocalIP,'Logout',UserNameList[i]]);
    Msg      := trim(Msg);
    MsgLen   := Length(Msg);
    MyStream := TMemoryStream.Create;
    MyStream.Write(Msg[1],MsgLen);
    UDP.SendStream(MyStream);
    MyStream.Free;
  end;
end;

procedure TTYICQ.ReceivedLoginMsg(const FromIP,Msg:String);
//接收到了登录信息
var
  RemoteComputerName:String;
begin
  if FindIP(FromIP)=-1 then
    begin
      RemoteComputerName := Msg;
      AddUser(FromIP,RemoteComputerName);
      SendLoginMsg(FromIP);
    end;
end;

procedure TTYICQ.ReceivedLogoutMsg(const FromIP:String);
//接收到了退出信息
begin
  DelUser(FromIP);
end;

procedure TTYICQ.ReceivedBroadCastMsg(const FromIP,Msg:String);
//接收到了广播信息,用于聊天室
//头信息
//1、'InRoom':进入房间
//2、'OtRoom':出房间
//3、'ChatMg':聊天信息
var
  Header:String;
begin
  if not InChatRoom then exit;
  Header := Copy(Msg,1,HeaderLen);
  if Header='InRoom' then
  begin
    ReceivedInRoomMsg(FromIP,Copy(Msg,HeaderLen+1,Length(Msg)-HeaderLen));
    exit;
  end;
  if Header='OtRoom' then
  begin
    ReceivedOutRoomMsg(FromIP);
    exit;
  end;
  if Header='ChatMg' then ReceivedChatRoomMsg(FromIP,Copy(Msg,HeaderLen+1,Length(Msg)-HeaderLen));
end;

procedure TTYICQ.ReceivedChatMsg(const FromIP,Msg:String);
//接收到了个人的聊天信息
begin
  //if FromIP=LocalIP then  //自己不应该给自己发信息吧 :)
  //  exit;
  ReceivedMsgForm := FindWindowByIP(FromIP);

  if ReceivedMsgForm=Nil then
    ReceivedMsgForm := TReceivedMsgForm.Create(Nil);

  ReceivedMsgForm.FromIP := FromIP;
  ReceivedMsgForm.RemoteComputerName := GetComputerNameByIP(FromIP);
  ReceivedMsgForm.MsgList.Add(Msg);
  with ReceivedMsgForm do
  begin
    Show;
    Application.BringToFront;
  end;
end;

procedure TTYICQ.SendInRoomMsg(const IP,NickName: String;const Echo:Boolean);
//广播进入聊天室的信息
var
  Msg:String;
begin
  if Echo then
    Msg:=Format('%-15s%-6s%-6s',[LocalIP,'Broad','InRoom'])+'1'+NickName
  else
    Msg:=Format('%-15s%-6s%-6s',[LocalIP,'Broad','InRoom'])+'0'+NickName;

  SendMsg(IP,Msg);
end;

procedure TTYICQ.SendOutRoomMsg;
//广播离开聊天室的信息
var
  Msg:String;
begin
  Msg := Format('%-15s%-6s%-6s',[LocalIP,'Broad','OtRoom']);
  SendMsg(BroadCastIP,Msg);
end;

procedure TTYICQ.SendChatRoomMsg(const IP,Msg: String);
//广播聊天消息
var
  s:String;
begin
  s := Format('%-15s%-6s%-6s',[LocalIP,'Broad','ChatMg'])+Msg;
  SendMsg(IP,s);
end;

procedure TTYICQ.ReceivedOutRoomMsg(const FromIP: String);
//收到出聊天室信息
begin

end;

procedure TTYICQ.ReceivedInRoomMsg(const FromIP,UserName:String);
begin

end;

procedure TTYICQ.ReceivedChatRoomMsg(const FromIP,Msg:String);
begin

end;

procedure TTYICQ.SaveSysConfig(ServerIP,Port,UpdateURL:string;IsAutoUpdate:boolean);
begin
  SaveSysConfigFile(ServerIP,Port,UpdateURL,IsAutoUpdate);
end;


procedure TTYICQ.SaveSysUser(UserName,IP:string);
begin
  SaveSysUserFile(UserName,IP);
end;

function TTYICQ.GetUserList:string;
begin
  Result := GetUserListFile;
end;

procedure TTYICQ.SendFile(FileName:string;SendSocket: TCustomWinSocket;Header:string);
var
  Msg:string;
begin
  bReadText := True;       //置接收状态为读文本

  Msg   := Format('%-1s%-15s%-6s%-255s',[MP_QUERY,LocalIP,Header,FileName]);
  Msg   := Trim(Msg);
  SendSocket.SendText(Msg);
end;

procedure TTYICQ.ReceiveData(Socket:TCustomWinSocket;UserListBox:TListView);
var
  sTemp:string;
  iRecvLength:integer;
  SaveDialog1:TSaveDialog;
  TrueFromIP,Header,Msg:string;
  FileName:string;
  FileSize,FilePosition:integer;
  i:integer;
  MyStream:TMemoryStream;
  MsgLen:integer;
begin
  if bReadText then
  begin
    sTemp    := '';
    FileSize := Socket.ReceiveLength;
    setlength(sTemp,FileSize);
    sTemp := trim(Socket.ReceiveText);
    if sTemp='' then Exit;
    case sTemp[1] of
      MP_QUERY:
      begin
        //如果是接收用户列表,则无需弹出对话框来选择存储文件路径
        Header      := Trim(Copy(sTemp,1+IPLen+1,HeaderLen));
        Msg         := Format('%-1s%-15s%-6s%-255s',[MP_ACCEPT,Socket.RemoteAddress,Header,Copy(sTemp,1+IPLen+HeaderLen+1,Length(sTemp)-IPLen-HeaderLen-1)]);
        Msg         := Trim(Msg);
        FileName    := ExtractFilePath(application.exename)+Copy(sTemp,1+IPLen+HeaderLen+1,Length(sTemp)-IPLen-HeaderLen-1);
        if Header<>'Login' then
        begin
          SaveDialog1 := TSaveDialog.Create(nil);
          SaveDialog1.FileName := FileName;
          if SaveDialog1.Execute then
          begin
            SaveDialog1.Free;
            fsRecv := TFileStream.Create(SaveDialog1.FileName,fmCreate);

            Socket.SendText(Msg);
          end
          else
          begin
            SaveDialog1.Free;
            Socket.SendText(MP_REFUSE);//不选择保存路径,拒绝接收文件
          end;
        end
        else
        begin
          fsRecv := TFileStream.Create(FileName,fmCreate);
          Socket.SendText(Msg);
        end
      end;

      MP_FILEPROPERTY:
      begin
        //时间进度显示。。。
        bReadText := false;     //置处理为接收数据状态
        Socket.SendText(MP_DATA);
      end;

      MP_END:
      begin
        if ((fsRecv<>nil) or (fsSend<>nil)) then
        begin
          if fsRecv<>nil then
          begin
            fsRecv.Free;
            fsRecv := nil;
          end;
          if fsSend<>nil then
          begin
            //fsSend.Free;
            fsSend := nil;
          end;
          bReadText := true;

          //====================================================
          //用户列表接收成功,更新到界面上(状态为LOGIN才能做)
          //====================================================
          LocalIp := Socket.RemoteAddress;
          GetUserInfo(UserNameList,IPList);
          UserListBox.Items.Clear;
          for i:=0 to UserNameList.Count-1 do
          begin
            UserListBox.AddItem(UserNameList[i],UserListBox);
            UserListBox.Items.Item[i].ImageIndex := 2;
          end;

          //向除目前要求登录用户以外的所有的用户发送用户登录消息

          for i:=0 to IPList.Count-1 do
          begin
            //If IPList[i]<>Socket.RemoteAddress then
            begin
              MyStream := TMemoryStream.Create;
              UDP.RemoteHost := trim(IPList[i]);
              Msg      := Format('%-15s%-6s%-255s',[Socket.RemoteAddress,'Login',ComputerName]);
              Msg      := trim(Msg);
              MsgLen   := Length(Msg);
              SetLength(Msg, MsgLen);
              MyStream.SetSize(MsgLen);
              MyStream.Write(Msg[1],MsgLen);
              UDP.SendStream(MyStream);
              MyStream.Free;
            end;
          end;
          //通知服务器接收用户列表成功
          Socket.SendText(MP_END);
        end;
      end;

      MP_ACCEPT:
      begin
        FileName    := ExtractFilePath(application.exename)+Copy(sTemp,1+IPLen+HeaderLen+1,Length(sTemp)-IPLen-HeaderLen-1);

        fsSend   := TFileStream.Create(FileName,fmOpenRead);
        //iBYTEPERSEND是个常量,每次发送包的大小。
        Socket.SendText(MP_FILEPROPERTY);
      end;

      MP_DATA:
      begin
      try
        FileSize := fsSend.Size;
        FilePosition := fsSend.Position;
        GetMem(bufSend,MP_BYTEPERTRANSFER+1);

        if ((FilePosition+1+MP_BYTEPERTRANSFER) < FileSize) then
        begin
          fsSend.Read(bufSend^,MP_BYTEPERTRANSFER);
          Socket.SendBuf(bufSend^,MP_BYTEPERTRANSFER);
          //fsSend.Free;
        end//普通的发送,大小为iBYTEPERSEND
        else
        begin
          if ((FilePosition+1<FileSize)=True) then
          begin
            fsSend.Read(bufSend^,FileSize-FilePosition-1);
            Socket.SendBuf(bufSend^,FileSize-FilePosition-1);
            fsSend.Free;
          end
          else
          begin
            Socket.SendText(MP_END);
          end;
        end;//最后一次发送,发送剩余的数据
      finally
        FreeMem(bufSend,MP_BYTEPERTRANSFER+1);
      end;{of try}
      end;
      

      MP_ABORT:
      begin
        fsRecv.Free;
        bReadText := true;
      end;

      MP_CHAT:
      begin
        //Chat Msg
        TrueFromIP := Socket.RemoteAddress;
        Header     := Trim(Copy(sTemp,1+IPLen+1,HeaderLen));
        Msg        := Copy(sTemp,1+IPLen+HeaderLen+1,Length(sTemp)-IPLen-HeaderLen-1);

        //====================================================
        //服务器处理代码
        //====================================================
        if (Header='Login')then
        begin
          //修改用户列表
          SaveSysUser(Msg,Socket.RemoteAddress);
          //发出传输用户列表到客户端的指令
          SendFile(GetUserList,Socket,'Login');
        end;
        //====================================================

        if (Header='Logout') then
          ReceivedLogoutMsg(TrueFromIP);
        if (Header='Broad') then
          ReceivedBroadCastMsg(TrueFromIP,Msg);
        if (Header='Chat') then
          ReceivedChatMsg(TrueFromIP,Msg);
      end;
    end;{of case}
  end
  else
  begin
    try
      GetMem(bufRecv,MP_BYTEPERTRANSFER);//2000 must >iBYTESEND
      iRecvLength := Socket.ReceiveLength-1;

      Socket.ReceiveBuf(bufRecv^,iRecvLength);
      fsRecv.WriteBuffer(bufRecv^,iRecvLength);
      bReadText := True;

      //接收到的数据长度小于预定义的传输数据包长度,则为最后一批数据
      if (iRecvLength<MP_BYTEPERTRANSFER-1) then
        Socket.SendText(MP_END)
      else
        Socket.SendText(MP_DATA);
    finally
      FreeMem(bufRecv,MP_BYTEPERTRANSFER);
    end;{of try}
  end;
end;

procedure TTYICQ.GetUser(var UserList,IPList:TstringList);
begin
  GetUserInfo(UserList,IPList);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -