Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClientSocket1,ServerSocket1, Создание чат приложения 
:(
    Опции темы
Гость_Denis
  Дата 25.7.2005, 12:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Людия я вот тут начал программу писать при помоши 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.
smile smile smile

Это сообщение отредактировал(а) Girder - 26.7.2005, 15:44
  Вверх
Гость_Delphin
Дата 8.8.2005, 12:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ты подключил dclsockets70.bpl ? Потому что он в Delphi 7 не подключен по умолчанию.
Это не WinSock. Ты используешь компоненты. Чтобы использовать WInSockets подключи модуль WinSock.
Чтобы разослать клиентам что-то используй что-то вроде этого:
Код

var
 i: Integer;
begin
  For i := 0 to ServerSocket1.Socket.ActiveConnections -1 do 
   begin
     ServerSocket1.Socket.Connections[ I ].SendText('Твой текст');
     // Это разошлет всем подключенным клиентам твой текст.
   end;


Но я тебе советую делать чат без сервера. Так-как это не всегда возможно, поставить сервер в локальной сети. Могут позволить себе это только крупные организации у которых таковой уже имеется.
Удачи. Если что обращайся в e-mail: [email protected]
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.2194 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.