powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP Client-Server Delphi-C#
19 сообщений из 19, страница 1 из 1
TCP Client-Server Delphi-C#
    #38153446
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток!

Пытаюсь написать простой клиент-сервер.
Написал на Delphi - Всё нормально, Клиент отправляет небольшой текст на сервер, и принимает строчку ответа от сервера.
Но задача написать Клиент на Delphi, а сервер нужен на C#.
И тут возникает загвоздка с ответом от сервера. Т.е. сервер всё получает, и даже ответ отправляет, но вот клиент виснет на моменте получения ответа.

Код клиента на Delphi:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
unit ClientUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm2 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    host: TEdit;
    SendBtn: TButton;
    send: TEdit;
    ans: TEdit;
    port: TEdit;
    procedure SendBtnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.SendBtnClick(Sender: TObject);
begin
  //Соединяемся с сервером и посылаем ему введенную команду
  IdTCPClient1.Host := host.Text;
  IdTCPClient1.Port := StrToInt(port.Text);
  IdTCPClient1.Connect;
  IdTCPClient1.Socket.WriteLn(send.Text);
  send.Clear;
  //Ожидаем ответ и закрываем соединение
  try
    ans.Text := IdTCPClient1.Socket.ReadLn; // <-- Строчка на которой подвисает
  except
    ShowMessage('No ans');
  end;
  IdTCPClient1.Disconnect;
end;

end.



Код сервера на C#:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text.RegularExpressions;
using System.IO;

namespace HTTPServer {
    class Client {
        private void SendAnswer(TcpClient Client, string Str) {
            Str += "\r\n";
            byte[] Buffer = Encoding.ASCII.GetBytes(Str);
            Client.GetStream().Write(Buffer, 0, Buffer.Length);
            Client.Close();
        }
        public Client(TcpClient Client) {
            string Request = "";
            byte[] Buffer = new byte[1024];
            int Count;
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) {
                Request += Encoding.ASCII.GetString(Buffer, 0, Count);
                if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; }
            }
            Console.WriteLine(Request);
            string Headers = "Answer\r\n";
            byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
            Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);
            Console.WriteLine("Answer sended");
            Client.Close();
        }
    }

    class Server {
        TcpListener Listener;

        public Server(int Port) {
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start();
            while (true) {
                ThreadPool.QueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient());
            }
        }
        static void ClientThread(Object StateInfo) {
            new Client((TcpClient)StateInfo);
        }
        ~Server() {
            if (Listener != null) {
                Listener.Stop();
            }
        }
        static void Main(string[] args) {
            int MaxThreadsCount = Environment.ProcessorCount * 4;
            ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
            ThreadPool.SetMinThreads(2, 2);
            new Server(8000);
        }
    }
}



У кого-нибудь есть предложения в чем дело?
Я вроде понимаю что может дело в том что нужно читать поток, но не пойму как...
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38154326
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Отлаживать сервер пробовал?
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38154691
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cobalt747,

Что значит отлаживать? Сервер то вроде как раз работает нормально, если не ошибаюсь проблема на клиенте
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38155024
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько я в свое время трахался с Indy компонентами... В результате выкину и написал на АПИ.

Сейчас народ на меня будет кидаться за пиар (уже 2-й раз в короткое время упоминаю), но есть вот это: http://code.google.com/p/uo-ext/ код на дельфи. С одной стороны - Си приложение, с другой C# сервер. Сама программулина является прокси. Есть возможность как блоировать некоторые сообщения, так и генерировать по внешним признакам.

Если коротко, то вам дебажить Indy компоненты.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38155458
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне вот кажется, что код сервера несколько корявый

вот этот кусок, к примеру, чем занимаеццо?
Код: c#
1.
2.
3.
4.
while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) {
           Request += Encoding.ASCII.GetString(Buffer, 0, Count);
           if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; }
       }
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38155865
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайцев Фёдор,

А кстати... Аффтор дибил (и я тоже - сразу не увидел), он в реквесте ждет 2 раза CRLF, а посылает - один.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38155946
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,

Либо я совсем, либо мы не то обсуждаем...

Это ведь прием от клиента инфы, ну возможно что кол-вом CRLF, ну отвалится по Request.Length

А меня обратка интересует, Клиент не принимает инфу от Сервера!
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38155975
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Дык, что сервер твой в консоль пишет?
Answer есть?
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156003
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cobalt747,

В консоли пишет полученный текст от клиента, и пишет ответ отправлен...

Причем если подключаться из Браузера - всё работает
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156025
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Тебе еще раз, му-у-у-удрому человеку говрят... IdTCPClient1.Socket.WriteLn(send.Text); отдаст только один \r\n и твой сервер ничего делать не будет. Смотреть надо что в сокет пишешь.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156128
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,

Как же мудро, только загвоздка в том, что Сервер делает, и делает НОРМАЛЬНО!
Вопрос в другом!
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156843
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Пример, только что сделал на Д7+Indy10(r3568)
Клиент прям как твой, сервер - на Инди.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156905
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cobalt747,

Я не понимаю к чему это, в самом первом посте я писал что изначально сделал всё на Delphi, и всё работает. Не работает с сервером на С#, а мне он нужен именно на C#... Причем сервер работает, как я уже неоднократно говорил, к примеру если использовать в качестве Клиента FireFox то всё в порядке.. отсюда я делаю вывод в том, что проблема в Клиенте на Delphi, и именно в месте получения ответа, как я уже это и говорил.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156930
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Запускаешь Wireshark, и сравниваешь обмен данными клиента с Дельфи-сервером и C#-сервером.
Учись отлаживать программы.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156932
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

Тебе сложно воткнуть 2-й IdTCPClient1.Socket.WriteLn; после первого? Тогда тебе тут не помогут.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156949
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче... Автор, ты всех задрал. Вот код клиента с Id который работает с твоим сервером. Только что сам проверил.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

var
  Client:TIdTCPClient;
begin
  try
    Client := TIdTCPClient.Create(nil);
    Client.Host := '127.0.0.1';
    Client.Port := 8000;
    Client.Connect;
    Client.Socket.WriteLn('Hello!');
    Client.Socket.WriteLn;

    WriteLn('Answer: ', Client.Socket.ReadLn);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

Код сервера скопипастил с твоего. Или полный код приводишь, или тебе тут не помогут.
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156962
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cobalt747, спасибо за Wireshark, не знал - буду учиться!

Warstone, спасибо за настойчивость, и правда ведь дебил я...
Но я так и не понял как может прием на отправку ответа влиять...

Как я понимаю:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public Client(TcpClient Client) {
	string Request = "";
	byte[] Buffer = new byte[1024];
	int Count;
// Тут идет считывание от Клиента
	while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) {
		Request += Encoding.ASCII.GetString(Buffer, 0, Count);
		if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; }
	}
	Console.WriteLine(Request);
// А тут вроде совершенно независимый ответ
	string Headers = "Answer\r\n";
	byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
	Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);
	Console.WriteLine("Answer sended");
	Client.Close();
}




В любом случае всё заработало, еще раз прошу прощение за тупизм!
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156971
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wrun,

У тебя может быть подземный стук... Допустим есть еще один Инди клиент на форме, который подключается туда-же и правильно все отсылает... Ты видишь что он отработал. Что-бы словить глюк надо сделать так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        public Client(TcpClient Client) {
            string Request = "";
            byte[] Buffer = new byte[1024];
            int Count;
            Console.Write("New connection recieved");
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) {
                Request += Encoding.ASCII.GetString(Buffer, 0, Count);
                if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; }
            }
            Console.WriteLine(Request);
            string Headers = "Answer\r\n";
            byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
            Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);
            Console.WriteLine("Answer sended");
            Client.Close();
        }

Спорим ты 2 New connection recieved словишь?
...
Рейтинг: 0 / 0
TCP Client-Server Delphi-C#
    #38156980
Wrun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,

Понял, спасиб!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TCP Client-Server Delphi-C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]