Sto imparando la programmazione dei socket. Ho un'applicazione Java come mio server e C # per il client. Basta inviare le linee di corda da uno all'altro. Di seguito sono presenti frammenti di codice che mostrano come lo sto attualmente facendo.
Ad ogni modo, essendo nuovo a questo, ci sono ancora due punti che mi infastidiscono:
Se si invia una stringa molto grande, è possibile che un frammento arrivi e quindi l'altro frammento. Ovviamente questo ha senso, specialmente in connessioni lente come le mie. I miei dubbi sono:
- Supponiamo di inviare la mia stringa molto grande, che arriverà tra due tempi. Suppongo sia plausibile che la seconda metà arrivi prima della prima, per qualsiasi motivo di rete. Se questo è il caso, come si dovrebbe gestire questo?
- Quindi la mia stringa molto grande viene inviata e blocchi di dimensioni diverse arrivano uno dopo l'altro - qual è il modo giusto per determinare che tutti questi blocchi appartengono alla stessa stringa? In altre parole, se invio
"I like cats"
e il target riceve"I like"
e"cats"
, come può dedurre che queste due cose siano destinate a far parte della stessa frase, piuttosto che a due frasi diverse? Io indovina che questo dipende interamente dai miei protocolli: forse posso inviare tag come<start>
e<finish>
come parte della mia frase - in questo modo il ricevitore sa che qualunque cosa si trova tra i due i tag sono una frase ... assumendo che i pezzi arrivino nell'ordine previsto (che dipende dalla mia domanda sopra).
Ricezione di una stringa
JAVA
while (true) {
if (socket.getInputStream().available() != 0) {
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Got message: " + input.readLine());
}
}
C #
byte[] myReadBuffer = new byte[1024];
System.Text.StringBuilder message = new System.Text.StringBuilder();
int numberOfBytesRead = 0;
do{
numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);
message.AppendFormat("{0}", System.Text.Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while(stream.DataAvailable);
Invio di una stringa
JAVA
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("HELLO");
C #
string msg = "HELLO";
byte[] messageBytes = System.Text.Encoding.ASCII.GetBytes(msg);
stream.Write(messageBytes,0,messageBytes.Length);