Delphi7网络通信控件ServerSocket 和ClientSocket步步学(3) 这一讲,有多个客户端联接服务端的处理;
1.界面如下图所示:
2.Serversocket 和clientsocket 的属性及事件设置
1.发送字符串
程序如下
var
Form1: TForm1;
client_x:array[1..10] of integer; //用来保存10个客户端的句抦
cx:integer; //全局变量
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
var i:integer;
begin
for i:=1 to 10 do
client_x[i]:=-1; //数据初始化
ServerSocket1.ThreadCacheSize:=10; //最多允许10个客户端访问
ServerSocket1.Open; //打开服务端
memo1.Clear;
memo1.Lines.Add('工作流程:');
memo1.Lines.Add('首先是客户端申请联接服务器,');
memo1.Lines.Add('联接上以后, 客户端发送数据给服务器,');
memo1.Lines.Add('然后,服务器接收到客户端发送来的数据,');
memo1.Lines.Add('而且,服务器将根据客户句柄,查询出数据是哪一个客户发来的,');
memo1.Lines.Add('最后,服务器给发数据的这个客户端回送应答数据!');
memo1.Lines.Add('注意,该程序只给出了一个客户端,其他的客户端依此类推!');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Address:='127.0.0.1'; //客户的IP地址
ClientSocket1.Port:=1234; //客户的端口号
ClientSocket1.Open; //打开客户端申请联接
end;
procedure TForm1.Button13Click(Sender: TObject);
begin
ClientSocket1.Close; //断开客户端联接
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Socket.); //客户向服务器发送数据end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); //有客户端联接上事件
var i:integer;
begin
i:=serversocket1.Socket.ActiveConnections; //目前服务器客户端个数client_x[i]:=socket.SocketHandle; //存储刚刚联接的客户端句柄end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); //有客户端断开联接--事件
var i,t:integer;
ax:array[1..10] of integer;
begin
for i:=1 to 10 do ax[i]:=-1;
for i:=1 to 10 do
begin
if client_x[i]=socket.SocketHandle then
//注消刚刚断开联接的客户端句柄
client_x[i]:=-1;
end;
t:=0;
for i:=1 to serversocket1.Socket.ActiveConnections do
begin
if (client_x[i]<>-1) then //从新计数客户端,
begin //因为ServerSocket1.Socket.Connections[i]
inc(t,1); //i 是从0. 个客户端
ax[t]:=client_x[i]
end;
end;
for i:=1 to 10 do client_x[i]:=ax[i];
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket); //服务器刚刚接收到客户的数据
var s:string;
i:integer;
begin
memo1.Lines.Add('客户的主机名:'+Socket.RemoteHost);
memo1.Lines.Add('客户的IP地址:'+Socket.RemoteAddress);
cx:=socket.SocketHandle; //刚刚接收到的客户的句柄
for i:=1 to 10 do
if (cx=client_x[i]) then break; //循环查询是哪个客户发来的数据s:=inttostr(i)+'#客户端发送---->服务器接收的数据: '+socket.ReceiveText;
memo1.Lines.Add(s);
end;
procedure TForm1.Button2Click(Sender: TObject); //服务器发送应答数据给客户var i:integer;
begin
socket通信在哪一层for i:=1 to 10 do
begin
if client_x[i]=cx then //跟据刚才接收的客户的句柄
break; //循环查询应该回答哪一个客户
end;
if (i=11) then exit; //如果没有客户联接
ServerSocket1.Socket.Connections[i-1].SendText(edit1.Text);
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket); //客户接收服务端应答的数据
var s:string;
begin
s:='服务器发送---->客户端接收的数据: '+socket.ReceiveText;
memo1.Lines.Add(s);
end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket); //客户端申清联接事件
begin
memo1.Lines.Add('正在申清联接....')
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket); //客户端联接上事件
begin
memo1.Lines.Add('已经联接上服务端')
end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket); //客户端断开联接事件
begin
memo1.Lines.Add('已经断开服务端联接')
end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showmessage('服务器端出错!'); //显示程序员自定义的错误提示信息
ErrorCode:=$00; //不再显示系统的错误提示信息end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
showmessage('客户端出错!'); //显示程序员自定义的错误提示信息
ErrorCode:=$00; //不再显示系统的错误提示信息end;
end.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论