Domanda

Sto creando un server di rubino che si connette a un client TCP. Il mio server utilizza un TCPServer e sto tentando di utilizzare TCPServer :: recv (), ma non aspetta per i dati, quindi basta continua in un loop stretto fino alla ricezione dei dati.

Qual è il modo più efficace per elaborare i dati intermittente? Sono in grado di modificare i dati inviati in dato che sto tentando di emulare un altro server. Che leggono come dichiarazione TCPServer / TCPSocket sarebbe attendere i dati inviati?


    require "socket"
    dts = TCPServer.new('localhost', 20000)
    s = dts.accept
    print(s, " is accepted\n")
    loopCount = 0;
    loop do
      Thread.start(s) do
        loopCount = loopCount + 1
        lineRcvd = s.recv(1024)
        if ( !lineRcvd.empty? )
          puts("#{loopCount} Received: #{lineRcvd}")
          s.write(Time.now)
        end
      end
    end
    s.close
    print(s, " is gone\n")

Grazie per il vostro tempo.

È stato utile?

Soluzione

Sei sicuro recv è non tornare "" - che significa il socket viene chiuso? Se no allora forse le vostre prese sono impostate per non bloccante in qualche modo?

EventMachine è infatti molto più veloce rispetto all'utilizzo fili per la programmazione presa :) GL. -r

Altri suggerimenti

In base alle domande che sono chiesto, penso che si dovrebbe provare un framework come EventMachine e scrivere un server che implementa ciò che si vuole invece di cercare di agitarsi intorno con la scrittura di un wrapper server.

Detto questo, il modo più efficace di leggere da un socket è quello di utilizzare una corretta chiamata selezionare e interrogare tutte le connessioni aperte. Anche se questa è una cosa abbastanza accademica per chi ha sviluppato applicazioni client-server prima, è un fastidio, perché ci sono un sacco di cose che si possono facilmente ottenere sbagliato. Per esempio. gestire connessioni multiple può portare a tutti i tipi di situazioni fastidiose se non si è particolarmente attento a evitare di bloccare le chiamate.

Il quadro EventMachine lo rende facile sviluppare i server di query / risposta-tipo, perché si può sempre iniziare con un modello e lavorare da lì, per esempio, il built-in EventMachine :: :: protocolli LineAndTextProtocol uno funziona come un grande base per la maggior parte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top