2015-10-16 40 views
6

So che questa domanda è stata posta più volte già qui su SO, ma non un singolo thread ha affrontato esattamente lo stesso problema che stiamo affrontando al momento.C# TcpClient, leggere e scrivere stream simultaneamente

Fondamentalmente stiamo lavorando a un'applicazione server/client TCP, dove il server è scritto in Java e il client è scritto in C#. Sono sul lato Java, e sto usando flussi separati e in uscita per i miei buffer.

Il nostro problema è che se il client riceve messaggi dal server e legge quei messaggi in modo asincrono dal buffer e tenta di scrivere qualcosa all'interno di tale processo viene generata un'eccezione, nessuna sorpresa.

La mia domanda è: qual è la strada da percorrere in questo scenario? Creazione di flussi separati? Ci abbiamo già provato, ma sembrava che il C# non ci volesse. Abbiamo un disperato bisogno di una soluzione qui e ogni aiuto è molto apprezzato!

+0

Fondamentalmente, è necessaria una soluzione in C# per leggere e scrivere contemporaneamente? il lato java sta funzionando? –

+0

Sì, funziona. Abbiamo appena risolto questo problema, ma vorrei comunque sapere se c'è un modo per avere flussi separati in C# – Psylution

risposta

7

No, dovrebbe funzionare. Quello che ti serve è TcpClient, che probabilmente hai già. Da lì TcpClient.GetStream(), restituendo NetworkStream. Quindi le operazioni di lettura e scrittura possono avvenire simultaneamente/contemporaneamente senza necessità di sincronizzazione. Quindi leggere e scrivere può avvenire nello stesso tempo.

Ciò che deve essere sincronizzato è più letture contemporanee. Tutte le letture simultanee devono essere sincronizzate da lock(objReads).

Analogamente, più scritture simultanee devono essere sincronizzate da lock(objWrites).

MSDN says, che è garantito.

Si prega di notare che ho chiarito che le letture e le scritture hanno serrature diverse.

+0

Abbiamo già risolto, il problema era dalla nostra parte - ma grazie per la spiegazione aggiuntiva! Ora so anche che non ho flussi _need_ separati. – Psylution

+0

@ neil-patrao Grazie per aver migliorato la risposta :). – ipavlu