Людия я вот тут начал программу писать при помоши WinSocks! И вот у меня возникли такие проблемы ...
Я хочу написать Чат для локальной сети на Delphi 7 и я решил использовать 1 комп как сервер и а другие как клиенты. И в моём приложение при подключении нового пользователя к серверу информация о его подключении должна быть разослана всем клиентам ... Как это можно грамматно реализовать при помощи компонентов ClientSocket1,ServerSocket1?
Далее листинг сервера ...
| Код | unit Server;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ScktComp, ExtCtrls, ComCtrls;
type TServer_Users = record Host,Address:String[100]; end; TForm1 = class(TForm) ServerSocket1: TServerSocket; MainMenu1: TMainMenu; Chat1: TMenuItem; Start1: TMenuItem; Stop1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; Edit1: TMenuItem; Options1: TMenuItem; Help1: TMenuItem; GroupBox1: TGroupBox; ListBox1: TListBox; Panel1: TPanel; Memo1: TMemo; Label1: TLabel; Edit2: TEdit; Button1: TButton; StatusBar1: TStatusBar; procedure Exit1Click(Sender: TObject); procedure Start1Click(Sender: TObject); procedure Stop1Click(Sender: TObject); procedure StatusBar_Update; procedure GetInf; procedure User_Add; procedure User_Del; procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; SUsers:array[1..10] of TServer_Users; Port:string; implementation {$R *.dfm}
procedure TForm1.StatusBar_Update; var Users:integer; begin if ServerSocket1.Active then StatusBar1.Panels.Items[0].Text:='Started' else StatusBar1.Panels.Items[0].Text:='Stopped'; Users:=ServerSocket1.Socket.ActiveConnections; StatusBar1.Panels.Items[1].Text:=IntToStr(Users)+' Active user(s)'; StatusBar1.Panels.Items[2].Text:=ServerSocket1.Socket.LocalHost+'('+ServerSocket1.Socket.LocalAddress+')'+':'+Port; end;
procedure TForm1.GetInf; var i:integer; begin for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do begin susers[i].Host:=ServerSocket1.Socket.Connections[i].RemoteHost; susers[i].Address:=ServerSocket1.Socket.Connections[i].RemoteAddress; end; end;
procedure TForm1.User_Add; var i:integer; begin ListBox1.Clear; GetInf; for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do ListBox1.Items.Insert(i,susers[i].Host+'('+susers[i].Address+')'); StatusBar_Update; end;
procedure TForm1.User_Del; var i:integer; begin ListBox1.Clear; StatusBar_Update; GetInf; for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do ListBox1.Items.Insert(i,''); end;
procedure TForm1.Exit1Click(Sender: TObject); begin Close; end;
procedure TForm1.Start1Click(Sender: TObject); begin Port:=InputBox('Chat Server Start','Port:','1001'); ServerSocket1.Port:=StrToInt(Port); ServerSocket1.Open; StatusBar_Update; end;
procedure TForm1.Stop1Click(Sender: TObject); begin if ServerSocket1.Active then ServerSocket1.Close; StatusBar_Update; end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin User_Add; end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin User_Del; end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Msg:string; begin Msg:=Socket.ReceiveText; Memo1.Lines.Add('> '+Msg); beep; end;
procedure TForm1.Button1Click(Sender: TObject); begin if Edit2.Text='' then ShowMessage('Enter Message first') else if ListBox1.ItemIndex<0 then ShowMessage('Select user first')else begin ServerSocket1.Socket.Connections[ListBox1.ItemIndex].SendText(Edit2.Text); Memo1.Lines.Add('< '+ServerSocket1.Socket.LocalHost+' '+Edit2.Text); Edit2.Clear; end; end;
end.
Клиента ...
unit Client;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ScktComp, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) ClientSocket1: TClientSocket; MainMenu1: TMainMenu; Connect1: TMenuItem; ConnecttoServer1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; DisconnectfromServer1: TMenuItem; GroupBox1: TGroupBox; ListBox1: TListBox; Edit1: TEdit; Button1: TButton; Label1: TLabel; Panel1: TPanel; Memo1: TMemo; procedure ConnecttoServer1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure DisconnectfromServer1Click(Sender: TObject); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure Button1Click(Sender: TObject); procedure ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; implementation
uses ConnectToServer; {$R *.dfm}
procedure TForm1.ConnecttoServer1Click(Sender: TObject); begin Form2.Show; end;
procedure TForm1.Exit1Click(Sender: TObject); begin Close; end;
procedure TForm1.DisconnectfromServer1Click(Sender: TObject); begin If ClientSocket1.Active then ClientSocket1.Close; ShowMessage('Вы отключились от сервера'); end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var Msg:string; begin Msg:=Socket.ReceiveText; Memo1.Lines.Add('> '+Msg); beep; end;
procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add('< '+ClientSocket1.Socket.LocalHost+' '+Edit1.Text); ClientSocket1.Socket.SendText(ClientSocket1.Socket.LocalHost+' '+Edit1.Text); Edit1.Clear; Edit1.SetFocus; end;
procedure TForm1.ClientSocket1Connecting(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.lines.add('Connecting to server'); end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.lines.add('Disconnected from server'); end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin Memo1.lines.add('Connected to server'); end;
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Memo1.lines.add('Error connecting to server'); end;
end.
//Form2
unit ConnectToServer;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm2 = class(TForm) Edit1: TEdit; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Edit2: TEdit; Button1: TButton; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } Address:string; end;
var Form2: TForm2;
implementation
{$R *.dfm} uses Client;
procedure TForm2.Button2Click(Sender: TObject); begin Edit1.Clear; Edit2.Clear; Form2.Close; end;
procedure TForm2.Button1Click(Sender: TObject); begin Form1.ClientSocket1.Port:=StrToInt(Edit1.Text); Address:=Edit2.Text; Form1.ClientSocket1.Address:=Address; Form1.ClientSocket1.Open; Form2.Close; end;
end.
| |