Résoudre SocketException: Connection reset
Bonjour à tous,
Mon mini projet consiste à envoyer des fichiers depuis mon appareil Android vers mon pc (et vis versa mais pour l'instant c'est que dans un sens).
J'ai donc fait un programme serveur en java qui tourne en boucle sur mon pc sur Eclipse dont voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| public class FileReader {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static BufferedInputStream bis;
private static DataInputStream dis;
public static void main(String[] args) {
String dirPath = "C:\\docPda\\prelevement\\";
try {
serverSocket = new ServerSocket(7800);
} catch (IOException e) {
e.printStackTrace();
}
try {
while (true) {
try {
clientSocket = serverSocket.accept();
bis = new BufferedInputStream(clientSocket.getInputStream());
dis = new DataInputStream(bis);
int filesCount = dis.readInt();
File[] files = new File[filesCount];
for (int i = 0; i < filesCount; i++) {
long fileLength = dis.readLong();
String fileName = dis.readUTF();
files[i] = new File(dirPath + "/" + fileName);
FileOutputStream fos = new FileOutputStream(files[i]);
BufferedOutputStream bos = new BufferedOutputStream(fos);
for (int j = 0; j < fileLength; j++)
bos.write(bis.read());
bos.close();
}
clientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} |
et voici le code coté client (Android):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public class FileSender extends AsyncTask<String, Integer, String> {
private String ip;
private int port;
private Boolean bool;
public FileSender(String ip, int port, Boolean bool){
this.ip = ip;
this.port = port;
this.bool = bool;
}
@Override
protected String doInBackground(String... serverAdd) {
String directory;
if (this.bool) {
directory = Environment.getExternalStorageDirectory() + "/" + "traca";
}
else {
directory = Environment.getExternalStorageDirectory() + "/" + "GetSignature";
}
Socket socket;
File[] files = new File(directory).listFiles();
if (files.length > 0) {
try {
socket = new Socket(ip, port);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(files.length);
for (File file : files) {
long length = file.length();
dos.writeLong(length);
String name = file.getName();
dos.writeUTF(name);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int theByte = 0;
while ((theByte = bis.read()) != -1) bos.write(theByte);
bis.close();
file.delete();
}
socket.close();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
} |
et enfin l'expression que j’exécute à l'appui du bouton sur mon appareil:
Code:
1 2 3 4 5 6 7
| if (isConnected(MainActivity.this)) {
FileSender s = new FileSender(prefs.getString("ip_adress", null),
Integer.valueOf(prefs.getString("port_dest", null)),
true);
s.execute();
} |
code de la fonction isConnected():
Code:
1 2 3 4 5 6 7 8 9
| public Boolean isConnected(Context context){
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
return isConnected;
} |
Petite information supplémentaire : mon appareil Android n'est pas un téléphone mais un terminal de collecte de données que je dépose dans une borne pour le connecter au réseau ethernet.
Le programme fonctionne correctement mais j'ai remarqué une faille lorsque je dépose mon appareil dans la borne (donc mon appareil est connecté, de toute façon je check la connexion avant de faire quoi que ce soit avec ma fonction isConnected) et que j'appui rapidement sur le bouton d'envoi, cette exception s'affiche sur éclipse:
Code:
1 2 3 4 5 6 7
| java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readInt(Unknown Source)
at FileReader.main(FileReader.java:26) |
par contre si j'attend environ 5 secondes environ après avoir déposer mon appareil et que je déclenche là je n'ai aucun problème.
En espérant avoir été clair.