Newsgroup: it.comp.java
Titolo: dubbio sulla scrittura su di un OutputStream di un Socket

Salve a tutti.
Ho un oggetto OutputStream, preso da un Socket con il metodo
Socket.getOutputStream().
Volevo chiedere se l'operazione di scrittura su codesto OutputStream,
avviene istantaneamente oppure no.
Il altre parole, il thread che esegue l'operazione viene sospeso fino a
quando il destinatario non riceve il dato (anche senza che esso esegua una
lettura a sua volta)?
Se io ad esempio spedisco un dato ad una macchina che ha un ping alto, il
thread che esegue la scrittura rimane bloccato per questo tempo?
Io credo proprio che si blocchi, ma vorrei una conferma.
Grazie mille,
Alessandro
P.s.: ho notato che istanziando un oggetto ServerSocket(int) non mi viene
aperta una porta pubblica... Quindi se mi collego a questo server da locale
non cè problema se faccio da remoto non funziona... Come faccio?
-- 
----------------
email: 
el_contadin...@libero.it
---------------

 strano...dovrebbe funzionare!
Hai un firewall o peggio ancora XP?? 

 non cč problema se faccio da remoto non funziona... Come faccio?
1
non hai scelta, purtroppo
o ti fai aprire una porta qualsiasi libera dall'Administrator
e ti metti in ascolto su quella, comunque rischiando che
abbia la porta chiusa il client
2
oppure la rubi a un servizio classico tipo
mail/news ...
3
oppure, il che eě un pochino + impegnativo,
ti sostituisci al web server sulla 80
( lo devi riscrivere , e non e' poi cosi' difficile )
4
per ultima usa una servlet
e chiedi lo stream nel metodo doget/dopost
e' la stessa cosa e passi dalla 80
         cya Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 locale non cè problema se faccio da remoto non funziona... Come faccio?
tutte le porte sono pubbliche, basta dire al firewall di non bloccarle
(basta «aprire» su quell'"int" passato al costruttore).
-- 
Njc

 sufficienza.
Scusa, ma non è ben chiaro questo discorso della bufferizzazione...
Ma in ogni caso le operazioni di write eseguite sull'oggetto OutputStream
restituito dal metodo getOutputStream di un Socket passano prima attraverso
un buffer?
E il trasferimento reale dei dati tra le due macchine avviene solamente
quando il buffer si riempie (viene trasferito in un colpo tutto il
contenuto del buf.) oppure di continuo (man mano che scrivo nel buf. esso
viene automaticamente svuotato man mano)?
A me cmq la spedizione del dato mi serve che avvenga subito.
Il mio problema reale si può semplificare così:
Ho un server che gestisce una spece di chat tra più client. Quando un client
invia un dato al server, il server manda questo dato a tutti gli altri
client: 
for (tutti i client che sono collegati)
   oggettoObjectOutputStream_delClientGiusto.writeObject(dato);
Io vorrei evitare che il secondo client debba per forza attendere che il
primo client abbia ricevuto il dato (Uno con una T3 riceverà per cui prima
il dato rispetto a uno con un 56k).
Avevo per qui pensato di creare un thread che esegua l'operazione di
scrittura, per ogni writeObject che viene fatto nel ciclo.
Io devo trasferire degli oggetti (tutti di una manciata di byte) e quindi
istanzio un ObjectOutputStream.
E' la strada giusta o mi sto complicando la vita?
Altrimenti come potrei fare?
Ringrazio in anticipo per le eventuali risposte...
Saluti,
Alessandro


 Altrimenti come potrei fare?
Socket diverse hanno buffer diversi, quindi finché uno dei client non
s'intoppa, nessuno dovrà aspettare l'altro; ma siccome il caso in cui uno
si scolleghi in modo "bruto" non è poi così ipotetico, è meglio trovare
un'altra soluzione.
Ci sono tanti aspetti che bisogna considerare: quanti sono i client ? Quante
risorse si è disposti ad occupare ? Quanto traffico c'è sui singoli
canali ?
Una soluzione che mi viene in mente potrebbe essere quella di assegnare un
thread per ogni client per l'output, mentre gestire tutti gli input con una
"select" su un altro thread; ma nulla vieta di fare tutto con 2 thread
controllando prima la disponibilità dei canali e poi scrivendo il dato in
modo che non si blocchi.
Ti consiglio di leggere la documentazione delle classi Selector,
SocketChannel (register(...)), ecc.
Anch'io piano piano mi sto documentando su queste classi, e non ho ancora
avuto il tempo per fare prove pratiche comparative, quindi non è che io sia
proprio un guru a riguardo :)
-- 
Njc

 modo che non si blocchi.
Complimenti per l'altro post
sulla Server Socket
veramente esaustivo
Comunque quoto e sottoscrivo che se fai un server su una porta ,
di qualsiasi genere,
devi dare un thread ad ognuno che chiama
al thread passi solo i dati del chiamante e poi lo lasci in contatto col
client
mentre aspetti gli altri arrivi sul loop principale
che e' un while true
cya


Grazie mille per l'esauriente risposta, di più non potevo chiedere :)
Mi guarderò sicuramente la doc che mi hai suggerito ma dato che sto facendo
semplicemente un progetto per l'università (e il tempo scarseggia e sto già
facendo un sacco di roba in più..) mi sa che la vedrò alla fine...
Un'ultima domandina... senza usare SocketChannel & CO , con un oggetto
Socket semplice e usando i input/output-stream da lui ritornati, la
scrittura/lettura contemporanea sul socket su 2 thread diversi può creare
problemi?


la server socket ti da uno stream
diverso per ogni chiamata in arrivo
tu dai quello ai thread che quindi non vanno in conflitto
di fatto il socket fisico e' lo stream
quindi hai un socket/thread
 cya Nicola
