2011-12-01 53 views
5

Tôi đang kết nối từ thiết bị Android bằng java với máy chủ chạy PHP bằng cách sử dụng DefaultHttpClient.Phát hiện thời gian chờ kết nối máy khách java android từ PHP

Một thử nghiệm tôi đang làm là kiểm tra xem mã java có xử lý một cách duyên dáng nếu máy chủ mất nhiều thời gian để gửi dữ liệu trở lại. Nếu nó mất nhiều thời gian, nó sẽ ngắt kết nối và thử lại.

Hiện nay tôi đã thiết lập thời gian chờ kết nối đến 3 giây bởi:

HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

Trên máy chủ các tập lệnh PHP đang ngủ trong 10 giây:

sleep(10); 

Mã java hoạt động, nếu kịch bản mất hơn 3 giây sau đó nó ném một java.net.SocketTimeoutException và sau đó thử lại sau một khoảng thời gian nhỏ.

Tập lệnh PHP tiếp tục chạy là không phải những gì tôi muốn. Tôi đã thử nghiệm bằng cách sử dụng connection_aborted thẳng sau khi chức năng ngủ nhưng nó không nắm bắt được khách hàng ngắt kết nối mà đã xảy ra.

ignore_user_abort(true); 
sleep(10); 
print "black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
} 

Làm cách nào để xử lý vấn đề này?

+0

Gì php có liên quan đang xem xét như thế nào? – Phil

+0

@Phil một dòng đơn giản để ngủ trong 10 giây. – zaf

+0

@Phil Tôi đã thêm nỗ lực của mình với connection_aborted – zaf

Trả lời

0

Không chắc chắn nếu nó là như nhau bây giờ, nhưng một thời gian dài trước đây tôi chạy vào php không nhận ra các kết nối đã bị hủy bỏ cho đến khi nó thực sự cố gắng để viết hoặc tuôn ra bộ đệm đầu ra của nó. Xem flush() và ob_flush() của php; Tôi không cần phải thực sự viết bất cứ điều gì để sản xuất, chỉ xả bộ đệm trống là đủ để làm cho nó kiểm tra.

Tôi sẽ tưởng tượng (các) máy chủ web và các nội dung khác trước php có thể ảnh hưởng đến hành vi này.

Có thể bạn cần phải gọi là ignore_user_abort (true); nếu không php có thể sẽ ngừng thực hiện trên lệnh flush() (hành vi mặc định là dừng lại khi nó nhận ra kết nối đã biến mất), vì vậy câu lệnh if của bạn sẽ không bao giờ được thực thi.

+0

Có, dường như chỉ ra rằng thực tế rằng tập lệnh ngủ đơn giản không xuất hiện bất kỳ thứ gì. Hãy xem liệu có lời kêu gọi tuôn ra trước khi hàm connection_abort kích hoạt nó hay không. – zaf

+0

Nỗ lực của tôi không thành công. Xem câu hỏi của tôi với mã cập nhật. – zaf

-1
print 
"black hole"; 
flush(); 
if(connection_aborted()!=0){ 
     // You would think this works but it does not. 
    } 

Trên thực tế, bạn sẽ không nghĩ rằng điều đó có hiệu quả, vì nó sẽ yêu cầu tập lệnh php đến điểm đó trong tập lệnh. Nếu bạn đã viết nó ở cuối, thì kịch bản phải chạy khóa học của nó.

Tôi sẽ đề nghị thay vì:

for($i=0;$i<10;$i++){ 
    echo ' '; ## echo "\0"; might also work 
    flush(); 
    if(connection_aborted()!=0){ 
      // You would think this works but maybe it will now. 
      die(); 
     } 
    sleep(1); # the sleep should come after the check 
} 

Hãy thử. Rõ ràng là bạn đang cố gắng ngủ trong 10 giây và sau đó giết tập lệnh ... trong mọi trường hợp, tập lệnh sẽ chạy trong 10 giây.

2

Tôi thực sự đã viết một bài viết về chủ đề này không quá lâu trước đây, tôi sẽ đưa ra một câu trả lời ngắn gọn ở đây, và giả sử nó cũng ok để đăng một liên kết liên quan? Về cơ bản, PHP sẽ chỉ ra rằng máy khách từ xa đã ngắt kết nối khi nó cố gắng sử dụng ổ cắm được kết nối với ổ cắm từ xa đó, cho đến khi bạn yêu cầu nó làm bất cứ điều gì với ổ cắm đó, nó sẽ cho rằng mọi thứ đều ổn.Đây là mã tôi sử dụng để kiểm tra các disconnections từ xa:

public function isAlive(){ 
     $res = @socket_recv($this->sockHandle, $data, 1024, MSG_PEEK); 
     if($res === 0){ 
     return false; 
     }else{ 
     return true; 
     } 
} 

Phần quan trọng ở đây là MSG_PEEK dừng bất kỳ tin nhắn đang chờ giải quyết khỏi bị xóa, và "@" câm lỗi nếu ổ cắm là ok, nhưng không có tin nhắn Đang chờ xử lý.

Đối với toàn bộ bài viết, nó có sẵn ở đây:

http://www.bracketbrotherhood.com/remote-disconnections-php-non-blocking-server-sockets/programming-and-development/

Kính trọng, Phil,

+0

Bài viết hay để đọc và cảm ơn câu trả lời. Tôi đã đẩy mã ra để có thể mất một thời gian để kiểm tra các ý tưởng của bạn. – zaf

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