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

Пытаюсь написать простой клиент-сервер.
Написал на 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
17.02.2013, 01:19
    #38154326
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
Wrun,

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

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

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

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

вот этот кусок, к примеру, чем занимаеццо?
Код: 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
18.02.2013, 15:47
    #38155865
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
Зайцев Фёдор,

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

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

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

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

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

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

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

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

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

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

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

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

Тебе сложно воткнуть 2-й IdTCPClient1.Socket.WriteLn; после первого? Тогда тебе тут не помогут.
...
Рейтинг: 0 / 0
19.02.2013, 10:55
    #38156949
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
Короче... Автор, ты всех задрал. Вот код клиента с 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
19.02.2013, 10:59
    #38156962
Wrun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
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
19.02.2013, 11:06
    #38156971
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
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
19.02.2013, 11:08
    #38156980
Wrun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TCP Client-Server Delphi-C#
Warstone,

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


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