![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток!
Хотелось бы узнать, компоненты TCPClient и TCPServer работают через интернет?у сервера и у клиента IP динамические. У меня не работает, скажи пожалуйста, что я делаю не так. Заранее спасибо. Клиент: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Sockets, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
TcpClient1: TTcpClient;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
TcpClient1.RemoteHost := LabeledEdit1.Text;
TcpClient1.RemotePort := LabeledEdit2.Text;
TcpClient1.Active := true;
TcpClient1.Connect;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TcpClient1.Sendln(Memo1.Text);
end;
end.Сервер: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Sockets, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
TcpServer1: TTcpServer;
Memo1: TMemo;
procedure TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
Memo1.Text := ClientSocket.Receiveln;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
end. |
|
#2
|
|||
|
|||
|
Если сервер и клиент не находятся в одной локальной сети, то ничего у тебя НЕ ПОЛУЧИТЬСЯ!
|
|
#3
|
||||
|
||||
|
Работают, если сервер имеет прямой выход в интернет.
|
|
#4
|
|||
|
|||
|
Вообще с TCPClient, TCPServer не работал не знаю, но:
Не вижу чтобы серверу задавался порт с которого он принимает данные. Не вижу Сопоставление компоненте TCPServer вызываемой процедуры в случае входящего пакета, но судя по тексту должна быть TcpServer1Accept. А так для сведения, по сетям соединяться можно как угодно, главное чтоб все было правильно организовано: В сети компы должны быть в одной подсети и видеть друг друга. По интернету у клиента должен быть нормальный доступ через маршрутизаторы выход до сервера. На сервере его ИП должен соответствовать тому куда "звонит" клиент и соответственно открыт порт на нем. Примеры: 1) В ЛВС. ИП Клиента 192.168.0.15, сервер 192.168.0.21. Клиент "звонит" на 192.168.0.21 порт 1212. На сервере 1212 открыт серверной программой. 2) В интернет(Оба компа подключены напрямую и имеют на сетевых интерфейсах ИП типа 87.113.74.ХХ). Ситуация как и случае 1 Клиент звонит на 87.113.74.ХХ сервера на порт, порт открыт. 3) В интернет(Клиент подключен через ЛВС имеющую Роутер в инет, Клиент имеет на сетевом интерфейсе ИП типа 192.168.0.15, Сервер имеет на сетевом интерфейсе ИП типа 87.113.74.ХХ). Ситуация как и в случае 2 Клиент звонит на 87.113.74.ХХ сервера на порт, порт открыт. Маршрутизатор сам перенаправит пакет куда надо. 4) В интернет(Оба подключены через ЛВС имеющую Роутер в инет, Клиент имеет на сетевом интерфейсе ИП типа 192.168.хх.хх, Сервер имеет на сетевом интерфейсе ИП типа 192.168.хх.хх). Ситуация хоть и простая, но без сетевого Админа ты ее не решишь, Ибо Роутеры не маршрутизируют обратно. ПортМаппинг тебе в помощь. Если что пиши в личку. |
|
#5
|
|||
|
|||
|
И вообще лучше пользуй TClientSocket;TServerSocket хоть и по сложнее, но по гибче.
|
|
#6
|
||||
|
||||
|
Я сам не сильно много с этими компонентами работал, но заметил что Sendln параметр лучше использовать TStringStream.Create(Edit1.Text), тогда точно отправит текст
|
|
#7
|
|||
|
|||
|
Спасибо всем за советы.
КлиентСокет и СерверСокет использовал, аналогично. Код программы рабочий. К Админу обращаться?а как тогда работают другие программы подобного рода? |
|
#8
|
|||
|
|||
|
У меня TClientSocket;TServerSocket работают на ура. Если у тебя ситуация 4, то без админа я выхода не вижу. Другие проги могут работать кучей других способов. И рассматривать каждый из них у меня нет возможности, могу обьяснить решение если будет конкретная ситуация и я подскажу решение.
|
|
#9
|
|||
|
|||
|
спасибо за код, помог моему обучению в сетевом программировании.
Только такой вопрос: а как отправить строку с TCPServer, и принять её TCPClient? |
|
#10
|
||||
|
||||
|
Цитата:
СОГЛАСЕН!!! но если использовать tcp сервак и клиент из вкладки INDY то всё попрёт!!! а эти компоненты только для сети. Почаще читай help в delphi !!! |
|
#11
|
||||
|
||||
|
Да кстати актуальный вопрос. я тож не могу понять как серваку отправлять сообщение для клиентов? мб кто подскажет? я даж на форуме такую тему создавал
|
|
#12
|
|||
|
|||
|
проблема такая же как и у тебя
через интерент Client не видит Server использовал и TClientSocket и TIdTCPClient не работает, а через локалку работает как ты справился с этой проблемой?? Помоги, очень нужно мыло: darkdaiver777@gmail.com аська: 412-842-920 Заранее спасибо |