рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реЗрдм рдореЗрдВ рд▓рд╛рдВрдЧ рдкреЛрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдирдЧрдиреЗрдХреНрд╕ рдкрд░, рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХрддрд╛рдИ рд╣реИ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рдЪреИрдирд▓ рд╕реБрдирддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд╛рдЗрдЯ рдкрд░ рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдерд╛ред
рдлрд┐рд░, рд╡реЗрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ, Android рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд▓рдЧреЗред рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЛрдиреЛрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рднрд╛рдЧ рд▓реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд▓реЙрдиреНрдЧ рдкреЛрд▓рд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдереА, рдЗрд╕рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рд╡рд╛ рдореЙрдбреНрдпреВрд▓ рднреА рд▓рд┐рдЦрдирд╛ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп, рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб
рддреЛ, рдореИрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред
nginx
рдкреНрд░рдпреБрдХреНрдд
рдиреЗрдЧреНрдиреЗрдХреНрд╕-рдкреБрд╢-рд╕реНрдЯреНрд░реАрдо-рдореЙрдбреНрдпреВрд▓рдирдЧреАрдирдХреНрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ:
рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рддреАрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреАред
рдкреАрдПрдЪрдкреА
рд╕рдВрджреЗрд╢ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ php рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рд░реЛрд╣ рд╣реИ:
public static function push($cids, $text) { $text = json_encode($text); $c = curl_init(); $url = 'http://example.com/pub?id='; curl_setopt($c, CURLOPT_RETURNTRANSFER, true); curl_setopt($c, CURLOPT_POST, true); $results = array(); if (!is_array($cids)) { $cids = array($cids); } $cids = array_unique($cids); foreach ($cids as $v) { curl_setopt($c, CURLOPT_URL, $url . $v); curl_setopt($c, CURLOPT_POSTFIELDS, $text); $results[] = curl_exec($c); } curl_close($c); }
рдпрд╣рд╛рдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЪреИрдирд▓ (рд╕рдВрджреЗрд╢) рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рднреЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рд╛рджрд╛ рд╕рд╛рджреЗ рдкрд╛рда рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рдЕрджреНрднреБрдд рдЬреЛрдВрд╕ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рддреБрд░рдВрдд рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреИрдирд▓ рдирд╛рдо рдХреЗ рдЧрдарди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрд╛ред рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рдХрдИ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдо рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдирджрдВрдб рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛:
[id ]_[ ]_[id ]
рдпрджрд┐ рд╣рдо рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
0_main_0
рдЕрдЧрд░ рдпреВрдЬрд░ рдЖрдИрдбреА = 777:
777_main_0
рдпрджрд┐ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдореВрд▓реНрдп рдХреНрд░рдорд╛рдВрдХ 7 = рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ:
0_orderPriceChanged_777
рдпрд╣ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдирд┐рдХрд▓рд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рдореЗрдВ, рдереЛрдбрд╝рд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рдж, рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рднреА рдЪреИрдирд▓реЛрдВ рдХреЗ рд╡рд╛рдпрд░рдЯреИрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЛрдб рдХреЛ рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдЧрд╛ред
рдФрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдирд┐рдпрдо:
const ACT_NEW_MESSAGE = 1; LongPolling::push($uid."_main_0", array( "act" => ACT_NEW_MESSAGE, "content" => "Hello, user ".$uid."!", ));
рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ
рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдЧрддрд╛ рд╣реИред рдЪрд▓реЛ рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛ!
рдЬрд┐рд╕ рдХрдХреНрд╖рд╛ рдХреЛ рдореИрдВрдиреЗ
рдЧрд┐рд╣рдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛
рдерд╛ ред
рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдореИрдВрдиреЗ
рдПрдВрдбреНрд░реЙрдЗрдб-рдПрд╕рдпреВрдПрдирд╕реА-http рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ http рдЕрдиреБрд░реЛрдз рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реАред
рдХрдХреНрд╖рд╛ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдЪреВрдВрдХрд┐ рд╣рдо рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ JsonHttpResponseHandler рдХреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛:
private final static int ACT_NEW_ORDER = 1; private final static int ACT_DEL_ORDER = 2; private final static int ACT_ATTRIBUTES_CHANGED = 3; private final static int ACT_MESSAGE = 4; private final JsonHttpResponseHandler handler = new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { try { JSONObject json = response.getJSONObject("text"); switch (json.getInt("act")) { case ACT_NEW_ORDER: ... break; case ACT_DEL_ORDER: ... break; case ACT_ATTRIBUTES_CHANGED: ... break; case ACT_MESSAGE: ... break; default: break; } } catch (JSONException e) { e.printStackTrace(); } } };
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдирдП рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕реБрдирддрд╛ рд╣реИ, рдПрдХ рдЖрджреЗрд╢ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдПрдХ рдирдпрд╛ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд▓реЙрдиреНрдЧрдкреЙрд▓рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ (рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдореЗрдВ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ):
private LongPolling lp; private int uid = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_balance); lp = new LongPolling(getApplicationContext(), "http://example.com/lp/", Integer.toString(uid) + "_main_0", handler); }
рдЕрдЧрд░ рд╣рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рд▓рдВрдмреЗ рдорддрджрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public void onResume() { super.onResume(); lp.connect(); } public void onPause() { super.onPause(); lp.disconnect(); }
рдпрджрд┐ рдЖрдкрдХреЛ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдорд╛рдорд▓рд╛ рд╣реИ), рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд▓рд╛рд╕ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдпрд╛ рд╕реЗрд╡рд╛ (рд╕реЗрд╡рд╛) рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдареАрдХ рдмрд╛рдж рдЖрдкрдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
lp = new LongPolling(getApplicationContext(), "http://example.com/lp/", Integer.toString(uid) + "_main_0", handler); lp.connect();
рдФрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдмреИрдЯрд░реА рдХреЛ рди рдЧрд┐рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ / рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд░реЗрд╡рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> ... <application> ... <receiver android:name="com.app.example.receivers.InternetStateReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> </intent-filter> </receiver> </application> </manifest>
рдФрд░ InternetStateReceiver
public class InternetStateReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi != null && wifi.isAvailable() || mobile != null && mobile.isAvailable()) { application.getInstance().lp.connect(); } else { application.getInstance().lp.disconnect(); } } }
рдЖрдВрдХрдбрд╝реЗ
рдареАрдХ рд╣реИ, рдПрдХ рд░реЛрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдЖрдБрдХрдбрд╝реЗ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕рдордп рдореЗрдВ рд╕рдордЭ рд▓реЗрддреЗ рд╣реИрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдСрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ url рдкрд░ XML / json рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ:
http://example.com/channels-stats?id=ALL
рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВ:
<?xml version="1.0" encoding="UTF-8" ?> <root> <hostname>example.com</hostname> <time>2014-03-22T00:03:37</time> <channels>2</channels> <wildcard_channels>0</wildcard_channels> <uptime>818530</uptime> <infos> <channel> <name>4_main_0</name> <published_messages>0</published_messages> <stored_messages>0</stored_messages> <subscribers>1</subscribers> </channel> <channel> <name>23_main_0</name> <published_messages>0</published_messages> <stored_messages>0</stored_messages> <subscribers>1</subscribers> </channel> </infos> </root>
рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЯреИрдЧ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪреИрдирд▓ рдХреЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЕрдкрдирд╛ рдЪреИрдирд▓ рд╣реИ, PHP рдореЗрдВ рд╣рдо рдСрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ:
const STATISTICS_URL = 'http://example.com/channels-stats?id=ALL'; public static function getOnlineIds() { $str = file_get_contents(self::STATISTICS_URL); if (!$str) return; $json = json_decode($str); if (empty($json -> infos)) return; $ids = array(); foreach ($json->infos as $v) { if ($v -> subscribers > 0 && substr_count($v -> channel, '_main_0') > 0) { $ids[] = str_replace('_main_0', '', $v -> channel); } } return $ids; }
рддреЛ рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдпреВрдЬрд░ рдЖрдИ.рдбреА. рд▓реЗрдХрд┐рди рдПрдХ BUT рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЦреИрд░, рдЬреИрд╕реЗ, рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ред рдЕрдм рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрд╕реА рдкреНрд░реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рд╕реБрдЭрд╛рд╡ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред
рд╕рдВрджрд░реНрдн
- https://github.com/jonasasx/LongPolling - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ
- https://github.com/wandenberg/nginx-push-stream-module - nxing рдореЙрдбреНрдпреВрд▓
- https://github.com/loopj/android-async-http - Android рдХреЗ рд▓рд┐рдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ http рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп