📄 serverunit.pas
字号:
unit ServerUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ScktComp, ExtCtrls;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket; //服务器Socket控件
StringGrid1: TStringGrid; //显示已经连接的客户地址
Memo1: TMemo; //显示各种信息
Label1: TLabel; //提示正在听
StringGrid2: TStringGrid; //显示当前的客户地址
Label2: TLabel; //显示已经连接的客户数
Label3: TLabel; //提示当前的客户情况
Label4: TLabel; //显示端口号
Timer1: TTimer; //时钟定时刷新信息
Memo2: TMemo; //发送信息编辑器
Button1: TButton;
Label5: TLabel; //发送按钮
procedure ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormShow(Sender: TObject);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket); //服务器接收客户事件
begin
memo1.Lines.Add(Socket.LocalAddress+' Accept'); //提示所接收的客户地址
with stringgrid2 do //显示其它相关情况
begin
Cells[1,2]:=Socket.LocalHost; //显示当地计算机的名称
Cells[1,3]:=Socket.LocalAddress; //显示当地计算机的IP地址
Cells[1,4]:=Socket.RemoteHost; //显示远方计算机的名称
Cells[1,5]:=Socket.RemoteAddress; //显示远方计算机的IP地址
end;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket); //客户连接事件
begin
memo1.Lines.Add(Socket.LocalAddress+' Connect'); //显示客户连接
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket); //客户收到数据的事件
var ss:string; //定义临时变量
txl:integer;
ClientAddr:string;
begin
with stringgrid2 do
begin
Cells[1,2]:=Socket.LocalHost; //显示当地计算机的名称
Cells[1,3]:=Socket.LocalAddress; //显示当地计算机的IP地址
Cells[1,4]:=Socket.RemoteHost; //显示远方计算机的名称
Cells[1,5]:=Socket.RemoteAddress; //显示远方计算机的IP地址
end;
with ServerSocket1.Socket do //应答客户
begin
ClientAddr:=Socket.RemoteAddress; //得到客户 IP地址
txl:=Socket.ReceiveLength; //得到客户送来的数据长度
label1.Caption:=' 字节数'+inttostr(txl);
ss:=Socket.ReceiveText; //得到客户送来的数据
memo1.Lines.Add(timetostr(now)+'收到客户'+
ClientAddr+' '+inttostr(length(ss))+'字节数据');
//显示客户送来的数据时间
memo1.Lines.Add(ss+'*!!*'); //显示客户送来的数据
Socket.SendText(timetostr(now)+'收到客户'
+ClientAddr+' '+inttostr(txl)+'字节数据如下:');
//给客户返回信息
Socket.SendText(ss+' *!!*'); //返回客户数据让客户验证
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
ServerSocket1.Port:=2222; //设置端口号
ServerSocket1.Active:=true; //启动服务器
stringgrid1.rowcount:=3; //初始化提示信息架构
stringgrid1.Cells[0,0]:='序号';
stringgrid1.Cells[1,0]:='Addr';
with stringgrid2 do
begin
Cells[0,0]:='项目';
Cells[1,0]:='测试值';
Cells[0,1]:='ReceiveText';
Cells[0,2]:='LocalHost';
Cells[0,3]:='LocalAddress';
Cells[0,4]:='RemoteHost';
Cells[0,5]:='RemoteAddress';
end;
Label4.Caption:='Port: '+ inttostr(ServerSocket1.Port);
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket); //客户断开事件
begin
memo1.Lines.Add(Socket.LocalAddress+' 断开'); //显示客户断开
end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; //客户出错事件
var ErrorCode: Integer);
begin
memo1.Lines.Add(Socket.LocalAddress //显示错误代码
+' e1:'+inttostr(ErrorCode)+' e2:'+inttostr(ErrorCode));
end;
procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket); //听状态事件
begin
memo1.Lines.Add('服务器已经准备好'); //显示提示信息
end;
procedure TForm1.Timer1Timer(Sender: TObject); //时钟定时刷新连接信息
var i,mm:integer;
begin
mm:=ServerSocket1.Socket.ActiveConnections; //获得所连接的客户数
label2.Caption:='已连接'+inttostr(mm)+'客户'; //提示已连接的客户
if mm=0
then begin
stringgrid1.RowCount:=2; //客户连接数为0时显示无连接
stringgrid1.cells[0,1]:='';
stringgrid1.cells[1,1]:='(无客户)';
end
else begin
stringgrid1.RowCount:=mm+1;
for i:=0 to mm-1 do //显示所有已连接的客户地址
begin
stringgrid1.cells[0,i+1]:=inttostr(i);
stringgrid1.cells[1,i+1]:=ServerSocket1.Socket.Connections[i].RemoteAddress;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); //发送信息
var i:integer;
begin //向每个已连接的客户发送
for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText(memo2.Text);
label5.Caption:='字符数'+inttostr(length(memo2.text)); //显示发送字符数
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -