Delphi 聊天室(带QQ表情)--Server端

时间:2008-08-16 01:40:52  类别:QQ  作者:向我开炮

//////////////////////////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\ 文件下。



特别推荐

广而告之