unit uServerMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons;
const
CMax = 10; //客户端最大连接数
type
client_record = record
CHandle: integer; //客户端套接字句柄
CSocket: TCustomWinSocket; //客户端套接字
CName: string; //客户端计算机名称
CAddress: string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
type
TfrmServerMain = class(TForm)
ServerSocket: TServerSocket;
ControlBar1: TControlBar;
ToolBar1: TToolBar;
tbConnect: TToolButton;
tbClose: TToolButton;
tbDisconnected: TToolButton;
Edit1: TEdit;
Memo1: TMemo;
StatusBar: TStatusBar;
procedure tbConnectClick(Sender: TObject);
procedure tbDisconnectedClick(Sender: TObject);
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketListen(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure tbCloseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
procedure ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
session: array[0..CMax] of client_record; //客户端连接数组
Sessions: integer; //客户端连接数
end;
var
frmServerMain: TfrmServerMain;
implementation
{$R *.DFM}
//打开套接字连接,并使套接字进入监听状态
procedure TfrmServerMain.tbConnectClick(Sender: TObject);
begin
ServerSocket.Open;
end;
//关闭套接字连接,不再监听客户端的请求
procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);
begin
ServerSocket.Close
StatusBar.Panels[0].Text := '服务器套接字连接已经关闭,无法接受客户端的连接请求.';
end;
//从客户端读取信息
procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
i: integer;
begin
//将从客户端读取的信息添加到Memo1中
Memo1.Lines.Add(Socket.ReceiveText);
for i := 0 to sessions do
begin
//取得匹配的客户端
if session[i].CHandle = Socket.SocketHandle then
session[i].CSocket.SendText('回复客户端' + session[i].CAddress + ' ==> ' + Edit1.Text);
end;
end;
//服务器端套接字进入监听状态,以便监听客户端的连接
procedure TfrmServerMain.ServerSocketListen(Sender: TObject;Socket: TCustomWinSocket);
begin
StatusBar.Panels[0].Text := '等待客户端连接...';
end;
//当客户端连接到服务器端以后
procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
i, j: integer;
begin
j := -1;
for i := 0 to sessions do
begin
//在原有的连接数组中有中断的客户端连接
if not session[i].CUsed then
begin
session[i].CHandle := Socket.SocketHandle; //客户端套接字句柄
session[i].CSocket := Socket; //客户端套接字
session[i].CName := Socket.RemoteHost; //客户端计算机名称
session[i].CAddress := Socket.RemoteAddress; //客户端计算机IP
session[i].CUsed := True; //连接数组当前位置已经占用
Break;
end;
j := i;
end;
if j = sessions then
begin
inc(sessions);
session[j].CHandle := Socket.SocketHandle;
session[j].CSocket := Socket;
session[j].CName := Socket.RemoteHost;
session[j].CAddress := Socket.RemoteAddress;
session[j].CUsed := True;
end;
StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经连接';
end;
//当客户端断开连接时
procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
var
i: integer;
begin
for i := 0 to sessions do
begin
if session[i].CHandle = Socket.SocketHandle then
begin
session[i].CHandle := 0;
session[i].CUsed := False;
Break;
end;
end;
StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经断开';
end;
//关闭窗口
procedure TfrmServerMain.tbCloseClick(Sender: TObject);
begin
Close;
end;
procedure TfrmServerMain.FormCreate(Sender: TObject);
begin
sessions := 0;
end;
procedure TfrmServerMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket.Close;
end;
//当客户端正在与服务器端连接时
procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;
Socket: Integer; var ClientSocket: TServerClientWinSocket);
begin
StatusBar.Panels[0].Text := '客户端正在连接...';
end;
//客户端发生错误
procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
StatusBar.Panels[0].Text := '客户端' + Socket.RemoteHost + '发生错误!';
ErrorCode := 0;
end;
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ToolWin, ComCtrls, ExtCtrls, StdCtrls, Buttons;
const
CMax = 10; //客户端最大连接数
type
client_record = record
CHandle: integer; //客户端套接字句柄
CSocket: TCustomWinSocket; //客户端套接字
CName: string; //客户端计算机名称
CAddress: string; //客户端计算机IP地址
CUsed: boolean; //客户端联机标志
end;
type
TfrmServerMain = class(TForm)
ServerSocket: TServerSocket;
ControlBar1: TControlBar;
ToolBar1: TToolBar;
tbConnect: TToolButton;
tbClose: TToolButton;
tbDisconnected: TToolButton;
Edit1: TEdit;
Memo1: TMemo;
StatusBar: TStatusBar;
procedure tbConnectClick(Sender: TObject);
procedure tbDisconnectedClick(Sender: TObject);
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketListen(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure tbCloseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocketGetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
procedure ServerSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private declarations }
public
{ Public declarations }
session: array[0..CMax] of client_record; //客户端连接数组
Sessions: integer; //客户端连接数
end;
var
frmServerMain: TfrmServerMain;
implementation
{$R *.DFM}
//打开套接字连接,并使套接字进入监听状态
procedure TfrmServerMain.tbConnectClick(Sender: TObject);
begin
ServerSocket.Open;
end;
//关闭套接字连接,不再监听客户端的请求
procedure TfrmServerMain.tbDisconnectedClick(Sender: TObject);
begin
ServerSocket.Close
StatusBar.Panels[0].Text := '服务器套接字连接已经关闭,无法接受客户端的连接请求.';
end;
//从客户端读取信息
procedure TfrmServerMain.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
i: integer;
begin
//将从客户端读取的信息添加到Memo1中
Memo1.Lines.Add(Socket.ReceiveText);
for i := 0 to sessions do
begin
//取得匹配的客户端
if session[i].CHandle = Socket.SocketHandle then
session[i].CSocket.SendText('回复客户端' + session[i].CAddress + ' ==> ' + Edit1.Text);
end;
end;
//服务器端套接字进入监听状态,以便监听客户端的连接
procedure TfrmServerMain.ServerSocketListen(Sender: TObject;Socket: TCustomWinSocket);
begin
StatusBar.Panels[0].Text := '等待客户端连接...';
end;
//当客户端连接到服务器端以后
procedure TfrmServerMain.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
i, j: integer;
begin
j := -1;
for i := 0 to sessions do
begin
//在原有的连接数组中有中断的客户端连接
if not session[i].CUsed then
begin
session[i].CHandle := Socket.SocketHandle; //客户端套接字句柄
session[i].CSocket := Socket; //客户端套接字
session[i].CName := Socket.RemoteHost; //客户端计算机名称
session[i].CAddress := Socket.RemoteAddress; //客户端计算机IP
session[i].CUsed := True; //连接数组当前位置已经占用
Break;
end;
j := i;
end;
if j = sessions then
begin
inc(sessions);
session[j].CHandle := Socket.SocketHandle;
session[j].CSocket := Socket;
session[j].CName := Socket.RemoteHost;
session[j].CAddress := Socket.RemoteAddress;
session[j].CUsed := True;
end;
StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经连接';
end;
//当客户端断开连接时
procedure TfrmServerMain.ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
var
i: integer;
begin
for i := 0 to sessions do
begin
if session[i].CHandle = Socket.SocketHandle then
begin
session[i].CHandle := 0;
session[i].CUsed := False;
Break;
end;
end;
StatusBar.Panels[0].Text := '客户端 ' + Socket.RemoteHost + ' 已经断开';
end;
//关闭窗口
procedure TfrmServerMain.tbCloseClick(Sender: TObject);
begin
Close;
end;
procedure TfrmServerMain.FormCreate(Sender: TObject);
begin
sessions := 0;
end;
procedure TfrmServerMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket.Close;
end;
//当客户端正在与服务器端连接时
procedure TfrmServerMain.ServerSocketGetSocket(Sender: TObject;
Socket: Integer; var ClientSocket: TServerClientWinSocket);
begin
StatusBar.Panels[0].Text := '客户端正在连接...';
end;
//客户端发生错误
procedure TfrmServerMain.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
StatusBar.Panels[0].Text := '客户端' + Socket.RemoteHost + '发生错误!';
ErrorCode := 0;
end;
end.