Android FTP-Server
Ich bin mit dem folgenden code, um das android-Gerät einen ftp-server (Android Interner Speicher). Ich bin immer die Ausnahme von os.android.NetworkOnMainThread
. Ich habe versucht, die onStart-code in der AsyncTask
app aber nie ausgeführt und stürzt beim starten ab. Jede Hilfe in Bezug auf den ftp-server auf Android wird toll, da ich keine Ahnung habe, wie es funktioniert.
Hier ist die 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;
}
Hier ist die 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();
}
}
}
}
Habe ich den code in der AsyncTask, hier ist es
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 Aufruf der longOpertation in der onCreate-Methode. Was ist das problem, dass die app stürzt beim starten ab.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fullscreen);
new LongOperation().execute();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht, weil Sie nicht das einrichten der Berechtigungen in der manifest? Sie haben, um Erlaubnis für die Nutzung des Internets.
Wenn dies nicht funktioniert, bitte sagen Sie uns, welche Zeile ist es das werfen der Ausnahme.
while(true){ incoming = s.accept(); ...}
Sie nicht setzen, dass in der OnStart(). Das sollte getan werden, in einem thread. SoServerSocket s = null;
sollte eine variable, die Sie Aktivität.Mit der Swiftp-Anwendung (open-source) als Dienst in meiner Bewerbung geholfen, mich zu erreichen, meine Aufgabe. Vielen Dank für jedermanns Hilfe. Hier ist die link wenn jemand will, zu Folgen
Können Sie nicht tun, Netzwerk-Betrieb im Haupt-thread in android 3.0 höher. Verwenden AsyncTask für diese Netzwerk-Betrieb. Dies sehen weitere Erklärung
Bitte poste deinen code hier.
NetworkOnMainthreadException tritt auf, weil Sie vielleicht im Zusammenhang mit der Netzwerk-Betrieb auf der Main-UI-Thread. Sie verwenden sollten, asynctask für diesen Zweck
Dies ist nur geworfen für Anwendungen für die Honeycomb SDK oder höher. Anwendungen für frühere SDK-Versionen erlaubt sind Netzwerke, die auf Ihre Haupt-event-Schleife threads, aber es ist stark entmutigt.
http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
http://developer.android.com/reference/android/os/AsyncTask.html. Überprüfen Sie das Thema unter der überschrift Die 4 Schritte.
Als ein Beispiel von asynctask @ Um das tutorial in android 4.0.3, wenn mit AsynxTasc, aber ich immer noch nicht funktionieren?.
Oben macht einen webserive Anruf in doInBakckground(). Ergebnis-und updates der Benutzeroberfläche durch die Einstellung das Ergebnis in textview in onPostExecute().