android client websocket délai d'attente
Merci pour la lecture!
De fond:
Je suis en train d'élaborer un client Android pour un serveur où la condition est une application qui nécessite un échange continu de messages d'avant en arrière avec un WebSockets
server.
Mise en œuvre: Pour le client, j'utilise weberknecht de l' WebSocket
de la bibliothèque du client pour Android alors que le serveur est Tornado
.
Problème:
Pour le moment, j'invoque initWebSocketClient
dans onCreate
par la ponte d'une AsyncTask
. Mais, je reçois un client exception délai.
Client Android:
private void initWebSocketClient() {
Log.e(TAG, "initWebSocketClient");
try {
URI url = new URI("ws://192.168.207.84:8080/");
WebSocket websocket = new WebSocketConnection(url);
//Register Event Handlers
websocket.setEventHandler(new WebSocketEventHandler() {
public void onOpen()
{
Log.e(TAG, "--open");
}
public void onMessage(WebSocketMessage message)
{
Log.e(TAG, "--received message: " + message.getText());
}
public void onClose()
{
Log.e(TAG, "--close");
}
});
//Establish WebSocket Connection
websocket.connect();
//Send UTF-8 Text
websocket.send("hello world");
//Close WebSocket Connection
websocket.close();
}
catch (WebSocketException wse) {
wse.printStackTrace();
}
catch (URISyntaxException use) {
use.printStackTrace();
}
}
Tornade Serveur:
#!/usr/bin/env python
import tornado.ioloop
import tornado.web
import tornado.websocket
class EchoWebSocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "WebSocket opened"
def on_message(self, message):
self.write_message(u"You said: " + message)
def on_close(self):
print "WebSocket closed"
application = tornado.web.Application([
(r"/", EchoWebSocketHandler),
])
if __name__ == "__main__":
application.listen(8080)
tornado.ioloop.IOLoop.instance().start()
Client exception Délai:
01-31 19:28:01.367: W/System.err(5668): de.roderick.weberknecht.WebSocketException: error while creating socket to ws://192.168.207.84:8080/
01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:244)
01-31 19:28:01.386: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.connect(WebSocketConnection.java:83)
01-31 19:28:01.386: W/System.err(5668): at com.sagar.websockclient.MainActivity.initWebSocketClient(MainActivity.java:55)
01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity.access$0(MainActivity.java:30)
01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:75)
01-31 19:28:01.390: W/System.err(5668): at com.sagar.websockclient.MainActivity$WebSocketTask.doInBackground(MainActivity.java:1)
01-31 19:28:01.390: W/System.err(5668): at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-31 19:28:01.390: W/System.err(5668): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-31 19:28:01.390: W/System.err(5668): at java.lang.Thread.run(Thread.java:856)
01-31 19:28:01.390: W/System.err(5668): Caused by: java.net.ConnectException: failed to connect to /192.168.207.84 (port 8080): connect failed: ETIMEDOUT (Connection timed out)
01-31 19:28:01.390: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:114)
01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-31 19:28:01.394: W/System.err(5668): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.startupSocket(Socket.java:566)
01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.tryAllAddresses(Socket.java:127)
01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:177)
01-31 19:28:01.394: W/System.err(5668): at java.net.Socket.(Socket.java:149)
01-31 19:28:01.394: W/System.err(5668): at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:238)
01-31 19:28:01.394: W/System.err(5668): ... 11 more
01-31 19:28:01.394: W/System.err(5668): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
01-31 19:28:01.398: W/System.err(5668): at libcore.io.Posix.connect(Native Method)
01-31 19:28:01.398: W/System.err(5668): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-31 19:28:01.398: W/System.err(5668): at libcore.io.IoBridge.connect(IoBridge.java:112)
01-31 19:28:01.398: W/System.err(5668): ... 18 more
Quelqu'un pourrait s'il vous plaît aidez-moi à sortir d'ici?
Mise à jour: l'Ajout d'AutoBahn (WebSocket de la bibliothèque du client pour Android) détails de mise en œuvre:
AutoBahn Client
private void connect2() {
mConnection = new WebSocketConnection();
final String wsuri = "ws://192.168.0.137:8888/";
String TAG = "ArticlesListActivity";
try {
mConnection.connect(wsuri, new WebSocketHandler() {
@Override
public void onOpen() {
Log.e(TAG, "Connected to: " + wsuri);
}
@Override
public void onTextMessage(String payload) {
Log.e(TAG, "Message recieved = " + payload);
}
@Override
public void onClose(int code, String reason) {
Log.e(TAG, "Connection Lost.");
}
});
} catch (WebSocketException e) {
Log.d(TAG, e.toString());
}
}
Avec cette bibliothèque, je suis en mesure de se connecter au serveur, mais instantanément, la connexion est perdue. (Reportez-vous à la "AutoBahn Journal Client" ci-dessous. En revenant à weberknecht fonctionne très bien. Je ne suis PAS explicitement appel mConnection.disconnect()
n'importe où. Donc je ne sais pas comment la connexion devient fin.
AutoBahn Journal Client
02-27 14:27:36.605: D/de.tavendo.autobahn.WebSocketConnection(27701): created
02-27 14:27:36.656: D/dalvikvm(27701): GC_FOR_ALLOC freed 164K, 4% free 9247K/9543K, paused 17ms
02-27 14:27:36.671: D/dalvikvm(27701): GC_FOR_ALLOC freed 7K, 4% free 9368K/9735K, paused 14ms
02-27 14:27:36.671: D/de.tavendo.autobahn.WebSocketReader(27701): created
02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS reader created and started
02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketReader(27701): running
02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketWriter(27701): created
02-27 14:27:36.675: D/de.tavendo.autobahn.WebSocketConnection(27701): WS writer created and started
02-27 14:27:36.769: D/de.tavendo.autobahn.WebSocketReader(27701): run() : ConnectionLost
02-27 14:27:36.773: D/de.tavendo.autobahn.WebSocketReader(27701): ended
02-27 14:27:36.777: D/de.tavendo.autobahn.WebSocketConnection(27701): opening handshake received
02-27 14:27:36.777: E/ArticlesListActivity(27701): Connected to: ws://192.168.0.137:8888/
02-27 14:27:36.781: D/de.tavendo.autobahn.WebSocketConnection(27701): fail connection [code = 3, reason = WebSockets connection lost
02-27 14:27:36.784: D/de.tavendo.autobahn.WebSocketReader(27701): quit
02-27 14:27:36.788: D/de.tavendo.autobahn.WebSocketWriter(27701): ended
02-27 14:27:36.792: E/ArticlesListActivity(27701): Connection Lost.
02-27 14:27:36.792: D/de.tavendo.autobahn.WebSocketConnection(27701): worker threads stopped
OriginalL'auteur Sagar Hatekar | 2012-02-01
Vous devez vous connecter pour publier un commentaire.
Voici comment j'allais démarrer la résolution de ce:
Êtes-vous en train de faire sur votre téléphone (appareil) ou de l'émulateur? Si vous tentez de le faire sur votre téléphone et vous êtes connecté via la 3G, il ne va pas arriver. Dans ce scénario, vous tentez de vous connecter à un interne adresse IP du WAN qui ne fonctionne pas.
De nouveau en supposant que vous êtes en train de faire cela sur un appareil, si vous êtes connecté via Wifi puis c'est une autre histoire. Assurez-vous que le serveur peut être atteint à
192.168.207.84:8080
. Un moyen rapide de tester la connectivité (à partir de votre PC):Si elle arrive à expiration, vous savez que votre serveur ne répond pas. Bien sûr, cela suppose que votre PC est sur le même sous-réseau que votre réseau Wifi.
Si vous tentez de le faire à partir de votre émulateur, suivez les étapes décrites dans [2] pour s'assurer que le serveur est accessible et également assurer votre émulateur (IP) mode ponté.
Pour résumer, le principal raison de délais d'attente généralement se produire en raison d'un manque de disponibilité du serveur (c'est à dire un manque de connectivité). Vous n'avez pas mentionné les détails de votre réseau, donc j'ai fait quelques suppositions basées sur l'adresse IP que vous essayez de vous connecter à (192.168.207.84).
Excellent!! Et vous êtes les bienvenus 🙂
OriginalL'auteur Marvin Pinto
Aussi loin que je peux voir, Weberknecht ne fait que du soutien Hybi-10, pas de la version finale RFC6455 spec, et de plus en plus problématique, est-il de la mise en réseau sur le principal (UI) thread. C'est généralement une mauvaise idée, et échouera sur Android >2.
Pour Android applications natives, il est Autobahn WebSockets pour Android
https://github.com/oberstet/AutobahnAndroid
Il prend en charge la finale RFC6455, s'intègre bien avec l'INTERFACE et des applications de service, fournit RPC et PubSub sur les WebSockets, et plus encore. Découvrez le projet README sur GitHub.
Avertissement: je suis l'auteur de l'Autoroute.
BTW, je frayer un AsyncTask pour les websockets l'activité du réseau de la sorte, il fonctionne très bien pour l'instant.
Le Code est sous licence Apache 2.0 .. open-source. Rgd. AsyncTask .. avec le dernier code que vous n'avez pas besoin que, puisque non seulement le support de lecture/écriture sont effectuées sur les threads d'arrière-plan, mais aussi la première prise se connecter. Ce dernier point a été différent jusqu'à tout récemment .. a lire/écrire sur le thread d'arrière-plan, mais pas le premier socket connecter .. qui provoque en réseau "UI" le fil des questions sur les récentes d'Android.
Autobahn pour Android prend en charge les WebSockets protocole version Hybi-10 place de la finale RFC6455. Je n'ai pas connu ce que Tornade WS 2.2 met en œuvre ..
Fonctionne pour moi: une Tornade 2.2 + votre code ci-dessus + Echo client de démonstration de l'Autoroute Android. Probablement Tornade 2.1 WS impl. peut-être trop vieille .. essayez de 2.2 ..
OriginalL'auteur oberstet