2010-11-08 35 views
5

Trong ứng dụng Java của tôi, làm cách nào để phát hiện tốc độ kết nối Internet nhanh như thế nào? Ví dụ, tôi sử dụng AT & T nhanh DSL ở nhà, tôi tự hỏi, nếu có một cách tôi có thể viết một phương pháp nào sau đây:Làm thế nào để phát hiện tốc độ kết nối Internet với Java?

int getInternetConnectionSpeed() 
{ 
    ... 
} 

Mà sẽ trả về một số trong kbps, cái gì đó như 2800kbps [2.8 M]

Chỉnh sửa: Lý do tôi yêu cầu, có trong ứng dụng của mình, tôi có thể mở nhiều luồng Internet, tùy thuộc vào tốc độ kết nối Internet của người dùng, tôi muốn tự động xác định số lượng luồng sẽ mở mà không chocking ứng dụng.

+0

Tôi nghĩ rằng điều này thực sự hoạt động, bạn phải có một máy chủ ở đầu kia của thử nghiệm có thể xử lý tốc độ cao hơn giới hạn tối đa của kết nối AT & T ... – FrustratedWithFormsDesigner

+0

Thậm chí nếu bạn có thể nhận được "chính thức "tốc độ kết nối cho internets của người dùng, con số đó sẽ cực kỳ không chính xác đối với hầu hết các tình huống thực tế. Có lẽ bạn nên xem xét lại chính xác lý do tại sao bạn cần thông tin này và tìm một cách khác để làm bất cứ điều gì bạn đang * thực sự * cố gắng làm. – Randolpho

+0

Băng thông "luồng" của bạn có hạn chế hay bạn sẽ kết thúc với 1 luồng tải xuống nhanh nhất có thể so với 10 luồng tải xuống nhanh nhất có thể (trong trường hợp này bạn chỉ đạt được bất kỳ điều gì) – nos

Trả lời

2

Tôi nghĩ rằng bạn có thể suy nghĩ về vấn đề theo cách sai. Việc chụp nhanh tốc độ kết nối chỉ là dấu hiệu cho thấy thông lượng của chúng tại thời điểm đó. Họ có thể khá dễ dàng chạy một ứng dụng khác khi bạn chạy thử nghiệm mà hút băng thông của họ và sau đó giá trị đo của bạn là vô giá trị.

Thay vào đó, tôi nghĩ bạn nên liên tục thêm hoặc xóa chủ đề tùy thuộc vào việc nó tăng hoặc giảm thông lượng của chúng. Tôi muốn đề xuất một cái gì đó như thế này (chỉ có mã giả):

while(true) { 
    double speedBeforeAdding = getCurrentSpeed(); 
    addThread(); 
    // Wait for speed to stabilise 
    sleep(20 seconds); 
    double speedAfterAdding = getCurrentSpeed(); 
    if(speedAfterAdding < speedBeforeAdding) { 
    // Undo the addition of the new thread 
    removeThread(); 
    // Wait for speed to stabilise 
    sleep(20 seconds); 

    if(getNumberOfThreads() > 1) { 
     double speedBeforeRemoving = getCurrentSpeed(); 
     // Remove a thread because maybe there's too many 
     removeThread(); 
     // Wait for speed to stabilise 
     sleep(20 seconds); 
     double speedAfterRemoving = getCurrentSpeed(); 
     if(speedAfterRemoving < speedBeforeRemoving) { 
     // Add the thread back 
     addThread(); 
     // Wait for speed to stabilise 
     sleep(20 seconds); 
     } 
    } 
    } 
} 

Bạn có thể fiddle với thời gian ngủ phù hợp. Tôi giả định ở đây rằng getCurrentSpeed() trả lại thông lượng của tất cả các chủ đề tải xuống và bạn có thể tự động mở và đóng chủ đề trong quá trình thực thi ứng dụng của mình.

+2

Cảm ơn, đó là một cách thông minh để da mèo! – Frank

+0

Bạn có thể muốn sử dụng một hồ bơi thread để quản lý các chủ đề. – Holly

1

Thời gian bạn mất bao lâu để tải xuống tệp có kích thước đã biết (và đủ lớn).

Nếu bạn mất 60 giây để tải xuống 10MB, bạn có kết nối Kbps hoặc 1365 Kbps (10 * 1024 * 8/60).

+2

Than ôi, điều đó sẽ chỉ hoạt động để xác định tốc độ kết nối với máy chủ mà từ đó tệp đã được tải xuống, chứ không phải tốc độ truyền liên kết chung mà áp phích ban đầu dường như mong muốn. – Randolpho

+0

... vâng, những gì Randolpho nói. – FrustratedWithFormsDesigner

+1

@Randolpho: Bạn sẽ làm điều đó cho máy chủ mà bạn sẽ liên lạc. Tất cả các tốc độ liên kết khác đều không liên quan. –

1

Nhưng có rất nhiều tốc độ tùy thuộc vào nơi bạn muốn kết nối tới:

  • 127.0.0.1?
  • Mạng con cục bộ của bạn?
  • Internet của bạn?

Vì JVM của bạn sử dụng máy tính cục bộ sử dụng mạng cục bộ nên không có cách nào để tự động nhận tốc độ DSL.

Ồ, và xin lưu ý, bạn thậm chí có thể đang lướt sóng long distance!

Các vấn đề liên quan