Отправить изображение с сервера на клиент и с клиента на сервер
Клиент отправляет файл на сервер, а сервер получает и сохраняет его. Но когда в клиенте эта строка (while ((len = outputFromServer.read(buf))!= -1)) застревает в клиенте, я не знаю почему? пытаться {
Log.d(WiFiDirectActivity.TAG, "Opening client socket - ");
socket.connect((new InetSocketAddress(host, port)),
SOCKET_TIMEOUT);
final File f = new File(
Environment.getExternalStorageDirectory()
+ "/wifip2pshared-"
+ System.currentTimeMillis() + ".jpg");
File dirs = new File(f.getParent());
if (!dirs.exists())
dirs.mkdirs();
f.createNewFile();
// send Data To Server
OutputStream stream = socket.getOutputStream();
FileInputStream file = new FileInputStream(
"/sdcard/samsung/Image/001" + ".jpg");
while ((len1 = file.read(buf1)) != -1) {
stream.write(buf1, 0, len1);
}
file.close();
// ////////////////////////////////
// ///////////////////////
// read Data from server
InputStream outputFromServer = socket.getInputStream();
FileOutputStream saveData = new FileOutputStream(
f);
while ((len = outputFromServer.read(buf)) != -1) {
saveData.write(buf, 0, len);
}
saveData.close();
Log.d(WiFiDirectActivity.TAG, "Client: Data written");
} catch (IOException e) {
Log.e("exception at client", e.getMessage());
} finally {
if (socket != null) {
if (socket.isConnected()) {
try {
socket.close();
} catch (Exception e) {
// Give up
Log.e("exception at clientin socket close",
e.toString());
}
}
}
}
Сторона сервера
try {
server = new ServerSocket(8988);
Socket client = server.accept();
final File f = new File(
Environment.getExternalStorageDirectory()
+ "/wifip2pshared-"
+ System.currentTimeMillis() + ".jpg");
File dirs = new File(f.getParent());
if (!dirs.exists())
dirs.mkdirs();
f.createNewFile();
// receive Data From Client
InputStream is = client.getInputStream();
FileOutputStream fos = new FileOutputStream(f);
String a = "acb";
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
Log.e("In server reviving data", a);
}
fos.close();
// Send Data To Client
OutputStream stream = client.getOutputStream();
FileInputStream file = new FileInputStream(
"/sdcard/samsung/Image/001" + ".jpg");
while ((len1 = file.read(buf1)) != -1) {
stream.write(buf1, 0, len1);
}
file.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
клиент отправляет файл на сервер, а сервер получает и сохраняет его. Но когда в клиенте эта строка (while ((len = outputFromServer.read(buf))!= -1)) застревает в клиенте, я не знаю почему?
1 ответ
read()
в потоке сокета вернет -1, только если соединение закрыто или произошла ошибка. Сервер получает данные и сохраняет их, но никогда не покидает цикл приема для отправки данных. Даже если это сделает клиент, он также не выйдет из цикла приема.
Вы должны либо закрыть соединение, либо отправить размер файла до того, как фактический файл и прием прекратится, когда будет прочитан указанный размер.