//////////////////////////Server////////////////////////////

var
AllUserList:string;//所有人
procedure TFrmServer.ServerSocket_ChatClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
strNick:string;
isDel:boolean;
begin
//清空在线用户名单
AllUserList:='';
isDel:=false;
//在用户列表中删除离开用户
for i:=0 to UserList.Items.count -1 do
begin
if not isDel then
if socket.RemoteAddress=UserList.Items[i].subitems[0] then
begin
strNick:= UserList.Items[i].caption;
UserList.Items.Item[i].Delete();
isDel:=true;
end
end;
//重新构造在线用户名单
for i:=0 to UserList.Items.count -1 do
begin
AllUserList:=AllUserList+'~'+ UserList.Items[i].caption;
end;
//向所有在线用户广播用户离开指令和在线用户名单
for i:=0 to ServerSocket_Chat.Socket.ActiveConnections-1 do
ServerSocket_Chat.Socket.Connections[i].SendText('del~'+strNick+AllUserList+'~');
end;
procedure TFrmServer.ServerSocket_ChatClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var strReceive,strCom,strContent,strNick,strFriend:string;
n,i:integer;
newItem:TListItem;
begin
//获取客户端发送的请求消息
strReceive:= Socket.ReceiveText;
//解析请求消息
n:=pos('~',strReceive);
if n>0 then
begin
//获取请求指令类型
strCom:=copy(strReceive,1,n-1);
//处理客户端的广播聊天请求
if strCom='public' then //public~content
begin
//获取聊天内容
strContent:=copy(strReceive,n+1,length(strReceive)-n);
//构造消息应答,并将应答消息发送给所有在线客户端
for i:=0 to ServerSocket_Chat.Socket.ActiveConnections-1 do
begin
ServerSocket_Chat.Socket.Connections[i].SendText('talk~'+strContent);
end;
end;
//处理客户端的私聊请求
if strCom='private' then //private~nick~nick~content
begin
//获取请求内容
strContent:=copy(strReceive,n+1,length(strReceive)-n);
//获取消息发送者昵称
strNick:= copy(strContent,1,pos('~',strContent)-1);
strContent:=copy(strContent,pos('~',strContent)+1,length(strContent)-pos('~',strContent));
//获取消息接收者昵称
strFriend:= copy(strContent,1,pos('~',strContent)-1);
//获取消息内容
strContent:=copy(strContent,pos('~',strContent)+1,length(strContent)-pos('~',strContent));
//构造消息应答,并将应答消息发送给消息接收者
for i:=0 to ServerSocket_Chat.Socket.ActiveConnections-1 do
begin
if UserList.Items.Item[i].Caption = strFriend then
ServerSocket_Chat.Socket.Connections[i].SendText('talk~'+strContent);
end;
end;
//处理客户端的登录服务器请求
if strCom='request' then //request~nick
begin
//获取登录用户昵称
strNick:=copy(strReceive,n+1,length(strReceive)-n);
//检查是否存在重名用户,如果有则返回错误应答消息
for i:= 0 to UserList.Items.Count -1 do
begin
if UserList.Items.Item[i].Caption = strNick then
begin
ServerSocket_Chat.Socket.Connections[UserList.Items.Count].SendText('err~'+strNick);
exit;
end;
end;
//将登录用户添加到在线用户列表
newitem:=UserList.Items.insert(UserList.Items.count);
newitem.caption:=strNick;
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(socket.RemoteHost);
AllUserList:=AllUserList+'~'+strNick;
//向所有在线用户广播用户登录消息
for i:=0 to ServerSocket_Chat.Socket.ActiveConnections-1 do
begin
ServerSocket_Chat.Socket.Connections[i].SendText('add'+AllUserList+'~');
end;
end;
end;
end;
///////////////////////////注意////////////////////////////
在本程序中需要引用到一些文件 ImageOleLib_TLB,此文件在QQ中就可以找到,或者从网上下载也可以得到。Face.dll文件,该文件主要用来存储表情的标识和文件名。文件内容为:
0.gif
/000
1.gif
/001
2.gif
/002
依次向下,添加您的表情数量。当然,您要在本地的路径下保存您定义的表情,存储在:当前路径\Face\ 文件下。