📄 unitmessage.~pas
字号:
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 + -