Datei senden Sie dann die Nachricht über socket
Ich bin versucht, senden Sie eine Datei von einem client an einen server. Der server empfängt die Datei und senden Sie dann eine Bestätigungs-Nachricht an den client.
Mein problem ist, dass der client reagiert nicht mehr, wenn er wartet die Bestätigung.
Server :
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();
}
}
Kann sein das du nicht Spülen Sie den Ausgabestrom von der server-Seite? Sehen Sie die Meldung:
werde Kommentar auf der uresponsive Teil. Wenn der client wartet auf eine Antwort (Antwort Lesen) dann denke ich, dass es nicht mehr reagiert. Haben Sie überlegt, die Anfrage in einem separaten thread?
auf der client-Seite, es ist blockiert, nachdem "Bytes Gesendet:..". wenn ich den Kommentar der erste Teil, es funktioniert. Wenn ich kommentieren den zweiten Teil, es funktioniert. Beides ist nicht funktioniert nicht.
Und auf der server-Seite, es ist nicht schreiben "byte geschrieben:...". Aber Wenn der seconde Teil ist ein Kommentar, funktioniert es perfekt.
Ihr code kann nicht kompiliert werden, nach einem einfachen kopieren/einfügen. Wenn Sie möchten, etwas Hilfe zu bekommen, fügen Sie SSCCE Stil-code hier. Machen Sie nicht uns Ihre routine.
Message sent to the client is ok
?werde Kommentar auf der uresponsive Teil. Wenn der client wartet auf eine Antwort (Antwort Lesen) dann denke ich, dass es nicht mehr reagiert. Haben Sie überlegt, die Anfrage in einem separaten thread?
auf der client-Seite, es ist blockiert, nachdem "Bytes Gesendet:..". wenn ich den Kommentar der erste Teil, es funktioniert. Wenn ich kommentieren den zweiten Teil, es funktioniert. Beides ist nicht funktioniert nicht.
Und auf der server-Seite, es ist nicht schreiben "byte geschrieben:...". Aber Wenn der seconde Teil ist ein Kommentar, funktioniert es perfekt.
Ihr code kann nicht kompiliert werden, nach einem einfachen kopieren/einfügen. Wenn Sie möchten, etwas Hilfe zu bekommen, fügen Sie SSCCE Stil-code hier. Machen Sie nicht uns Ihre routine.
InformationsquelleAutor ophelie88 | 2011-06-30
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist das komplette Beispiel. Der server:
Und Kunde:
Die Zeile, die Sie fehlt, ist die "Buchse.shutdownOutput()". Wenn Sie lassen Sie diese Zeile aus, wird der server niemals die end-of-file-marker
-1
von derread
nennen.Bitte korrigieren Sie die Art und Weise Sie die Anzahl der bytes, die gesendet wurden. Sie sollte wirklich anfangen mit der 0 anstelle von 1024, und nur die Schrittweite, die dem entgegenwirken, indem Sie so viele bytes, wie Sie tatsächlich zu Lesen.
Alle Bestätigungs-code ist redundant und überflüssig.
In seiner aktuellen form ist es wirklich überflüssig. Aber sobald der server sendet einige Informationen (den Namen der Datei, unter dem die Daten gespeichert wurden, wird ein Fehler-code, wenn die Festplatte voll war), dieses Protokoll wird sehr nützlich. Zum Beispiel, wie würden die Kunden wissen, dass das Letzte byte wurde erfolgreich geschrieben, wenn der server gerade geschlossen die Steckdose, ohne E -
ok
ersten?ja, dass ist nur ein Teil des Projekts. meine server brauchen, um andere Informationen zu senden, um meine Kunden.
InformationsquelleAutor Roland Illig
Benutzen HTTP! Es wurde entwickelt für genau diese Art von problem. Es gibt eine Menge von HTTP-client und server-Bibliotheken, die frei verfügbar für Java.
InformationsquelleAutor artbristol