在一本书上找到的一个聊天工具,请尽可能详细的注解下......服务器端: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;
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;
解决方案 »
- 新手求助!!!数据写入,导出TXT文本后,系统报错the specified file was not found
- delphi 用lable来显示内容 如何实现首先显示我查询出来的一条记录 然后在一定的时间后再显示下一条记录?
- 为什么整数表达式的值超过特定整数类型的取值范围时没有引发 ERangeError 异常
- 画框,再输入文本用什么控件比较方便?
- 我用了个对话框 里面有OK这个按钮,我想按了之后不让它消失,请问怎么写?
- 如何得到Web Service 的WSDL? 在线等待!马上给分!
- 请问影响数据库执行速度的函数有哪些?
- MaskEdit的设置
- 空谈误国 实干兴邦
- 那里有的DELPHI好书下载的地方,谢谢
- 如何获取上级目录?
- 让我抓瞎了两天的Locate:Dbexpress中Locate中检索TDateTime数据不行吗?
闇€瑕佺殑锛涜鍦ㄥ叾Destroy鏂规硶涓啀寰幆閲婃斁
鍥炲閿欎簡hellolongbin(一个人(自从来了CSDN,再也不用上黄色网站了))
鎬庝箞閮芥槸涔辩爜锛怎么是乱码,不知道说的什么。
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;
删除用户@#!
交谈@#!程序中此类字符串附加在发送的字符串首部,当接收到此类字符串,不管是那一类,都作为发送数据的类型,在接收到字符串后,用getmaskstring()函数再除去首部,只显示接收到的部分,除去附加信息。实际上就相当于一个客户端和服务器端的协议。
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);
}