30/09/2018, 17:35

Socket java, error nhận file

các anh cho hỏi, tai sao em send file ở server nhận thì ok, nhưng client nhận về k đủ byte của file, tại sao vậy, cách fix như thế nào vậy mọi người
server
http://codepad.org/kBZR9GLV

client

http://codepad.org/hTJKs5KQ

//luu ý : test tren java trên máy tính thì ok, nhưng test truyền đi cho di động thì error

Mai Anh Dũng viết 19:48 ngày 30/09/2018

Code nhiều quá, khó phân tích. Hoặc là @tungnhuxua copy đoạn code làm công việc gửi/nhận dữ liệu hoặc là @tungnhuxua tự kiểm tra lại chỗ gửi nhận dữ liệu.

//luu ý : test tren java trên máy tính thì ok, nhưng test truyền đi cho di động thì error

Lý do thông thường cùa việc này là do khi gửi trong cùng một máy thì tốc độ đọc và ghi cao. Nếu gửi gói nhỏ dữ liệu thì may mắn là toàn bộ dữ liệu gửi qua kịp.

Nhưng khi gửi qua mạng, không nhất thiết phải là di động, thì việc gửi và nhận không kịp. Dẫn đến bị mất dữ liệu. Kiểm tra lại hàm gửi nhận bằng socket.

caybang viết 19:47 ngày 30/09/2018

dạ anh Đạt

server:
http://codepad.org/WQYX1RtZ

client :
http://codepad.org/WoG84QYh

caybang viết 19:49 ngày 30/09/2018

dữ liệu thì may mắn là toàn bộ dữ liệu gửi qua kịp.

đúng anh ah, gửi file thì có lúc ksao, có lúc đứng nguyên màn hình điên thoại

Mai Anh Dũng viết 19:37 ngày 30/09/2018

Em phải chờ cho tới khi toàn bộ dữ liệu đã gửi qua tới client. Khi đó mới close connection.

File f = new File(name);
FileInputStream fis = new FileInputStream(f);
byte[] byteArr = ("{\"RequestType\":5, \"ToUser\":\"" + clientID + "\", \"FileName\":\"" + f.getName() + "\", \"FileLength\":" + f.length() + "}").getBytes();
sendStream.write(byteArr, 0, byteArr.length);
sendStream.flush();

byte[] buffer = new byte[1024 * 1024];
int numByte = 0;
while ((numByte = fis.read(buffer)) > 0) {
    sendStream.write(buffer, 0, numByte);
    sendStream.flush();
}
fis.close();

Kiểm tra cái biến numByte. Ở đây em while thế này thì chỉ mới 1 bytes thôi nó đã close connection rồi. Do 1 > 0


Cách của socket hoạt động thế này. Ở phía đầu server sẽ tạo ra một cái file, ở phía client cũng sẽ tạo ra một cái file.

Hai cái file này thông nhau, người ta có thể gọi là pipe, gọi là cái ống. Đầu này ghi thì đầu kia nhận. Dữ liệu chạy qua giống như dẫn nước qua ống vậy.

Đầu gửi gửi 100 bytes thì đầu nhận cũng phải chờ cho tới khi nhận được 100 bytes mới ngừng. Đôi khi em may mắn, dữ liệu nhỏ và mạng tốt, thì mới có thể gửi được toàn bộ nội dung mà không cần chờ.

Sửa lại đoạn code ở trên thành chờ để đọc byte và nối vào dữ liệu có sẵn.

biến đếm số byte đã đọc numByte = 0
Loop
  Có dự liệu, đọc vào và tăng numByte += byteRead
  nối dữ liệu mới nhận vào buffer
  nếu numByte >= số byte cần đọc thì thoát
caybang viết 19:44 ngày 30/09/2018

phần server gửi về client có gì sai không anh

http://codepad.org/NXEl8NuT

Mai Anh Dũng viết 19:44 ngày 30/09/2018

Quan tâm phía nhận trước, phía gửi trước mắt không có vấn đề gì đâu.

caybang viết 19:49 ngày 30/09/2018

em sửa lại, nhưng sao vẫn bị lỗi vậy anh, file ảnh có 600k mà nhận đc 500k a ah
client : http://codepad.org/KEOuZeVX

Bài liên quan
0