Visualizzazione stampabile
-
Socket
Salve a tutti,ho un problema con il protocollo TCP IP
allora questo è il codice:
String host="192.168.0.6";
String buff="8888";
int porta;
porta=Integer.valueOf(buff).intValue();
try{
Socket socket = new Socket(host, porta);
DataOutputStream os = new DataOutputStream(socket.getOutputStream());
String userInput = "ciao";
os.writeBytes(userInput + '\n');
os.close();
socket.close();
}catch(Exception e)
{}
PS: ho aggiunto al manifest xml
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
ok lasciate stare la semplicità xk ho ridotto il codice,ma mi genera sempre un eccezione alla creazione del pocket e quindi va nel catch,aiutatemiiiiiii!!!!!!!!!!!
-
-
Postare lo stack trace dell'errore potrebbe aiutare.
Oltre a questo, lo stai testando su un terminale o sull'emulatore ?
-
Quote:
Originariamente inviato da
pourquoipas
Postare lo stack trace dell'errore potrebbe aiutare.
Oltre a questo, lo stai testando su un terminale o sull'emulatore ?
Non i da nessun errore a mio parere..genera solo un'eccezione..comunque l'ho testato su telefono
-
Dovresti loggare l'errore nel catch, per come è il tuo codice ora prosegue senza segnalare nulla.
prova a mettere
codice:
}catch(Exception e) {
Log.d("TuaClasse", "Errore in gestione Socket", e);
}
e poi guarda cosa scrive nel logcat
-
ho sostituito tuaclasse con la mia classe ovvero ClientActivity ma nn vedo nessun errore nel logcat
-
forse questo:
07-01 16:44:31.790: W/InputManagerService(2102): Got RemoteException sending setActive(false) notification to pid 16784 uid 10179
-
Non mi pare, se lavori con eclipse ed un telefono prova a farlo andare in debug e mettere un breakpoint sull'istruzione Log.d(...) aggiunta, se si ferma vuol dire che effettivamente va in eccezione, a quel punto passa nel logcat e vedi se facendolo ripartire scrive qualcosa (dovrebbe, se non hai il filtro dei messaggi ad un livello maggiore di debug.
Altra soluzione per vedere l'errore è togliere tutto il blocco try/catch e far andare in errore il programma, poi sempre nel logcat dovresti avere lo stacktrace.
-
allora nel logcat sempre stesso errore...e cmq nn si può avviare un pocket senza try catch o throws Exception..nn capisco perché non va..se lo faccio da pc a pc funziona..
-
Sono andato a ripescare un test che avevo fatto tempo addietro ed è praticamente uguale (perdonami ma ho fatto un solo test un'anno e mezzo fa usando i socket sotto android, sono arrugginito :D)
codice:
public void tcpSend(String what) {
Socket s = null;
try {
// s = new Socket("192.168.0.144",6789);
int port = Integer.valueOf(textPort.getText().toString());
s = new Socket(textip.getText().toString(),port);
//outgoing stream redirect to socket
OutputStream out = s.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out);
PrintWriter output = new PrintWriter(ow);
output.println(what);
output.close();
ow.close();
out.close();
} catch (Exception e) {
} finally {
if (s != null) {
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Questo funzionava x certo (quantomeno sul 2.2) e comunicava con una app java che usava i socket sul pc.
i miei permessi erano :
codice:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
A questo punto io farei mille piccole verifiche che probabilmente però hai già fatto :
Non è che per caso hai dati chiusi e wifi staccato sul telefono ?
L'indirizzo ip è corretto ? la porta è corretta ? risponde qualcosa ?
Peraltro, in debug ti si ferma sul Log.d(...) ? Se si, prova a fare un inspect di e e vedi almeno che tipo di eccezione è.
Continuo però a non capire come mai non ti scriva nulla sui log se va in errore.
-
mi da sempre eccezione anche il tuo
-
Si, ma serve capire che eccezione ti da ...
-
Nessuna...Ma mica puoi provare te con eclipse ???pls
Inviato dal mio GT-I9300 usando Androidiani App
-
ho provato il mio codice per cui ho anche l'applicazione Host.
Senza un programma che mi risponda quando apro la connessione da errore anche a me il mio codice (ma aggiungendo la riga che ti ho detto nel catch mi trovo l'errore nel logcat)
codice:
07-01 18:27:26.849: D/TuaClasse(21812): Errore in gestione Socket
07-01 18:27:26.849: D/TuaClasse(21812): java.net.SocketException: No route to host
07-01 18:27:26.849: D/TuaClasse(21812): at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
07-01 18:27:26.849: D/TuaClasse(21812): at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
07-01 18:27:26.849: D/TuaClasse(21812): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
07-01 18:27:26.849: D/TuaClasse(21812): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
07-01 18:27:26.849: D/TuaClasse(21812): at java.net.Socket.startupSocket(Socket.java:705)
07-01 18:27:26.849: D/TuaClasse(21812): at java.net.Socket.tryAllAddresses(Socket.java:150)
07-01 18:27:26.849: D/TuaClasse(21812): at java.net.Socket.<init>(Socket.java:209)
07-01 18:27:26.849: D/TuaClasse(21812): at java.net.Socket.<init>(Socket.java:176)
07-01 18:27:26.849: D/TuaClasse(21812): at net.leieuncretino.alpha.dpad.DPad.tcpSend(DPad.java:225)
07-01 18:27:26.849: D/TuaClasse(21812): at net.leieuncretino.alpha.dpad.DPad$MouseThread.run(DPad.java:186)
Se invece avvio il programma host su pc e gli faccio usare ip e porta corrette funziona senza problemi
-
Ok ade riprovo...potresti darmi il codice host..te ne sarei grato...
Inviato dal mio GT-I9300 usando Androidiani App
-
Questa è la classe che fa da server e rimane in ascolto.
L'ho pulita delle logiche aggiuntive che usavo di prova e che ti avrebbero solo fatto confusione (spero che tutto quel che è rimasto vada ma dovrebbe).
In pratica apre la porta 6789 (cambia il numero con quello che usi nel tuo client) e rimane in ascolto e poi stampa sullo standard output quello che ha ricevuto.
(è proprio una cosa banale, e di test, senza controlli o altro, giusto per vedere se arrivano dati)
codice:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
// TODO code application logic here
ServerSocket welcomeSocket = new ServerSocket(6789);
System.out.println("DPadServer: starting on system");
while(true)
{
Socket connectionSocket = welcomeSocket.accept();
InputStream in = connectionSocket.getInputStream();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(in));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
long timeout = 100;
long t0 = System.currentTimeMillis();
long time = 0;
while ((in.available() < 1) && (time < timeout)) {
try {
Thread.sleep(5);
} catch (InterruptedException ie) {
}
time = System.currentTimeMillis() - t0;
}
String clientSentence = inFromClient.readLine();
System.out.println("Received: " + clientSentence);
}
}
}
ciao e facci sapere come va :)
-
allora ho provato anche con la tua app lato server...funziona da pc a pc ma da pc a android nulla...non va...ho provato anche con il log.d ma vedo solo questi errori 07-02 17:00:17.140: D/TuaClass(938): Errore nel socket
07-02 17:00:20.838: W/InputManagerService(87): Got RemoteException sending setActive(false) notification to pid 899 uid 10046
07-02 17:00:20.927: D/gralloc_goldfish(938): Emulator without GPU emulation detected.
07-02 17:00:21.068: I/ActivityManager(87): Displayed com.example.client1/.Client: +19s671ms
07-02 17:00:21.327: W/NetworkManagementSocketTagger(87): setKernelCountSet(10013, 0) failed with errno -2
07-02 17:03:07.637: D/dalvikvm(166): GC_CONCURRENT freed 384K, 6% free 9534K/10119K, paused 5ms+4ms
sia con server acceso che spento
-
Ho provato anche a convertire il server in un app lato pc e funziona...ma da android nn funziona...i permessi li ho messi...e cm se fosse disabilitato qualcosa ma è tutto attivo
-
CI SONO RIUSCITOOOOOOO!!!soluzione usare un thread.
-
Mi fa piacere sentirlo.. in pratica funziona solo se è in un thread separato ?
(In effetti anche il mio codice era in un thread ma non ho pensato potesse essere collegata la cosa, per me è normale che la comunicazione tcp sia gestita da un thread a parte)
-
praticamente si..sono usuale scrivere programmi pocket in vari linguaggi tra pc...ma davo per scontato anch'io che nn incidesse..hahaha..e invece..