Connection reset by peer: socket erreur d'écriture
Je suis une exception sur OutputStream.écrire dans la dernière boucle while (il fonctionne très bien sur d'autres endroits dans le code) lors de l'exécution de ce code, c'est une implantation d'un proxy-serveur en java, lors de la recherche de l'hôte-réponse pour la longueur du contenu et de transmettre le résultat au navigateur, il fonctionne, mais lorsque j'essaie de gérer "Transfer-Encoding: chunked" politique de la même méthode ne fonctionne pas " et jette cette exception:
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at IncomingRequest.run(IncomingRequest.java:250)
is = hostSocket.getInputStream();
OutputStream os = client.getOutputStream();
System.out.println("Forwarding request from server");
byte[] currByte = new byte[1];
StringBuilder responseHeader = new StringBuilder();
int crlfCounter = 4;
//Separates the response header by looking for 2 consecutive \r\n
while (crlfCounter > 0){
is.read(currByte);
os.write(currByte);
System.out.print((char)currByte[0]);
responseHeader.append((char)currByte[0]);
if ((char)currByte[0] == '\r' || (char)currByte[0] == '\n'){
crlfCounter--;
}else{
crlfCounter = 4;
}
}
StringBuilder chuckSize = new StringBuilder();
int contentLength = 0;
int contentIndex = responseHeader.toString().indexOf("Content-Length: ");
int chunkedIndex = responseHeader.toString().indexOf("Transfer-Encoding: chunked");
if (contentIndex != -1) {
contentIndex += 16;
int conEnd = responseHeader.toString().indexOf('\n', contentIndex);
contentLength = Integer.parseInt(responseHeader.toString().substring(contentIndex,conEnd).trim());
System.out.println("Content Length is : " + contentLength);
while (contentLength > 0){
is.read(currByte);
os.write(currByte);
contentLength--;
}
os.write('\r');
os.write('\n');
os.write('\r');
os.write('\n');
} else if (chunkedIndex != -1){
boolean lastChunk = false;
while (!lastChunk) {
do {
is.read(currByte);
chuckSize.append((char) currByte[0]);
} while ((char)currByte[0] != '\n');
contentLength = Integer.parseInt(chuckSize.toString().trim(), 16);
System.out.println("Hex " + chuckSize.toString());
System.out.println(contentLength + " the number");
if (contentLength == 0) {
lastChunk = true;
}
while (contentLength > 0){
is.read(currByte);
os.write(currByte);
contentLength--;
}
}
}
Vous devez vous connecter pour publier un commentaire.
J'ai du mal lu ton code, mais il me semble que vous écrivez tous les en-têtes (y compris les "Transfer-Encoding: chunked") à
os
, mais vous n'écrivez pas le réel des tailles de segment, de sorte que l'extrémité de réception probablement ferme la connexion en raison d'illégale d'entrée (en comptant la taille de segment, d'obtenir d'autres données)Exception in thread "Thread-11" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at IncomingRequest.run(IncomingRequest.java:252)