|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
TCPClient, TCPServer и интернет
Доброго времени суток!
Хотелось бы узнать, компоненты 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), тогда точно отправит текст
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#7
|
|||
|
|||
Спасибо всем за советы.
КлиентСокет и СерверСокет использовал, аналогично. Код программы рабочий. К Админу обращаться?а как тогда работают другие программы подобного рода? |
#8
|
|||
|
|||
У меня TClientSocket;TServerSocket работают на ура. Если у тебя ситуация 4, то без админа я выхода не вижу. Другие проги могут работать кучей других способов. И рассматривать каждый из них у меня нет возможности, могу обьяснить решение если будет конкретная ситуация и я подскажу решение.
|
#9
|
|||
|
|||
спасибо за код, помог моему обучению в сетевом программировании.
Только такой вопрос: а как отправить строку с TCPServer, и принять её TCPClient? |
#10
|
||||
|
||||
Цитата:
СОГЛАСЕН!!! но если использовать tcp сервак и клиент из вкладки INDY то всё попрёт!!! а эти компоненты только для сети. Почаще читай help в delphi !!! http://rgdgames.ucoz.ru/ всё для программиста и всё для создания игр |
#11
|
||||
|
||||
Да кстати актуальный вопрос. я тож не могу понять как серваку отправлять сообщение для клиентов? мб кто подскажет? я даж на форуме такую тему создавал
http://rgdgames.ucoz.ru/ всё для программиста и всё для создания игр |
#12
|
|||
|
|||
проблема такая же как и у тебя
через интерент Client не видит Server использовал и TClientSocket и TIdTCPClient не работает, а через локалку работает как ты справился с этой проблемой?? Помоги, очень нужно мыло: darkdaiver777@gmail.com аська: 412-842-920 Заранее спасибо |