Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2007, 11:18   #1
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
Вопрос Помогите с чатом!

Добрый день, уважаемые профессионалы и непрофессионалы, в общем кто откликнется, тем привет!!
Помогите с одной проблемкой, есть форма, я её прикрепил ниже, в ней чат, в общем когда форма запущена на 1-ом компе как сервер а на 2-ом компе как клиент(через кнопу подключение) то эти два компа общаются, т.е. видят сообщения друг друга, сделано посредством socket'а а мне нужно чтоб работали за ним больше двух человек, возможно неограничено, говорят что это можно реализовать через что-то многопоточное, я сам новичок, помогите чем сможете, и если можно, то как-нибудь по подробнее-что после чего вписывать спасибо огромное заранее!!!
Ниже приведен исходный код:

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
// предложенное значения порта
PortEdit.Text:='777';
// адрес при проверке программы на одном ПК ("сам на себя")
HostEdit.Text:='127.0.0.1';
// остальные поля просто очистим
NikEdit.Clear;
TextEdit.Clear;
ChatMemo.Lines.Clear;
end;

procedure TForm1.ServerBtnClick(Sender: TObject);
begin
If ServerBtn.Tag=0 then
Begin
ClientBtn.Enabled:=False;
HostEdit.Enabled:=False;
PortEdit.Enabled:=False;
// запишем указанный порт в ServerSocket
ServerSocket.Port:=StrToInt(PortEdit.Text);
// запускаем сервер
ServerSocket.Active:=True;
// добавим в ChatMemo сообщение с временем создания
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сервер создан');
// изменяем тэг
ServerBtn.Tag:=1;
// меняем надпись клавиши
ServerBtn.Caption:='Закрыть сервер';
end
else
Begin
ClientBtn.Enabled:=True;
HostEdit.Enabled:=True;
PortEdit.Enabled:=True;
// закрываем сервер
ServerSocket.Active:=False;
// выводим сообщение в ChatMemo
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сервер закрыт.');
// возвращаем тэгу исходное значение
ServerBtn.Tag:=0;
// возвращаем исходную надпись клавиши
ServerBtn.Caption:='Создать сервер';
end;

end;

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo сообщение с временем подключения клиента
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключился клиент.');
end;
procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo сообщение с временем отключения клиента
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Клиент отключился.');
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo клиентское сообщение
ChatMemo.Lines.Add(Socket.ReceiveText());
end;

procedure TForm1.SendBtnClick(Sender: TObject);
begin
// проверка, в каком режиме находится программа
If ServerSocket.Active=True then
// отправляем сообщение с сервера (он под номером 0, поскольку один)
ServerSocket.Socket.Connections[0].SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text)
else
// отправляем сообщение с клиента
ClientSocket.Socket.SendText('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text);
// отобразим сообщение в ChatMemo
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] '+NikEdit.Text+': '+TextEdit.Text);
end;

procedure TForm1.ClientBtnClick(Sender: TObject);
begin
If ClientBtn.Tag=0 then
Begin
// клавишу ServerBtn и поля HostEdit, PortEdit заблокируем
ServerBtn.Enabled:=False;
HostEdit.Enabled:=False;
PortEdit.Enabled:=False;
// запишем указанный порт в ClientSocket
ClientSocket.Port:=StrToInt(PortEdit.Text);
// запишем хост и адрес (одно значение HostEdit в оба)
ClientSocket.Host:=HostEdit.Text;
ClientSocket.Address:=HostEdit.Text;
// запускаем клиента
ClientSocket.Active:=True;
// изменяем тэг
ClientBtn.Tag:=1;
// меняем надпись клавиши
ClientBtn.Caption:='Отключиться';
end
else
Begin
// клавишу ServerBtn и поля HostEdit, PortEdit разблокируем
ServerBtn.Enabled:=True;
HostEdit.Enabled:=True;
PortEdit.Enabled:=True;
// закрываем клиента
ClientSocket.Active:=False;
// выводим сообщение в ChatMemo
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сессия закрыта.');
// возвращаем тэгу исходное значение
ClientBtn.Tag:=0;
// возвращаем исходную надпись клавиши
ClientBtn.Caption:='Подключиться';
end;
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo пришедшее сообщение
ChatMemo.Lines.Add(Socket.ReceiveText());
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo сообщение о соединении с сервером
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Подключение к серверу.');
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// добавим в ChatMemo сообщение о потере связи
ChatMemo.Lines.Add('['+TimeToStr(Time)+'] Сервер не найден.');
end;

procedure TForm1.TextEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key=VK_Return then SendBtn.Click;
end;

end.
Изображения
Тип файла: jpg Chat.JPG (22.3 Кб, 119 просмотров)

Последний раз редактировалось alex_base; 21.12.2007 в 11:26.
alex_base вне форума Ответить с цитированием
Старый 21.12.2007, 11:28   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

если ты юзаешь ServerSocket1 и ClientSocket1 то делай так:

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i: integer;
begin
  for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
  ServerSocket1.Socket.Connections[i].SendText(Socket.ReceiveText);
end;
а для отправления пиши просто:

ClientSocket1.socket.sendtext(edit1 .text);
Перед тем как спросить ищи на форуме и в GOOGLE

Последний раз редактировалось KORN; 21.12.2007 в 11:33.
KORN вне форума Ответить с цитированием
Старый 21.12.2007, 12:10   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а мне нужно чтоб работали за ним больше двух человек,
На одном и том же компе??
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.12.2007, 16:18   #4
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
На одном и том же компе??
Нет, не на одном компе, по сети, он нормально работает но так, что 1 раз
запускаю прогу-создаю сервак, 2 раз запускаю-подключаюсь к серверу и общаюсь с ним, но 3 раз запускаю-он подключает к серверу, но сообщения видит только клиент 3 короче сам себя а мне надо чтоб все видели и свои и чужие сообщение иначе смысл как такого "чата" теряется, хрень а не чат...

Последний раз редактировалось alex_base; 21.12.2007 в 18:07.
alex_base вне форума Ответить с цитированием
Старый 23.12.2007, 12:14   #5
alex_base
Пользователь
 
Регистрация: 21.04.2007
Сообщений: 17
По умолчанию

Ну помогите хоть кто-нибудь с потоками чтоб реализовать мне чат не только для двух компов, а на большее количество!!!
alex_base вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц