我可能一直盯着這太久,不能看到問題是什麼。Android客戶端/服務器,客戶端沒有收到所有數據
我有一個接受多個客戶端連接並保存套接字的服務器。然後,服務器可以向客戶端發送控制消息來執行任務,除此之外,我想將文件發送到所有連接的客戶端,但客戶端似乎只接收其中的一部分。
出於測試目的,我有一個隨機生成的文本文件69075字節,但儘管它看起來像整個整個文件發送,客戶端只接收高達57000字節左右(變化)。我在服務器應用程序中添加了一個按鈕,可以讓我關閉客戶端套接字,當我這樣做時,客戶端接收到-1,然後是剩餘的缺失文件。
服務器發送文件:
try {
getClientList().get(0).setLocked(true);
byte [] mybytearray = new byte [1024];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
OutputStream os = getClientList().get(0).getmSocket().getOutputStream();
Boolean eof = false;
int bytesRead;
int total = 0;
do {
bytesRead = bis.read(mybytearray, 0, mybytearray.length);
if (bytesRead != -1) {
os.write(mybytearray, 0, bytesRead);
total += bytesRead;
Log.d(TAG_SF, "Total: "+total+" :Sent: "+ bytesRead);
} else {
eof = true;
Log.d(TAG_SF, "EOF, Total sent: " + total);
}
} while (!eof);
os.flush();
bis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
getClientList().get(0).setLocked(false);
}
一條消息,該文件之前發送到客戶端的文件名和文件大小是發送和其接收正常。
客戶端接收文件:
try {
int total = 0;
byte[] myByteArray = new byte[1024];
int bytesRead;
InputStream is = serverSocket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(path+SD_DIRECTORY+fileName));
do {
bytesRead = is.read(myByteArray, 0, myByteArray.length);
if (bytesRead != -1){
bos.write(myByteArray, 0, bytesRead);
total = total+bytesRead;
Log.e(TAG,"Total > "+total+ ": No Bytes : "+bytesRead);
} else {
Log.e(TAG,"EOF, total received: "+total);
break;
}
} while (total < fileLength); //fileLength and filename are sent before file
Log.e(TAG,"Total > "+total+ ": No Bytes : "+bytesRead);
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
看看[這個](http://stackoverflow.com/questions/18583248/sending-png-image-file-from-server-desktop-to-client-android-via-socket-prog/18597338 #18597338)問題,也許它可以幫助你 –
謝謝,同樣的問題與代碼中的例子,所以問題在我的應用程序中的其他地方。請參閱下面的答案 – Scott