envoyer le fichier puis message par socket
J'essaie d'envoyer un fichier à partir d'un client à un serveur. Le serveur reçoit le fichier puis envoyer un message de confirmation au client.
Mon problème est que le client cesse de répondre lorsqu'il est en attente de la confirmation.
Serveur :
import java.net.*;
import java.io.*;
public class Server {
public static void main(String args[]) throws IOException {
int port = 1234;
ServerSocket server_socket;
server_socket = new ServerSocket(port);
System.out.println("Server waiting for client on port "
+ server_socket.getLocalPort());
//server infinite loop
while (true) {
Socket socket = server_socket.accept();
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
try {
byte[] b = new byte[1024];
int len = 0;
int bytcount = 1024;
String FileName = "C:\\test\\java\\tmp\\sentfile.pdf";
FileOutputStream inFile = new FileOutputStream(FileName);
InputStream is = socket.getInputStream();
BufferedInputStream in2 = new BufferedInputStream(is, 1024);
while ((len = in2.read(b, 0, 1024)) != -1) {
bytcount = bytcount + 1024;
inFile.write(b, 0, len);
}
System.out.println("Bytes Writen : " + bytcount);
//Sending the response back to the client.
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.flush();
oos.writeObject("ok");
System.out.println("Message sent to the client is "+"ok");
in2.close();
inFile.close();
} catch (IOException e) {
System.out.println("Unable to open file" + e);
return;
}
socket.close();
System.out.println("Connection closed by client");
}
}
}
Client :
import java.net.*;
import java.io.*;
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException, ClassNotFoundException {
int port = 1234;
Socket socket = null;
//connect to server
socket = new Socket("127.0.0.1", port);
try {
byte[] buf = new byte[1024];
OutputStream os = socket.getOutputStream();
BufferedOutputStream out = new BufferedOutputStream(os, 1024);
String file = "C:\\test\\java\\client\\source.pdf";
FileInputStream in = new FileInputStream(file);
int i = 0;
int bytecount = 1024;
while ((i = in.read(buf, 0, 1024)) != -1) {
bytecount = bytecount + 1024;
out.write(buf, 0, i);
out.flush();
}
System.out.println("Bytes Sent :" + bytecount);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String confirmation = (String) ois.readObject();
System.out.println("from server : " + confirmation);
out.close();
in.close();
} catch (IOException e) {
System.out.println(e);
}
socket.close();
}
}
Peut-être vous n'avez pas de rincer votre outputstream côté serveur? Vous voyez le message:
vais commenter sur le uresponsive partie. Si le client est en attente d'une réponse (lire la réponse) alors j'imagine que ça va être de répondre. Avez-vous envisagé de faire la demande dans un thread séparé?
sur le côté client, il est bloqué après "Octets Envoyés:..". si j'commentaire de la première partie, il est de travail. Si je commente la deuxième partie, il est de travail. À la fois, n'est pas pas de travail.
Et sur le côté serveur, il n'est pas écrit "octet écrit:...". Mais Lors de la seconde partie est un commentaire, il fonctionne parfaitement.
Votre code ne peut pas être compilé après un simple copier/coller. Si vous souhaitez obtenir de l'aide, ajouter SSCCE style code ici. Ne faites pas de nous pour faire votre routine.
Message sent to the client is ok
?vais commenter sur le uresponsive partie. Si le client est en attente d'une réponse (lire la réponse) alors j'imagine que ça va être de répondre. Avez-vous envisagé de faire la demande dans un thread séparé?
sur le côté client, il est bloqué après "Octets Envoyés:..". si j'commentaire de la première partie, il est de travail. Si je commente la deuxième partie, il est de travail. À la fois, n'est pas pas de travail.
Et sur le côté serveur, il n'est pas écrit "octet écrit:...". Mais Lors de la seconde partie est un commentaire, il fonctionne parfaitement.
Votre code ne peut pas être compilé après un simple copier/coller. Si vous souhaitez obtenir de l'aide, ajouter SSCCE style code ici. Ne faites pas de nous pour faire votre routine.
OriginalL'auteur ophelie88 | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Ici est l'exemple. Le serveur:
Et le client:
La ligne vous avez été absent est le "socket.shutdownOutput()". Si vous laissez cette ligne, le serveur ne verra jamais le fin-de-fichier marqueur
-1
de laread
appel.S'il vous plaît corriger la façon dont vous comptez les octets qui ont été envoyés. Vous devriez vraiment commencer avec 0 au lieu de 1024 et seulement incrémenter le compteur de nombre d'octets que vous avez réellement lu.
Tous les code de confirmation est redondant et inutile.
Dans sa forme actuelle, il est vraiment redondant. Mais dès que le serveur envoie certaines informations (le nom du fichier dans lequel les données ont été stockées, un code d'erreur si le disque était plein), ce protocole est très utile. Par exemple, comment le client sait que le dernier octet a été écrit correctement, si le serveur vient de fermer le socket sans envoyer
ok
en premier?ouais c'est juste une partie du projet. mon serveur a besoin d'envoyer d'autres informations à mon client.
OriginalL'auteur Roland Illig
Utiliser HTTP! Il est conçu exactement pour ce type de problème. Il y a des tas de HTTP, client et serveur bibliothèques disponibles gratuitement pour Java.
OriginalL'auteur artbristol