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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.12.2010, 22:06
KUSTS KUSTS вне форума
Прохожий
 
Регистрация: 04.11.2010
Сообщения: 9
Репутация: 10
По умолчанию Передача сообщений через сокеты (не работает)

В общем, не работает программа на сокетах помогите пожалуйста найти ошибку.
Вкратце опишу собственно саму проблему:
Пользователь №1 - в своей программе вводит адрес и порт для подключения к пользователю №2.
Пользователь №2 - к нему осуществляется подключение первого пользователя, а он в свою очередь подключается автоматически к первому пользователю.
Создается что то вроде 2х каналов связи для передачи сообщений в одностороннем порядке(один-в одну сторону, другой-в другую).
Так вот подключение создается успешно, но сообщения от пользователя №1 к №2 не передаются, а сообщение от 2 к 1 нормально.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    srvrsckt1: TServerSocket;
    clntsckt1: TClientSocket;
    btn1: TButton;
    btn2: TButton;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    lst1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    lbl1: TLabel;
    lbl2: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure clntsckt1Connect(Sender: TObject; Socket: TCustomWinSocket);
    procedure clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure btn2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure srvrsckt1ClientWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure srvrsckt1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a:string;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
{Если соединение уже установлено - прерываем его.}
  if clntsckt1.Active then
  begin
    clntsckt1.Close;
    Exit; {...и выходим из обработчика}
  end;
  {Присваиваем свойствам Host и Port нужные значения}
  clntsckt1.Host := Edt1.Text;
  clntsckt1.Port := StrToInt(Edt2.Text);
  {Пытаемся открыть сокет и установить соединение}
  clntsckt1.Open;
end;

procedure TForm1.clntsckt1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  b:string;
begin
 b:=clntsckt1.Socket.RemoteAddress;
 {Как только произошло соединение - посылаем приветствие}
  Socket.SendText('HELLo');
  Lst1.Items.Add('<Вы подключились к: ' +b);
end;

procedure TForm1.clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
{Если пришло сообщение - добавляем его в ListBox}
  Lst1.Items.Add('> ' + Socket.ReceiveText);
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
{Нажата кнопка - посылаем текст из третьего TEdit}
  clntsckt1.Socket.SendText(Edt3.Text);
  Lst1.Items.Add('< ' + Edt3.Text);
  edt3.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
srvrsckt1.Active:=true;
if srvrsckt1.Active=true then label1.Color:=clGreen;
if srvrsckt1.Active=true then label1.Caption:='ONLINE';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
srvrsckt1.Active:=false;
if srvrsckt1.Active=false then label1.Color:=clRed;
if srvrsckt1.Active=false then label1.Caption:='OFFLINE';
end;

procedure TForm1.srvrsckt1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Lst1.Items.Add('> ' + Socket.ReceiveText);
end;

procedure TForm1.clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
if srvrsckt1.Active=False then Form2.ShowModal;
end;

procedure TForm1.srvrsckt1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var a:string;
begin
a:=srvrsckt1.Socket.Connections[0].RemoteAddress;
if clntsckt1.Active then
  begin
    clntsckt1.Close;
    Exit; {...и выходим из обработчика}
  end;
  {Присваиваем свойствам Host и Port нужные значения}
  clntsckt1.Host :=a;
  clntsckt1.Port :=1025;
  {Пытаемся открыть сокет и установить соединение}
  clntsckt1.Open;
end;

end.



ps: вот исходник http://depositfiles.com/files/428lmy64x обратите внимание на эвенты для компонентов батон, и сокеты.
Ответить с цитированием
  #2  
Старый 05.12.2010, 09:37
KUSTS KUSTS вне форума
Прохожий
 
Регистрация: 04.11.2010
Сообщения: 9
Репутация: 10
По умолчанию

Помогите пожалуйста!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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