📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
RichEdit1: TRichEdit;
StatusBar1: TStatusBar;
GroupBox1: TGroupBox;
Edit1: TEdit;
GroupBox2: TGroupBox;
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Active :=true;
RichEdit1.Lines.add(datetostr(date)+' '+timetostr(time)+'==>'+'聊天室服务器启动了');
StatusBar1.SimpleText:='聊天室服务器启动了';
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var s,str,name,nei_rong:string;
i,n:integer;
all_name,ni_cheng:string;
newitem:TListItem;
begin
s:=Socket.ReceiveText; //接收字符串
n:=pos('@',s);
if n>0 then
begin
str:=copy(s,1,n-1);
if str='交谈' then //格式:"交谈"@"to昵称"@"内容"
begin
str:=copy(s,n+1,length(s)-n);
name:=copy(str,3,pos('@',str)-3); //交谈的对象昵称
nei_rong:=copy(str,pos('@',str)+1,length(str)-pos('@',str));//交谈的内容
for i:=0 to ListView1.Items.count-1 do //根据发言者IP找发言者昵称
begin
if socket.RemoteAddress=ListView1.Items[i].subitems[0] then
begin
ni_cheng:= ListView1.Items[i].caption;
RichEdit1.Lines.add(ni_cheng+'对'+name+'说'+nei_rong); end;
end;
for i:=0 to ListView1.Items.count-1 do //根据交谈的对象昵称找交谈的对象IP
begin
if name=ListView1.Items[i].caption then
name:=ListView1.Items[i].subitems[0]; //subitems[0]存放IP
end;
for i:=0 to ListView1.Items.count-1 do //实现私聊
begin
if ServerSocket1.Socket.Connections[i].RemoteAddress=name then
ServerSocket1.Socket.Connections[i].SendText('交谈@'+ni_cheng+'@'+nei_rong);
end;
end;
if str='昵称' then //昵称@xmj
begin
all_name:='';
newitem:=ListView1.Items.insert(ListView1.Items.count);
newitem.caption:=copy(s,pos('@',s)+1,length(s)-pos('@',s));
newitem.SubItems.Add(socket.RemoteAddress);
newitem.SubItems.Add(socket.RemoteHost);
RichEdit1.Lines.add(newitem.caption+'进来了');
for i:=0 to ListView1.Items.count-1 do
all_name:=all_name+ListView1.Items[i].Caption +'^'+ListView1.Items[i].subitems[0]+'@';
for i:=0 to ListView1.Items.count-1 do //广播新进入用户
begin
ServerSocket1.Socket.Connections[i].SendText('添加用户@'+all_name);
end;
end;
end;
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket); //用户离开触发
var i:integer;ni_cheng:string;
begin
for i:=0 to ListView1.Items.count-1 do //根据发言者IP找发言者昵称
begin
if socket.RemoteAddress=ListView1.Items[i].subitems[0] then
begin
ni_cheng:= ListView1.Items[i].caption;
RichEdit1.Lines.add(ni_cheng+'离开了');
end;
end;
for i:=0 to ListView1.items.count-1 do //ListView1中查找离开用户
begin
if Socket.RemoteAddress= ListView1.Items[i].subitems[0] then
Listview1.Items.Item[i].Delete();
end;
for i:=0 to ListView1.items.count-1 do //广播离开用户
ServerSocket1.Socket.Connections[i].SendText('离开@'+ListView1.Items[i].caption);
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var i:integer;
begin
if key=13 then
begin
for i:=0 to ListView1.items.count-1 do //广播用户
begin
ServerSocket1.Socket.Connections[i].SendText('交谈@'+'all'+'@'+edit1.Text );
edit1.text:='';
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -