java.net.Exception socketexception: sendto a échoué: EPIPE (Broken pipe) sur Android
Je suis en train de lire les données à partir du serveur de socket du client dans Android.
Voici les bouts de code que j'utilise:
Client (Sur Android en JAVA)
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
if (client.socket == null || !client.socket.isConnected())
client.createSocket();
//Get Input/Output stream for socket
dataOutputStream = new DataOutputStream(client.socket.getOutputStream());
dataInputStream = new DataInputStream(client.socket.getInputStream());
//Here RS is simple JAVA class that stores information about payload and response length
Log.d("Send", "Sending payload for pair " + RS.getc_s_pair() + " " + RS.getResponse_len());
dataOutputStream.write(UtilsManager.serialize(RS.getPayload()));
//Notify waiting Queue thread to start processing next packet
if (RS.getResponse_len() > 0) {
Log.d("Response", "Waiting for response for pair " + RS.getc_s_pair() + " of " + RS.getResponse_len() + " bytes");
int totalRead = 0;
byte[] buffer = new byte[RS.getResponse_len()];
while (totalRead < RS.getResponse_len()) {
int bytesRead = dataInputStream.read(buffer, totalRead, RS.getResponse_len() - totalRead);
if (bytesRead < 0) {
throw new IOException("Data stream ended prematurely");
}
totalRead += bytesRead;
}
}
Serveur (Python)
# Here request_len is the expected request size
while buffer_len < response_set.request_len:
new_data = connection.recv( min(self.buff_size, response_set.request_len-buffer_len) )
if not new_data:
return False
buffer_len += len(new_data)
# Send required response
for response in response_set.response_list:
try:
connection.sendall(str(response.payload))
except:
return False
Parfois, je reçois l'erreur alors que je suis à l'envoi d'une charge utile de client en ligne
dataOutputStream.write(UtilsManager.serialize(RS.getPayload()));
D'erreur que j'obtiens est:
java.net.SocketException: sendto failed: EPIPE (Broken pipe)
at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
at libcore.io.IoBridge.sendto(IoBridge.java:475)
at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
at java.io.DataOutputStream.write(DataOutputStream.java:98)
at java.io.OutputStream.write(OutputStream.java:82)
at com.rgolani.replay.tcp.TCPClientThread.run(TCPClientThread.java:56)
at java.lang.Thread.run(Thread.java:856)
Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
at libcore.io.Posix.sendtoBytes(Native Method)
at libcore.io.Posix.sendto(Posix.java:151)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
at libcore.io.IoBridge.sendto(IoBridge.java:473)
... 7 more
Je sais que c'est un peu déroutant. Le code Python n'a pas été écrit par moi et il existe un client python qui fonctionne sans erreurs. J'obtiens cette erreur dans mon code JAVA.
De Travail Client Python
if self.sock is None:
self._connect_socket()
self.sock.sendall(tcp.payload)
buffer_len = 0
while tcp.response_len > buffer_len:
data = self.sock.recv( min(self.buff_size, tcp.response_len-buffer_len) )
buffer_len += len(data)
S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations.
Merci.
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez
setChunkedStreamingMode
, puis le retirer et de le voir ensuite.Je pense que je suis en retard, mais cela résout mon problème.Vous pouvez utiliser de longueur fixe de la mode streaming.setChunkedStreamingMode
en raison de link . Et rencontre cette fois. Il est sever du php non de longueur fixe. Il doit être résolu à côté serveur et pas besoin d'enlever le code sur le client.Cette erreur se produit lorsque le client essaie d'écrire une connexion lorsque le backend a déjà fermé.
Par défaut, Android jeu de la
Keep Alive
true à la propriété et la réutilisation de l'ancienne douille connexions depuis l'établissement d'une connexion est une ressource consommer de l'opération dans un environnement mobile (vous pouvez le tester avec un outil comme fiddler).Essayez de définir la
Connection
en-tête declose
ou appelezSystem.setProperty("http.keepAlive", "false");
afin de désactiver le Garder Vivant et donc de forcer le système à créer une nouvelle connexion.Peut-être me manque un point avec votre question, mais je pense qu'il serait plus agréable d'utiliser ce fragment de code Java:
Espère que cela aide...
Dans mon cas: le client.createSocket(); ne pas se connecter à n'importe quel serveur il suffit de créer un socket. Plus tard, je dois le client.connect(_sock_sddr_here_);
Aussi isConnected() - muets de test parce que c'est toujours vrai.