Я разрабатываю приложение в C # Net framework 2.0. По сути, это приложение с клиентским классом tcp. приложение подключается к моему серверу, который является базовым сервером ruby ​​tcp, он остается в течение 4 часов, а затем отключается

class TelnetConnection
{
TcpClient tcpSocket;
int TimeOutMs = 400;
static string host = null;
static int prt = 0;
static int timetorec = 10; //sec

public TelnetConnection(string Hostname, int Port)
{
    host = Hostname;
    prt = Port;
    try
    {
        tcpSocket = new TcpClient(Hostname, Port);
    }
    catch (Exception x)
    {
        Console.WriteLine(x.Message)
    }
}

public void reconnect(int sec)
{
    try
    {
        System.Threading.Thread.Sleep(sec * 1000); //10sec then retry
        tcpSocket = new TcpClient(host, prt);
    }
    catch (Exception x)
    {
        Console.WriteLine(x.Message)
    }
}

public string Login(string Username, string Password, int LoginTimeOutMs)
{
    int oldTimeOutMs = TimeOutMs;
    TimeOutMs = LoginTimeOutMs;
    string s = Read();
    if (!s.TrimEnd().EndsWith(":"))
        throw new Exception("Failed to connect : no login prompt");
    WriteLine(Username);

    s += Read();
    if (!s.TrimEnd().EndsWith(":"))
        throw new Exception("Failed to connect : no password prompt");
    WriteLine(Password);

    s += Read();
    TimeOutMs = oldTimeOutMs;
    return s;
}



public string Read()
{
    try
    {
        if (!tcpSocket.Connected) return null;
        StringBuilder sb = new StringBuilder();
        do
        {
            Parse(sb);
            System.Threading.Thread.Sleep(TimeOutMs);
        } while (tcpSocket.Available > 0);
        return sb.ToString();

    }
    catch (Exception) { return null; }
}





protected override void OnStart(string[] args)
{
    System.Runtime.Remoting.Lifetime.LifetimeServices.LeaseTime = TimeSpan.MaxValue;
    while (tc.IsConnected)
    {
        Thread.Sleep(120);
        what(tc.Read());
    }
}



static void what(string w)
{
    if (w == "Example")
    {
        //DO
    }
}
}

Пожалуйста, помогите, я пробовал tcp client instaid, но то же самое приложение должно всегда оставаться подключенным. RUBYCODE

require 'socket'      # Sockets are in standard library

hostname = 'localhost'
port = 2000

s = TCPSocket.open(host, port)

while line = s.gets   # Read lines from the socket
  puts line.chop      # And print with platform line terminator
end

И повторите рубин, это просто пример сокета, который я использую

0
user1692494 26 Сен 2012 в 11:00

1 ответ

Лучший ответ

Вам нужно будет периодически отправлять некоторые данные, чтобы межсетевые экраны и устройства NAT не истекали тайм-аутом для своих записей для подключения.

0
David Schwartz 26 Сен 2012 в 11:08
Имеет значение, отправляю ли я сообщение с сервера клиенту или наоборот, пока я продолжаю обмениваться сообщениями между ними
 – 
user1692494
26 Сен 2012 в 11:12
Нет, неважно. Для сохранения состояния соединения просто требуется, чтобы пакет был отправлен в каждом направлении, а отправленные данные будут подтверждены стеком TCP, поэтому отправка данных в одном направлении приводит к пакету в каждом направлении.
 – 
David Schwartz
26 Сен 2012 в 11:30