Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Конект клиентов Server | ClientSocket


Автор: Exai1e 20.2.2007, 12:12
Здрасти)
Возникла вот такая проблемка
Есть зародыш маленького чата smile - хочу сделать чтобы при конекте нового клиента выдавалось сообщение типа "Ник вошел а чат" , все чет перепробывал, неполучаться smile. При выходе клиента выдаеться сообщение а при входе нет smile. Сообщение надо чтобы видели все клиенты кто находиться в чате.
Вот код

Сервера
Код

unit UServerMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Button1: TButton;
    ListBox1: TListBox;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.Active := false;
  ServerSocket1.Close;
  Close;  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.Port   := 777;
  ServerSocket1.Active := true;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  s : string;
  i : integer;
begin
    s := TimeToStr(now) + ' ' + Socket.ReceiveText;
  //s := TimeToStr(now) +  ' ' + '>' + ' ' + Socket.ReceiveText;
  ListBox1.Items.Add(s);
  for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    if ServerSocket1.Socket.Connections[i].SocketHandle <> Socket.SocketHandle then
      ServerSocket1.Socket.Connections[i].SendText(s);
end;

end.


и клиента

Код

unit UClientMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    ListBox1: TListBox;
    ClientSocket1: TClientSocket;
    Label1: TLabel;
    Label2: TLabel;
    Edit4: TEdit;
    Label3: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Name : string;

implementation

{$R *.dfm}

{Connect}
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Address := Edit2.Text;
  ClientSocket1.Port    := StrToInt(Edit3.Text);
  Name := Edit4.Text;
    if not ClientSocket1.Active then ClientSocket1.Active := true;
  Edit2.Enabled   := false;
  Edit3.Enabled   := false;
  Edit4.Enabled   := false;
  Button1.Enabled := false;
end;

{Send}
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Edit1.Text <> '' then
    ClientSocket1.Socket.SendText(Name + ' ' + '>' + ' ' + Edit1.Text);
    ListBox1.Items.Add(TimeToStr(now) + ' ' + Name + ' ' + ' > ' + ' ' +  Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add(Socket.ReceiveText);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientSocket1.Socket.SendText(Name + ' Покинул чат');
  ClientSocket1.Active := false;
  ClientSocket1.Close;
  Close;
end;

end.


Пытался делать чтобы сообщение выдавалось при конекте ( при нажатии на кнопку Connect) таким способом
  ClientSocket1.Socket.SendText(Name + ' Вошел в чат);
Невыходит smile

p.s. Можно ли комбинировать indy и Server | ClientSocket ? к примеру сообщения отрпаляються через сокеты а передачу файлов устроить через indy ? 

Спасибо

Автор: E_v_g 20.2.2007, 12:57
Попробуй в событии OnConnect клиента написать ClientSocket1.Socket.SendText(Name + ' Вошел в чат');

Автор: Exai1e 20.2.2007, 13:05
E_v_g, Попробывал, всеравно не пашет smile

Автор: E_v_g 20.2.2007, 14:12
1. В клиенте (TForm1.Button1Click) напиши ClientSocket1.host := Edit2.Text; а не address

2. Замени 

Код

var
  Form1: TForm1;
  Name : string;


на 

Код

var
  Form1: TForm1;
  aName : string;


Иначе Name будет воприниматься как имя контрола, а не переменная

3. Добавь

Код

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  socket.SendText(aName + ' Вошел в чат')
end;


и все... smile 

Автор: Exai1e 20.2.2007, 19:51
E_v_g
Ну незнаю в чем дело, сделал как говорил... невыходит smile мб глянеш ?

http://rapidshare.com/files/17410659/MiniChat.rar

Спасибо

Автор: E_v_g 21.2.2007, 07:55
Извини, забыл - надо по всему тексту Name заменить на aName  smile 

Автор: Exai1e 21.2.2007, 09:25
E_v_g, Перезалил http://webfile.ru/1322785

Автор: Matematik 21.2.2007, 10:58
В клиенте OnConnect замени на OnWrite

Автор: E_v_g 21.2.2007, 11:01
клиент:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    ClientSocket1: TClientSocket;
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  aName : string;

implementation

{$R *.dfm}

{Connect}
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Host := Edit2.Text;
  ClientSocket1.Port := StrToInt(Edit3.Text);
  aName := Edit4.Text;
    if not ClientSocket1.Active then ClientSocket1.Active := true;
  Edit2.Enabled   := false;
  Edit3.Enabled   := false;
  Edit4.Enabled   := false;
  Button1.Enabled := false;
end;

{Send}
procedure TForm1.Button2Click(Sender: TObject);
begin
  if Edit1.Text <> '' then
    ClientSocket1.Socket.SendText(aName + ' ' + '>' + ' ' + Edit1.Text);
    ListBox1.Items.Add(TimeToStr(now) + ' ' + aName + ' ' + ' > ' + ' ' +  Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  ListBox1.Items.Add(Socket.ReceiveText);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClientSocket1.Socket.SendText(aName + ' Покинул чат');
  ClientSocket1.Active := false;
  ClientSocket1.Close;
  Close;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  socket.SendText(aName + ' Вошел в чат')
end;

end.


сервер:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
//    ServerSocket1: TServerSocket;
//    Button1: TButton;
//    ListBox1: TListBox;
    ServerSocket1: TServerSocket;
    Button1: TButton;
    ListBox1: TListBox;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.Active := false;
  ServerSocket1.Close;
  Close;  
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket1.Port   := 777;
  ServerSocket1.Active := true;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  s : string;
  i : integer;
begin
    s := TimeToStr(now) + ' ' + Socket.ReceiveText;
  //s := TimeToStr(now) +  ' ' + '>' + ' ' + Socket.ReceiveText;
  ListBox1.Items.Add(s);
  for I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
    if ServerSocket1.Socket.Connections[i].SocketHandle <> Socket.SocketHandle then
      ServerSocket1.Socket.Connections[i].SendText(s);
end;

end.


Если будут ошибки, неплохо бы их написать...

Автор: Exai1e 21.2.2007, 12:01
Matematik
Цитата
В клиенте OnConnect замени на OnWrite


Спс, так все заработало.

Вот еще хотелось бы узнать, как можно покрасить текст и сделать так например чтобы время перед ником выводилось"жирным" шрифтом ?

чет даже не знаю от чего отталкиваться... :-/ smile

Автор: Matematik 21.2.2007, 12:39
Цитата(Exai1e @  21.2.2007,  12:01 Найти цитируемый пост)
Вот еще хотелось бы узнать, как можно покрасить текст и сделать так например чтобы время перед ником выводилось"жирным" шрифтом ?

Выводить легко, можно например использовать RichEdit. Вот кусок кода. которым я вывожу лог работы. Время пишется серым, текст черным
Код

type
  TMainForm = class(TForm)
    RichEdit1: TRichEdit;
   private
    { Private declarations }
    procedure WriteRE(const aText:AnsiString; aColor:TColor=clBlack);
    procedure WriteLnRE(const aText:AnsiString; aColor:TColor=clBlack);
    procedure AddLog(const AText:AnsiString; AColor:TColor=clBlack);
    procedure AddError(const AText:AnsiString);
  public
    { Public declarations }
  end;

procedure TMainForm.AddError(const AText: AnsiString);
begin
  AddLog(AText, clRed);
end;

procedure TMainForm.AddLog(const AText: AnsiString; AColor: TColor);
begin
  WriteRE(FormatDateTime('[ dd.mm.yyyy - hh:nn:ss ] ',Now), clGray);
  WriteLnRE(aText, AColor);
end;

procedure TMainForm.WriteLnRE(const aText: AnsiString; aColor: TColor);
begin
  WriteRE(atext+#13#10, aColor);
end;

procedure TMainForm.WriteRE(const aText: AnsiString; aColor: TColor);
var k : Integer;
begin
  if RichEdit1.Lines.Count>20000 then
    RichEdit1.Clear;
  k := RichEdit1.GetTextLen;
  RichEdit1.Perform(EM_SETSEL, k, k);
  RichEdit1.SelAttributes.Color := aColor;
  RichEdit1.Perform(EM_REPLACESEL, 0, Longint(PChar(aText)));
  RichEdit1.Perform(EM_SCROLl, SB_PAGEDOWN    , 0);
end;



Автор: Exai1e 21.2.2007, 13:07
Matematik, Спасибо большое

Возник вот такой вопрос: к примеру конектиться пользователь в чат, его ник добавляеться в Listbox2, а при дисконекте чтобы удалялся из списка, ка кдобавить то я знаю, а как удалить ? Listbox2.items.delete (вроде так) - неподходит... как лучше все это дело реализовать ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)