Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.09.2008, 21:11
_(Sly)_ _(Sly)_ вне форума
Прохожий
 
Регистрация: 06.09.2008
Сообщения: 4
Репутация: 10
Печаль ПРИШЕМ ЧАТ ClientSocket-ServerSocket

Народ. Помогите написать корпоротивный чат. Немогу разобратса с синхроннасть работы ServerSocket1ClientRead. Проблема в том что если
в сети припустим 10000 клиентов то мой сервер умерает(вобшето он умерает и при 10). Пробовал отправлять на сервер команды SendText-но ето как оказалось неефективно. Подскажыте как написать устойчевый чат! Please!!!
Ответить с цитированием
  #2  
Старый 06.09.2008, 21:43
mskvkin mskvkin вне форума
Новичок
 
Регистрация: 31.08.2008
Сообщения: 99
Репутация: 10
Восклицание Реал

Уж лучше написать маил агент тогда хоть будет реальный функционал

Вот тебе код:
Код:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  accountForm in 'accountForm.pas' {Form2},
  ChatForm in 'ChatForm.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.Run;
end.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Menus, StdCtrls, ImgList, Proto, WinSock, Mrim,
  ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    ConnectBtn: TMenuItem;
    DisconnectBtn: TMenuItem;
    N4: TMenuItem;
    N10: TMenuItem;
    StatusBtn: TMenuItem;
    N12: TMenuItem;
    N2: TMenuItem;
    N5: TMenuItem;
    ImageList2: TImageList;
    MailAgent: TMrim;
    ListView1: TListView;
    ConnectBar: TProgressBar;
    N6: TMenuItem;
    StatusBar1: TStatusBar;
    PopupMenu1: TPopupMenu;
    N3: TMenuItem;
    procedure ConnectBtnClick(Sender: TObject);
    procedure MailAgentConnectProgress(state: Integer);
    procedure N2Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure DisconnectBtnClick(Sender: TObject);
    procedure MailAgentList(list: AContact_List);
    procedure MailAgentDisconnect(eMessage: String);
    procedure MailAgentListUpdate(List: AContact_List);
    procedure MailAgentSecondLogin(error: String);
    procedure MailAgentStatus(id: Integer; email: String; oldstatus,
      newstatus: Integer; adv_s_id, adv_s_name, adv_s_desc,
      adv_s_cid: String);
    procedure MailAgentNewMail(mess_: String);
    procedure MailAgentMessage(msg_type_flags: Cardinal; from,
      message_text: String);
    procedure ListView1DblClick(Sender: TObject);
    procedure MailAgentAuthReq(email, nick, req_msg: String);
    procedure N3Click(Sender: TObject);
  private
    _ContactList: Mrim.AContact_list;
    procedure SetStatus(Status:Integer; Name:string; Desc:String);
    procedure CreateNewTab (user_email:string; text:string);
    procedure GetUserList;
    function GetStatusImage(status:integer; advStatusId:string):integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses accountForm, ChatForm, Unit4;

{$R *.dfm}

{ TForm1 }
procedure TForm1.ConnectBtnClick(Sender: TObject);
begin
 ConnectBar.Visible := true;
 StatusBar1.Panels[0].Text := 'Подключение...';

 If Form2.ShowModal = mrCancel Then
  Exit;

 MailAgent.Login := Form2.LoginEdit.Text;
 MailAgent.Password := Form2.PassEdit.Text;
 MailAgent.LoginStatus := STATUS_ONLINE;

 MailAgent.login_s__desc := 'Я в сети!!!!';
 MailAgent.Connect2(MailAgent.Login, MailAgent.Password);
end;

procedure TForm1.MailAgentConnectProgress(state: Integer);
begin
 ConnectBar.Position := State;
 If State = 100 Then
 begin
  Sleep(100);
  ConnectBar.Visible := false;
  StatusBar1.Panels[0].Text := 'В сети';
 end;
end;


procedure TForm1.SetStatus(Status: Integer; Name:string; Desc:string);
begin
 MailAgent.MyStatus(Status, IntToStr(Status), Name, Desc);
end;

procedure TForm1.N2Click(Sender: TObject);
begin
 SetStatus(STATUS_ONLINE, 'В сети', 'Я в онлайне');
end;

procedure TForm1.N5Click(Sender: TObject);
begin
 SetStatus(STATUS_AWAY, 'Отошел', 'Ушел хакать пентагон, вернусь не скоро');
end;

procedure TForm1.N6Click(Sender: TObject);
begin
 SetStatus(STATUS_ONLINE+STATUS_FLAG_INVISIBLE, 'Невидимый','');
end;

procedure TForm1.DisconnectBtnClick(Sender: TObject);
begin
 MailAgent.Disconnect;
end;

procedure TForm1.MailAgentList(list: AContact_List);
begin
 _ContactList := List;
 GetUserList;
end;

procedure TForm1.GetUserList;
var
 i:integer;
 _User : AUser;
begin
 ListView1.Items.Clear;

 for i:=0 to _ContactList.users_num-1 do
 begin
  _User := _ContactList.users_id[i];
  with ListView1.Items.Add do
  begin
    Caption := _User.user_nick;
    ImageIndex := GetStatusImage(_User.user_status, _user.user_status_id);
   end;
 end;
end;

procedure TForm1.MailAgentDisconnect(eMessage: String);
begin
 StatusBar1.Visible := True;
 StatusBar1.Panels[0].Text := 'Отключен';
end;

procedure TForm1.MailAgentListUpdate(List: AContact_List);
begin
 _ContactList := List;
 GetUserList;
end;

function TForm1.GetStatusImage(status: integer; advStatusId:string): integer;
begin
 Result := 1;
 Case Status Of
  STATUS_ONLINE: Result := 0;
  STATUS_OFFLINE: Result := 1;
  STATUS_AWAY: Result := 2;
  STATUS_FLAG_INVISIBLE : Result := 5;
  STATUS_USER_DEFINED:
  begin
    if advStatusId = 'status_chat' then Result := 3;
    if advStatusId = 'status_dnd'  then Result := 4;
  end;
 end;
end;

procedure TForm1.MailAgentSecondLogin(error: String);
begin
 ShowMessage('Ахтунг!!! Кто вошел под твоим логином!!!');
end;

procedure TForm1.MailAgentStatus(id: Integer; email: String; oldstatus,
  newstatus: Integer; adv_s_id, adv_s_name, adv_s_desc, adv_s_cid: String);
begin
 ListView1.Items[id].ImageIndex := GetStatusImage(newStatus, adv_s_id);
end;

procedure TForm1.MailAgentNewMail(mess_: String);
begin
 ShowMessage('Получено новое письмо: '+mess_);
end;

procedure TForm1.MailAgentMessage(msg_type_flags: Cardinal; from,
  message_text: String);
begin
  CreateNewTab(from, message_text);
  Form3.Show;
end;

procedure TForm1.CreateNewTab(user_email: string; text:string);
var
 _NewTab : TTabSheet;
 _NewTextMemo, _NewChatMemo:TMemo;
 i:integer;
begin
 for i:=0 to form3.PageControl1.PageCount-1 Do
  if form3.PageControl1.Pages[i].Caption = user_nick then
  begin
    form3.PageControl1.ActivePageIndex := i;
    if Text <> '' then
      TMemo(Form3.PageControl1.Pages[i].FindComponent('ChatMemo'+IntToStr(i+1))).Lines.Add(user_nick+': '+text);
    form3.Show;
    Exit;
  end;

 _NewTab := TTabSheet.Create(form3.PageControl1);
 _NewTab.Caption := user_nick;
 _NewTab.Name := 'Tab'+IntToStr(form3.PageControl1.PageCount);
 _NewTab.PageControl := form3.PageControl1;

 _NewChatMemo := TMemo.Create(_NewTab);
 _NewChatMemo.Name := 'ChatMemo'+IntToStr(Form3.PageControl1.PageCount);
 _NewChatMemo.Align := alTop;
 _NewTab.InsertControl(_NewChatMemo);

 _NewTextMemo := TMemo.Create(_NewTab);
 _NewTextMemo.Name := 'TextMemo'+IntToStr(form3.PageControl1.PageCount);
 _NewTextMemo.Align := alTop;
 _NewTab.InsertControl(_NewTextMemo);

 _NewChatMemo.Lines.Clear;
 _NewTextMemo.Lines.Clear;

 If Text <> '' Then
   _NewChatMemo.Lines.Add(user_nick+': '+text);

 Form3.PageControl1.ActivePage := _NewTab;
 Form3.Show;
end;


procedure TForm1.ListView1DblClick(Sender: TObject);
var
 i:integer;
begin
 i:=ListView1.Selected.Index;
 CreateNewTab(_ContactList.users_id[i].user_mail, '');
end;

procedure TForm1.MailAgentAuthReq(email, nick, req_msg: String);
begin
 with form4 do
 begin
  UserLabel.Caption := nick;
  UserMailLabel.Caption := email;
  Memo1.Lines.Clear;
  Memo1.Lines.Add(req_msg);
  ShowModal;
 end;

 if form4.ModalResult = mrYes Then
  MailAgent.Send_Auth(email);


end;

procedure TForm1.N3Click(Sender: TObject);
begin
 if ListView1.Selected = nil then
  Exit;

 MailAgent.DeleteUser(_ContactList.users_id[ListView1.Selected.Index].user_mail);
end;

end.






unit accountForm;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
    LoginEdit: TEdit;
    Label2: TLabel;
    PassEdit: TEdit;
    Button1: TButton;
    Button2: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.







unit ChatForm;

interface

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

type
  TForm3 = class(TForm)
    SendBtn: TButton;
    PageControl1: TPageControl;
    procedure SendBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm3.SendBtnClick(Sender: TObject);
var
 index : integer;
 TextMemo, ChatMemo:TMemo;
begin
 index := PageControl1.ActivePageIndex;
 TextMemo := TMemo(PageControl1.Pages[index].FindComponent('TextMemo'+IntToStr(index+1)));
 ChatMemo := TMemo(PageControl1.Pages[index].FindComponent('ChatMemo'+IntToStr(index+1)));
 form1.MailAgent.SendMessage(PageControl1.Pages[index].Caption, TextMemo.Text);

 CHatMemo.Lines.Add('Я: '+TextMemo.Text);
 TextMemo.Clear;
end;

end.

unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Memo1: TMemo;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    UserLabel: TLabel;
    Label2: TLabel;
    UserMailLabel: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

end.
Admin: Пользуемся тегами! Настоятельно рекомендую!

Что должно пулучится можешь скачать отсюда
Внимание для работы программы необходим компонент TMRim
TMRim работает протоколом MMP (Разработчик компонента Алексей Панов)

Последний раз редактировалось Admin, 10.09.2008 в 19:50.
Ответить с цитированием
  #3  
Старый 06.09.2008, 23:37
_(Sly)_ _(Sly)_ вне форума
Прохожий
 
Регистрация: 06.09.2008
Сообщения: 4
Репутация: 10
По умолчанию Sly

Спасибо. Но ето немного не то. Жду на спасение. Пожалусто не игнорируйте а помогите.
Ответить с цитированием
  #4  
Старый 07.09.2008, 10:06
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

mskvkin, читайте правила...
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.

Последний раз редактировалось The Shadow, 15.09.2008 в 16:27.
Ответить с цитированием
  #5  
Старый 07.09.2008, 22:05
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Что - то ты всё усложнил досмерти! Зачем откуда-то взял этот протокол, как там его... MMP...
Дал бы уш, если на то пошло и ссылку на компонент!
Ответить с цитированием
  #6  
Старый 07.09.2008, 23:20
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Вот чат сделанный на TCPServer <-> TCPClient работает превосходно (взят с книги по Delphi)
Вложения
Тип файла: rar Чат.rar (9.0 Кбайт, 295 просмотров)
Ответить с цитированием
  #7  
Старый 08.09.2008, 21:10
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Ну вообще я просил с компонентами TClientSocket и TServerSocket!
Ответить с цитированием
  #8  
Старый 15.09.2008, 08:58
DSL88 DSL88 вне форума
Новичок
 
Регистрация: 08.09.2008
Адрес: Пермь
Сообщения: 51
Репутация: 10
По умолчанию

Смотри туто, выдержит нормально даже 10 000 клиентов.
Асихронно разбирайтесь сами.
http://www.delphisources.ru/forum/sh...?t=5271&page=2
__________________
Жизнь - игра: сюжет фигня... Зато какая графика!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter