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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конект клиентов Server | ClientSocket 
:(
    Опции темы
Exai1e
Дата 20.2.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Здрасти)
Возникла вот такая проблемка
Есть зародыш маленького чата 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 ? 

Спасибо


Это сообщение отредактировал(а) Exai1e - 20.2.2007, 12:19


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
E_v_g
Дата 20.2.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



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

PM ICQ   Вверх
Exai1e
Дата 20.2.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



E_v_g, Попробывал, всеравно не пашет smile


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
E_v_g
Дата 20.2.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



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 
PM ICQ   Вверх
Exai1e
Дата 20.2.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



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

Вот

Спасибо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
E_v_g
Дата 21.2.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



Извини, забыл - надо по всему тексту Name заменить на aName  smile 
PM ICQ   Вверх
Exai1e
Дата 21.2.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



E_v_g, Перезалил сюда


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Matematik
Дата 21.2.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



В клиенте OnConnect замени на OnWrite
PM MAIL WWW ICQ   Вверх
E_v_g
Дата 21.2.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 15.11.2006

Репутация: нет
Всего: нет



клиент:

Код

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.


Если будут ошибки, неплохо бы их написать...
PM ICQ   Вверх
Exai1e
Дата 21.2.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Matematik
Цитата
В клиенте OnConnect замени на OnWrite


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

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

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


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Matematik
Дата 21.2.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Цитата(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;



PM MAIL WWW ICQ   Вверх
Exai1e
Дата 21.2.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Matematik, Спасибо большое

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

Это сообщение отредактировал(а) Exai1e - 21.2.2007, 13:13


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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