Android Serveur FTP
Je suis en utilisant le suivant code de faire de l'appareil android, un serveur ftp (Android stockage Interne). Je reçois à l'exception de os.android.NetworkOnMainThread
. J'ai essayé de mettre le démarrage de code dans le AsyncTask
mais l'application ne s'exécute jamais et se bloque au lancement. Toute aide concernant le serveur ftp sur Android sera grand car je n'ai aucune idée de comment le faire fonctionner.
Ici est la MainActivity
Code
package com.googlecode.simpleftp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class FTPServer extends Activity {
private static int COMMAND_PORT = 2121;
static final int DIALOG_ALERT_ID = 0;
private static ExecutorService executor = Executors.newCachedThreadPool();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.my_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle item selection
switch (item.getItemId()) {
case R.id.new_game:
System.out.println("New game button is pressed!");
//newGame();
return true;
case R.id.quit:
System.out.println("Quit button is pressed!");
showDialog(DIALOG_ALERT_ID);
return true;
default:
return super.onOptionsItemSelected(item); }
}
@Override
protected Dialog onCreateDialog(int id){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Are you sure you want to exit?")
.setCancelable(false).setPositiveButton("yes", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int id){
FTPServer.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
return alert;
}
Ici est la ServerPI Code
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ServerPI implements Runnable{
private Socket clientSocket;
private BufferedReader in;
private PrintWriter out;
private String baseDir;
private String relativeDir;
private String absoluteDir;
private String fileName;
private String filePath;
public ServerPI(Socket incoming) throws IOException{
this.clientSocket = incoming;
in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
out = new PrintWriter(this.clientSocket.getOutputStream(), true);
baseDir = new File("").getAbsolutePath();
relativeDir = "/";
absoluteDir = baseDir + relativeDir;
fileName = "";
filePath = absoluteDir + "/" + fileName;
}
private void readCommandLoop() throws IOException {
String line = null;
reply(220, "Welcome to the SimpleFTP server!");
while((line = in.readLine()) != null){
int replyCode = executeCommand(line.trim());
if(replyCode == 221){
return;
}
}
}
private int executeCommand(String trim) {
//TODO Auto-generated method stub
return 0;
}
public int reply(int statusCode, String statusMessage){
out.println(statusCode + " " + statusMessage);
return statusCode;
}
@Override
public void run(){
try{
this.readCommandLoop();
} catch (IOException e){
e.printStackTrace();
}
finally {
try {
if(in != null){
in.close();
in = null;
}
if(out != null){
out.close();
out = null;
}
if (clientSocket != null){
clientSocket.close();
clientSocket = null;
}
}
catch (IOException e){
e.printStackTrace();
}
}
}
}
J'ai mis le code dans le AsyncTask, ici, il est
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
ServerSocket s = null;
Socket incoming = null;
try{
s = new ServerSocket(COMMAND_PORT);
String ip = (s.getInetAddress()).getHostAddress();
Context context = this.getApplicationContext();
CharSequence text = ip;
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, text, duration);
Thread.sleep(1000);
toast.show();
while(true){
incoming = s.accept();
executor.execute(new ServerPI(incoming));
}
}
catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
}
finally{
try
{
if(incoming != null)incoming.close();
}
catch(IOException ignore)
{
//ignore
}
try
{
if (s!= null)
{
s.close();
}
}
catch(IOException ignore)
{
//ignore
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
Iam appel de la longOpertation dans la méthode onCreate. Quel est le problème que l'application se bloque au lancement.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen);
new LongOperation().execute();
}
OriginalL'auteur Jibяaᴎ Khaᴎ | 2013-04-09
Vous devez vous connecter pour publier un commentaire.
Peut-être parce que vous n'avez pas de fixer les permissions dans le manifeste? Vous devez définir des autorisations pour l'utilisation d'internet.
Si cela ne fonctionne pas, veuillez nous dire quelle ligne est-il jeter l'exception.
L'exception en se produisant sur le premier try catch block, signifie que le socket de connexion s'ouvre jamais et l'adresse ip est affichée comme 0.0.0.0
Il semble que votre commande pour obtenir l'adresse ip ne fonctionne pas bien. J'ai google et il semble que c'est toujours le retour 0.0.0.0. Vérifiez ce post. Vous avez une réponse sur la façon d'obtenir l'adresse ip stackoverflow.com/questions/7086734/how-to-get-my-ip-address
Cool, laissez-moi vérifier et revenir vers vous.
Il n'a obtenu l'adresse ip affichée, mais en hexa format 🙂 comment puis-je me figure que dans la chaîne ou un nombre toujours à quoi il retourne ?
OriginalL'auteur Reinherd
while(true){ incoming = s.accept(); ...}
Vous ne pouvez pas mettre cela dans OnStart(). Cela devrait être fait dans un thread. DoncServerSocket s = null;
doit être une variable d'activité.J'ai créé un AsyncTask et tout le code est maintenant dans cette tâche corps, je suis l'appel de la Async Task méthode execute en fonction onCreate (), est-il correct ? Il est crash d'une application, sans même le lancement.
Veuillez vérifier mon montage pour plus de mises à jour.
OriginalL'auteur greenapps
À l'aide de la Swiftp application (open source) en tant que service dans ma demande m'a aidé à réaliser ma tâche. Merci pour chacuns de l'aide. Voici la lien si quelqu'un veut suivre
OriginalL'auteur Jibяaᴎ Khaᴎ
Vous ne pouvez pas faire l'exploitation du réseau dans le thread principal dans android 3.0 et supérieur. Utilisation AsyncTask pour ce fonctionnement en réseau. Voir ce pour plus d'explications
Dans ce cas, qu'est-ce que l'exception que vous obtenez
Il n'est jamais à l'application et ne sont donc pas en mesure de cath l'exception. Vous pouvez poster tout échantillon de travail de la tâche Asynchrone ou modifier mon code ci-dessus afin que je puisse être sur une bonne voie
Veuillez vérifier mon montage pour plus de mises à jour.
Pas sur le Toast. Vous ne pouvez pas utiliser Toast() dans doInBackGround (), car elle concerne l'INTERFACE utilisateur. Aussi de faire disparaître la Chaîne de la propriété intellectuelle; et l'obtention de la propriété intellectuelle en tant qu'qui ne fonctionnera pas comme vous le savez maintenant. S'il vous plaît montrer comment vous instancier et appelez votre asynctask dans onCreate();
OriginalL'auteur Arun C
Merci de poster votre code ici.
NetworkOnMainthreadException se produit parce que vous peut-être l'exécution de Réseau liés à l'opération sur le main Thread d'INTERFACE utilisateur. Vous devez utiliser asynctask pour cette fin
Ce n'est jeté pour des applications ciblant le Nid d'abeille SDK ou plus. Les Applications ciblant les précédentes versions du SDK sont autorisés à faire du réseautage sur leur boucle principale threads, mais c'est fortement déconseillé.
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
http://developer.android.com/reference/android/os/AsyncTask.html. Vérifiez le sujet sous la rubrique Les 4 Étapes.
Un exemple de travail de asynctask @ Pour utiliser le tutoriel android 4.0.3 si eu à travailler avec AsynxTasc mais je n'ai toujours pas de travail?.
Ci-dessus fait un webserive appel dans doInBakckground(). Retourne le résultat et les mises à jour de l'interface utilisateur en paramètre le résultat dans textview dans onPostExecute().
Veuillez vérifier mon montage pour plus de mises à jour.
post logcat êtes-vous d'obtenir une exception dans le logcat
Je ne reçois aucune exception, mais sur ceci: while(true){ entrant = s.accept(); exécuteur testamentaire.execute(nouveau ServerPI(entrant)); } il arrête l'exécution d'ici et d'threadpoolexecuter classe d'erreur se produit.
doinBackground() s'exécute déjà en arrière-plan. Pourquoi avez-vous besoin d'exécuteur testamentaire.execute()? Si vous voulez l'exécution en parallèle de ne pas utiliser asynctask
OriginalL'auteur Raghunandan