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:
et voici le code coté client (Android):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 enfin l'expression que j’exécute à l'appui du bouton sur mon appareil:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
code de la fonction isConnected():
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
En espérant avoir été clair.
Partager