在一本书上找到的一个聊天工具,请尽可能详细的注解下......服务器端:procedure TForm1.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
var
  newitem:TListItem;
  ii,jj:Integer;
  user,usercur:string;
begin
  newitem:=ListView1.Items.Insert(ListView1.Items.Count);
  newitem.Caption:='Client:'+IntToStr(ListView1.Items.Count);
  newitem.SubItems.Add(Socket.RemoteHost);
  newitem.SubItems.Add(Socket.RemoteAddress);
  newitem.SubItems.Add(IntToStr(Socket.RemotePort));
  //ListView1.AlphaSort();
  ListView1.Items.Item[ListView1.Items.Count-1].Selected:=true;
  Display('连接到主机:'+Socket.RemoteAddress+' 成功');
  ii:=ListView1.ItemIndex;
    Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
    ListView1.Items[ii].Caption+'加入进来!');
  user := listview1.Items[ii].Caption + '^' +
    listview1.Items[ii].SubItems[0] + '^'
    + listview1.Items[ii].SubItems[1] + '^'
    + listview1.Items[ii].SubItems[2];
  for jj := 0 to listview1.Items.Count - 1 do
  begin
    serversocket1.Socket.Connections[jj].SendText('增加用户@#!^' +
      user + '^'); 
  end;
  for jj := 0 to listview1.Items.Count - 2 do
  begin
    user := listview1.Items[jj].Caption + '^' +
      listview1.Items[jj].SubItems[0] + '^'
      + listview1.Items[jj].SubItems[1] + '^'
      + listview1.Items[jj].SubItems[2];
    serversocket1.Socket.Connections[ii].SendText('增加用户@#!^' +
      user + '^');  
  end;
end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ii,jj:integer;
  User:String;
begin
  for ii:=0 to ListView1.Items.Count-1 do begin
    if ListView1.Items.Item[ii].SubItems.Strings[2]=IntToStr(Socket.RemotePort) then begin
      for jj:=0 to ListView1.Items.Count -1 do begin
         user:=ListView1.Items[ii].Caption+'^'+ListView1.Items[ii].subitems[0]+'^'+
          ListView1.Items[ii].SubItems[1]+'^'+ListView1.Items[ii].subitems[2];
          ServerSocket1.Socket.Connections[jj].SendText('删除用户@#!^'+User+'^');
      end;
        Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
        ListView1.Items[ii].Caption+'走了!');
        ListView1.Items.Item[ii].Delete();
        Display(Socket.RemoteHost+'走了');
      end;
    end;
  if ListView1.Items.Count=0 then begin
    Display('获取信息......');
  end;
end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  tmpstr,User:string;
  ii,jj:integer;
  ListItem:TListItem;
  exist:bool;
begin
exist:=False;
tmpstr:=Socket.ReceiveText;
if getmaskstring(tmpstr,'^',1)='交谈@#!' then begin
for jj:=0 to ListView1.Items.Count -1 do begin
user:=getmaskstring(tmpstr,'^',2);
ServerSocket1.Socket.Connections[jj].SendText('交谈@#!^'+User+'^');
end;
Richedit1.Lines.Add(getmaskstring(tmpstr,'^',2));
end;
if getmaskstring(tmpstr,'^',1)='昵称@#!' then begin
for ii:=0 to ListView1.Items.Count-1 do begin
if Socket.RemotePort=StrToInt(ListView1.Items[ii].SubItems[2])
then begin
   exist:=true;
   if getmaskstring(tmpstr,'^',2)<>ListView1.Items[ii].Caption then
begin
  Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
  ListView1.Items[ii].Caption+' 更名为 '+
  getmaskstring(tmpstr,'^',2));
   ListView1.Items[ii].Caption:=getmaskstring(tmpstr,'^',2);
for jj:=0 to ListView1.Items.Count -1 do begin
user:=ListView1.Items[ii].Caption+'^'+ListView1.Items[ii].subitems[0]+'^'+ListView1.Items[ii].SubItems[1]+'^'+ListView1.Items[ii].subitems[2];
   ServerSocket1.Socket.Connections[jj].SendText('昵称@#!^'+User+'^');
end;
          end;
      end;
   end;
end;
end;客户端:procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  tmpstr:string;
  newItem:TListItem;
  ii:Integer;
  exist:bool;
  commHead:string;
begin
exist:=false;
tmpstr:=Socket.ReceiveText;
commHead:=getmaskstring(tmpstr,'^',1);
//Richedit1.Lines.Add(tmpstr);
if commHead ='昵称@#!'then
begin
 for ii:=0 to ListView1.Items.Count -1 do
 begin
   if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2]
 then
   begin
   exist:=true;
   if getmaskstring(tmpstr,'^',2)<>ListView1.Items[ii].Caption then
   begin
   Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
   ListView1.Items[ii].Caption+' 更名为 '+
   getmaskstring(tmpstr,'^',2));
   ListView1.Items[ii].Caption:=getmaskstring(tmpstr,'^',2);          end;
       end;
    end;
 end;
 if commHead='交谈@#!'then
 begin
 Richedit1.Lines.Add(getmaskstring(tmpstr,'^',2));
 end;
 if commHead='增加用户@#!'then
 begin
 for ii:=0 to ListView1.Items.Count-1 do
 begin
 if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2] then
 exist:=true;
 end;
 if exist=false then begin
 newitem:=ListView1.Items.add();
 newitem.Caption:=getmaskstring(tmpstr,'^',2);
 newitem.SubItems.Add(getmaskstring(tmpstr,'^',3));
 newitem.SubItems.Add(getmaskstring(tmpstr,'^',4));
 newitem.SubItems.Add(getmaskstring(tmpstr,'^',5));
   Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
   getmaskstring(tmpstr,'^',2)+'加入进来!'); end;
 end;
 if commHead='删除用户@#!'then
 begin
 for ii:=0 to ListView1.Items.Count-1 do
 begin
 if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2] then
 begin
 Listview1.Items.Delete(ii);
   Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
   getmaskstring(tmpstr,'^',2)+'走了!');   end;
  end;
 end;
end;

解决方案 »

  1.   

    闇€瑕佺殑锛涜鍦ㄥ叾Destroy鏂规硶涓啀寰幆閲婃斁
      

  2.   

    weizi2000(秋风啊)
    闇€瑕佺殑锛涜鍦ㄥ叾Destroy鏂规硶涓啀寰幆閲婃斁
    鍥炲閿欎簡hellolongbin(一个人(自从来了CSDN,再也不用上黄色网站了)) 
    鎬庝箞閮芥槸涔辩爜锛怎么是乱码,不知道说的什么。
      

  3.   

    服务器端:procedure TForm1.ServerSocket1Accept(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      newitem:TListItem;
      ii,jj:Integer;
      user,usercur:string;
    begin
      newitem:=ListView1.Items.Insert(ListView1.Items.Count);
      newitem.Caption:='Client:'+IntToStr(ListView1.Items.Count);
      newitem.SubItems.Add(Socket.RemoteHost);
      newitem.SubItems.Add(Socket.RemoteAddress);
      newitem.SubItems.Add(IntToStr(Socket.RemotePort)); //将远程新登录客户显示到列表
      //ListView1.AlphaSort();
      ListView1.Items.Item[ListView1.Items.Count-1].Selected:=true;//选中添加的客户
      Display('连接到主机:'+Socket.RemoteAddress+' 成功');
      ii:=ListView1.ItemIndex;
        Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
        ListView1.Items[ii].Caption+'加入进来!');  //显示什么日期时间某某加入进来
      user := listview1.Items[ii].Caption + '^' +
        listview1.Items[ii].SubItems[0] + '^'
        + listview1.Items[ii].SubItems[1] + '^'
        + listview1.Items[ii].SubItems[2];
      for jj := 0 to listview1.Items.Count - 1 do
      begin
        serversocket1.Socket.Connections[jj].SendText('增加用户@#!^' +
          user + '^'); //发送增加用户某某给其他各个客户端
      end;
      for jj := 0 to listview1.Items.Count - 2 do
      begin
        user := listview1.Items[jj].Caption + '^' +
          listview1.Items[jj].SubItems[0] + '^'
          + listview1.Items[jj].SubItems[1] + '^'
          + listview1.Items[jj].SubItems[2];
        serversocket1.Socket.Connections[ii].SendText('增加用户@#!^' +
          user + '^');  
      end;
    end;procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      ii,jj:integer;
      User:String;
    begin
      for ii:=0 to ListView1.Items.Count-1 do begin
        if ListView1.Items.Item[ii].SubItems.Strings[2]=IntToStr(Socket.RemotePort) then begin//当有用户离开时发送类似信息给各个客户端
          for jj:=0 to ListView1.Items.Count -1 do begin
             user:=ListView1.Items[ii].Caption+'^'+ListView1.Items[ii].subitems[0]+'^'+
              ListView1.Items[ii].SubItems[1]+'^'+ListView1.Items[ii].subitems[2];
              ServerSocket1.Socket.Connections[jj].SendText('删除用户@#!^'+User+'^');
          end;
            Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
            ListView1.Items[ii].Caption+'走了!');
            ListView1.Items.Item[ii].Delete();
            Display(Socket.RemoteHost+'走了');//显示某某在什么时间走了
          end;
        end;
      if ListView1.Items.Count=0 then begin
        Display('获取信息......');//如果用户列表为空则显示正在获取信息
      end;
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      tmpstr,User:string;
      ii,jj:integer;
      ListItem:TListItem;
      exist:bool;
    begin
    exist:=False;
    tmpstr:=Socket.ReceiveText;
    if getmaskstring(tmpstr,'^',1)='交谈@#!' then begin //根据收到的字符串显示某某在交谈
    for jj:=0 to ListView1.Items.Count -1 do begin
    user:=getmaskstring(tmpstr,'^',2);
    ServerSocket1.Socket.Connections[jj].SendText('交谈@#!^'+User+'^');
    end;
    Richedit1.Lines.Add(getmaskstring(tmpstr,'^',2));//显示交谈客户内容
    end;
    if getmaskstring(tmpstr,'^',1)='昵称@#!' then begin//如果收到的是昵称而不是交谈信息,则说明用户发送过来的是更改昵称的信息
    for ii:=0 to ListView1.Items.Count-1 do begin
    if Socket.RemotePort=StrToInt(ListView1.Items[ii].SubItems[2])
    then begin
       exist:=true;
       if getmaskstring(tmpstr,'^',2)<>ListView1.Items[ii].Caption then
    begin
      Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
      ListView1.Items[ii].Caption+' 更名为 '+
      getmaskstring(tmpstr,'^',2));
       ListView1.Items[ii].Caption:=getmaskstring(tmpstr,'^',2);//显示更名为某某
    for jj:=0 to ListView1.Items.Count -1 do begin
    user:=ListView1.Items[ii].Caption+'^'+ListView1.Items[ii].subitems[0]+'^'+ListView1.Items[ii].SubItems[1]+'^'+ListView1.Items[ii].subitems[2];
       ServerSocket1.Socket.Connections[jj].SendText('昵称@#!^'+User+'^');//通知各个客户端某用户改名后的昵称,以便在客户端更新昵称
    end;
              end;
          end;
       end;
    end;
    end;客户端:procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      tmpstr:string;
      newItem:TListItem;
      ii:Integer;
      exist:bool;
      commHead:string;
    begin
    exist:=false;
    tmpstr:=Socket.ReceiveText;
    commHead:=getmaskstring(tmpstr,'^',1);
    //Richedit1.Lines.Add(tmpstr);
    if commHead ='昵称@#!'then //如果客户端收到的是昵称
    begin
     for ii:=0 to ListView1.Items.Count -1 do
     begin
       if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2]
     then
       begin
       exist:=true;
       if getmaskstring(tmpstr,'^',2)<>ListView1.Items[ii].Caption then
       begin
       Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
       ListView1.Items[ii].Caption+' 更名为 '+
       getmaskstring(tmpstr,'^',2));
       ListView1.Items[ii].Caption:=getmaskstring(tmpstr,'^',2);//更改客户端客户的昵称          end;
           end;
        end;
     end;
     if commHead='交谈@#!'then//如果收到的是交谈信息,则显示交谈信息
     begin
     Richedit1.Lines.Add(getmaskstring(tmpstr,'^',2));
     end;
     if commHead='增加用户@#!'then //如果收到的是增加用户的信息,个在在线用户列表中添加该用户
     begin
     for ii:=0 to ListView1.Items.Count-1 do
     begin
     if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2] then
     exist:=true;
     end;
     if exist=false then begin
     newitem:=ListView1.Items.add();
     newitem.Caption:=getmaskstring(tmpstr,'^',2);
     newitem.SubItems.Add(getmaskstring(tmpstr,'^',3));
     newitem.SubItems.Add(getmaskstring(tmpstr,'^',4));
     newitem.SubItems.Add(getmaskstring(tmpstr,'^',5));
       Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
       getmaskstring(tmpstr,'^',2)+'加入进来!');//显示某人在什么时间加入进来 end;
     end;
     if commHead='删除用户@#!'then   //如果收到的删除用户信息,则在在线列表中删除该用户昵称
     begin
     for ii:=0 to ListView1.Items.Count-1 do
     begin
     if getmaskstring(tmpstr,'^',5)=ListView1.Items[ii].SubItems[2] then
     begin
     Listview1.Items.Delete(ii);
       Richedit1.Lines.Add(DateToStr(Date)+' '+TimeToStr(time)+'==>>'+
       getmaskstring(tmpstr,'^',2)+'走了!');   //显示什么时间某某用户走了   end;
      end;
     end;
    end;
      

  4.   

    昵称@#!^
    删除用户@#!
    交谈@#!程序中此类字符串附加在发送的字符串首部,当接收到此类字符串,不管是那一类,都作为发送数据的类型,在接收到字符串后,用getmaskstring()函数再除去首部,只显示接收到的部分,除去附加信息。实际上就相当于一个客户端和服务器端的协议。
      

  5.   

    感谢Jethill的解释,如果没有其他人回答了,分就全给你了
      

  6.   

    也帮我把这个程序注释下好吗?
    var mons = [];
    var cams = [];
    var i;
    var j = 0;
    for(i=10; i<30; i++)
    {
    mons[j] = i;
    j++;
    }
    var nMon = mons.length;j=0;
    for(i=1001; i<1027; i++)
    {
    cams[j] = i;
    j++;
    }
    var nCam = cams.length;while(true)
    {
    m = parseInt(Math.random()*nMon);
    if(m>=nMon)
    m = nMon-1;
    print("Mon(", mons[m], ")");
    Mon(mons[m]);
    c = parseInt(Math.random()*nCam);
    if(c>=nCam)
    c = nCam-1;
    print("Cam(", cams[c], ")");
    Cam(cams[c]);

    lock = parseInt(Math.random()*3);
    if(lock==1)
    {
    print("MonLock(", 1000, ")");
    MonLock(1000);
    }
    else if(lock==2)
    {
    print("MonLock(", 0, ")");
    MonLock(0);
    }

    wait(1000);
    }