le but de la prise.shutdownOutput()
Je suis en utilisant le code ci-dessous pour envoyer des données à un serveur tcp. Je suppose que j'ai besoin d'utiliser socket.shutdownOutput()
pour bien indiquer que le client envoi de la demande. Est mon hypothèse est correcte? Si non, merci de me faire savoir le but de shutdownOutput()
. Aussi apprécions tous les autres optimisations que je puisse faire.
Client
def address = new InetSocketAddress(tcpIpAddress, tcpPort as Integer)
clientSocket = new Socket()
clientSocket.connect(address, FIVE_SECONDS)
clientSocket.setSoTimeout(FIVE_SECONDS)
//default to 4K when writing to the server
BufferedOutputStream outputStream = new BufferedOutputStream(clientSocket.getOutputStream(), 4096)
//encode the data
final byte[] bytes = reqFFF.getBytes("8859_1")
outputStream.write(bytes,0,bytes.length)
outputStream.flush()
clientSocket.shutdownOutput()
Serveur
ServerSocket welcomeSocket = new ServerSocket(6789)
while(true)
{
println "ready to accept connections"
Socket connectionSocket = welcomeSocket.accept()
println "accepted client req"
BufferedInputStream inFromClient = new BufferedInputStream(connectionSocket.getInputStream())
BufferedOutputStream outToClient = new BufferedOutputStream(connectionSocket.getOutputStream())
ByteArrayOutputStream bos=new ByteArrayOutputStream()
println "reading data byte by byte"
byte b=inFromClient.read()
while(b!=-1)
{
bos.write(b)
b=inFromClient.read()
}
String s=bos.toString()
println("Received request: [" + s +"]")
def resp = "InvalidInput"
if(s=="hit") { resp = "some data" }
println "Sending resp: ["+resp+"]"
outToClient.write(resp.getBytes());
outToClient.flush()
}
OriginalL'auteur Aravind R. Yarram | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
Socket.shutdownOutput()
signifie que le client est la fin de l'envoi des données par la connexion TCP. Il va envoyer les données restantes suivie par une séquence de fin qui va complètement fermer sa connexion SORTANTE. Il n'est pas possible d'envoyer toutes les autres données, ce qui permettra également d'indiquer à votre programme que la demande est complètement terminé. Il est donc recommandé si vous êtes sûr que vous n'avez pas à envoyer plus de données.Mais il n'est pas nécessaire d'indiquer que la demande n'est pas terminée (vous n'avez pas à ouvrir/fermer la sortie de tous les temps si vous avez des demandes multiples), il y a d'autres façons.
Si vous avez plusieurs demandes à envoyer au serveur, vous pouvez par exemple définir un "paquet magique" (un de spécial, unique tableau d'octets), l'envoi cela peut indiquer que le serveur que l'on demande clos.
un exemple simple (qui n'est pas adapté pour les plus sophistiquées, d'importants programmes) serait le tableau d'octets de la Chaîne "Fin", en supposant que vous n'êtes pas envoyer des Chaînes de caractère....
OriginalL'auteur Leander
OUI Votre hypothèse est correcte. Et cette sortie de l'Arrêt est connu comme près de la moitié . Utiliser la moitié de fermer le TCP fournit la capacité pour une extrémité de la connexion pour mettre fin à sa sortie, tout en continuant à recevoir des données à partir de l'autre extrémité. Laissez-moi vous guider à travers les effets de
socket.shutdownOutput()
méthode :fins, mais pour les buts de l'écriture de la douille et de ses flux de sortie se comporter
comme si la prise a été fermée à cette fin: à la suite écrit à l'
prise jeter un
IOException
un accusé de réception) est en attente d'être envoyés après tout dans l'attente de données ont été envoyées et reconnu.
la lecture des fins de la prise se comporte comme si elle avait été fermée par la présente
fin: plus de lit à partir de la prise de retour d'un EOF condition, c'est à dire un lire le nombre d'
de -1 ou une
EOFException
, en fonction de la méthode appelée.a déjà été envoyé, et ne se répète pas; si l'autre est déjà
fait un demi-ainsi, tous les échanges du protocole sur la douille sont maintenant
complète.
Ainsi, nous voyons que Lorsque les expressions du FOLKLORE est reçu, celui-ci est assuré que l'autre extrémité a fait la sortie de l'arrêt. Et ce scénario est parfaitement atteint par
socket.shutDownOutput()
sur l'autre côté.Source: Fondamentaux de Réseau en Java, Esmond Pitt
OriginalL'auteur Vishal K