procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
p:pchar;
length:longint;
Count,i:Integer;
begin
p:=nil;
while socket.ReceiveLength>0 do begin
length:=socket.receivelength;
Getmem(p,length);
TRY
socket.ReceiveBuf(p^,socket.receivelength);
Count:=Server.Socket.ActiveConnections;
for i:=0 to Count-1 do
Server.Socket.Connections[i].SendBuf(p^,length);
FINALLY
FreeMem(p);
END;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//start server when application run
Server.Active:=true;
S1.Panels.Items[0].Text:='Server Starts. Host:'+Server.Socket.LocalHost+' Port:'+inttostr(Server.Port);
self.Caption:=S1.Panels.Items[0].Text;
Application.Title:=S1.Panels.Items[0].Text;
S1.Panels.Items[1].Text:='OnLine user Count: '+IntToStr(Server.Socket.ActiveConnections);
end;
procedure TForm1.ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
var
Tempstr:pchar;
begin
TempStr:=pchar('Welcome To Chat Test Server '#13#10);
socket.SendText(TempStr);
TempStr:=pchar('#######################################'#13#10);
socket.SendText(TempStr);
TempStr:=pchar('All your words will be sent to all online people'#13#10);
socket.SendText(TempStr);
end;
procedure TForm1.ServerClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//Error Conditions
Case ErrorCode Of
10054:M1.lines.add('one connection is reset by remote side.');
Else
M1.Lines.Add('Error Happen, Error Code:'+InttoStr(errorCode));
End;
ErrorCode:=0;
end;
procedure TForm1.btnSendClick(Sender: TObject);
var
i:integer;
Count:Integer;
begin
Count:=Server.Socket.ActiveConnections;
for i:=0 to Count-1 do
Server.Socket.Connections[i].SendText(edtSend.text);
end;
procedure TForm1.ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
Var
Count:Integer;
IDIndex:Integer;
begin
M1.Lines.add('Usr Offline');
M1.Lines.add(' SocketID:'+Inttostr(Socket.SocketHandle));
IDIndex:=cbxID.Items.IndexOf( Inttostr(Socket.SocketHandle));
cbxID.Items.Delete(IDIndex);
//this event happens before user leave
Count:=Server.Socket.ActiveConnections-1;
S1.Panels.Items[1].Text:='OnLine user:'+Inttostr(Count);
end;
procedure TForm1.btnOneSendClick(Sender: TObject);
var
ID:Integer;
Socket:TCustomWinSocket;
begin
if cbxID.Text='' then
exit;
ID:=strtoint(cbxID.text);
//Create a socket with exist socket handle
Socket:=TCustomWinSocket.Create(ID);
Socket.SendText(EdtSend.text);
end;
procedure TForm1.ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='Connect Received';
S1.Panels.items[1].text:='';
end;
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
relong:integer;
begin
re:=nil;
while socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
Socket.ReceiveBuf(re^,Socket.receivelength);
sBuf:=strpas(re);
Setlength(sbuf,relong);
procedure TForm1.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
S1.Panels.Items[0].Text:='Close Connect With Host';
S1.Panels.Items[0].Text:='';
M1.Lines.Clear;
edit1.Text:='';
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Client.Active then
Client.Close;
end;
procedure TForm1.M1Click(Sender: TObject);
begin
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(self.handle,nil,Pchar(Application.EXEname),nil,nil,SW_Normal);
end;
procedure TForm1.btnConnectClick(Sender: TObject);
begin
Client.Address:=edtHost.Text;
Client.Port:=strtoint(edtPort.Text);
Client.Active:=true;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
if not Client.Active then
btnConnectClick(Sender);
Client.Socket.SendText(Edit1.Text);
edit1.SelectAll;
key:=#0;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
edtHost.Text:='10.14.61.70';
edtPort.Text:='7';
TotalLen:=0;
end;
procedure TForm1.bntDisConnectClick(Sender: TObject);
begin
Client.Active:=False;
end;