TCP MiniClient funzionante ma da migliorare

Salve a tutti.
Ho scritto un piccolo chatserver (TCPServer::new etc etc)
che usiamo a lezione per chattare in gruppo in tranquillità loggando
con client tipo netcat o telnet.
Oggi mi sono messo a scrivere un client e sarò inesperto ma ho
realizzato
che è meno banale del previsto ç_ç.(colpa mia sicuramente!sono
inesperto)
Alla fine sono riuscito a scrivere qualcosa di effettivamente
funzionante
ma sono sicuro che esistono altre maniere per ottenere lo stesso
risultato e cerco qualcuno che mi possa illuminare al riguardo.
L’ossatura del client è:
#################################################################
require ‘socket’
connection=TCPSocket::new(“127.0.0.1”,2200)

fork do
while 1
a=Thread.new{ print connection.readline }
a.join
end
end

while 1
b=Thread.new { input=sprintf(gets()); connection.print(input) }
b.join
end

Process.exit!
###################################################################
L’ultima riga l’ho messa in maniera un po brutale ma funziona, mi evita
di trovarmi un processo ancora attivo dopo l’uscita dal primo( esiste un
modo meno brutale di scrivere sta cosa?)
Per quanto riguarda i vari tentativi precedenti ho provato a scrivere 2
thread senza il fork ma non sono riuscito a trovare un modo per farli
dialogare tra loro o comunque a sbloccarmi l’IO.
Sono sicuro che c’è qualcosa a livello di Thread,Socket o IO che mi
sfugge.
Ribadisco: il client funziona ma non mi sento soddisfatto, mi pare
di aver scritto qualcosa che poteva essere fatta in maniera molto piu
performante ed elegante. Grazie in anticipo e Saluti.

beh ho realizzato che i thread non mi servono a nulla col fork…
quindi ho riscritto l’ossatura del client così:

require ‘socket’
connection=TCPSocket::new(“127.0.0.1”,2200)

fork do
while 1
print connection.readline
end
end

while 1
input=sprintf(gets())
connection.print(input)
end

ma restano i quesiti del post precedente.
i thread nell’altro client li avevo messi commettendo un errore banale
probabilmente perchè avevo il cervello in pappa dopo aver provato per
mezz’ora a far funzionare il tutto senza andare in fork sul processo.

Alla fine riaffrontando il problema con il classico “cervello del giorno
dopo”
ho realizzato che la soluzione piu semplice sembra essere:
######################################
require ‘socket’

sock=TCPSocket::new(“127.0.0.1”,2200)

b=Thread.new {
while 1
input=sprintf(gets())
sock.print(input)
end
}

while 1
print sock.readline
end

b.join
#####################################
Ho provato cose arzigogolate pensando nella maniera totalmente errata ed
alla fine, riaffrontando il programmino con calma ho capito che la
soluzione era veramente dietro l’angolo…bon almeno credo di aver
imparato da solo qualcosa :smiley:
Saluti e scuse per lo spam.(consigli sono sempre ben accetti, o altre
soluzioni praticabili)

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs