Android套接字在后台连接 [英] Android socket connect in background

查看:78
本文介绍了Android套接字在后台连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当应用程序在后台运行时,我应该怎么做才能保持服务器运行和侦听?

What should I do to keep the server running and listening when the application is in the background?

我当前抛出一个错误:我无法建立连接,因为目标计算机正在积极拒绝连接.

I'm currently throwing an error: I can't make a connection because the target computer is actively refusing to connect.

我在android上有服务器,在pc/python上有客户端.

I have server on android and client on pc/python.

任何人都可以解释我将不胜感激. 用我的服务器编码.

anyone could explain I will be grateful. Code with my server.

public class MainActivity extends Activity {

private ServerSocket serverSocket;

Handler updateConversationHandler;

Thread serverThread = null;

private TextView text;

public static final int SERVERPORT = 8080;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    text = (TextView) findViewById(R.id.textView);

    updateConversationHandler = new Handler();

    this.serverThread = new Thread(new ServerThread());
    this.serverThread.start();

}

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {

            try {

                socket = serverSocket.accept();

                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class CommunicationThread implements Runnable {

    private Socket clientSocket;

    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {

            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {

            try {

                String read = input.readLine();

                updateConversationHandler.post(new updateUIThread(read));

            } catch (IOException e) {
                e.printStackTrace();
            }

    }

}

class updateUIThread implements Runnable {
    private String msg;

    public updateUIThread(String str) {
        this.msg = str;
    }
    @Override
    public void run() {
        if (msg == null) {
            text.setText(msg);
        }
        else{
            text.setText(msg);
            createNotification();
        }
    }
}
void createNotification() {

    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

    Bitmap icon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

    Notification noti = new NotificationCompat.Builder(this)
            .setContentTitle("NOTIFICATION")
            .setContentText("NOTIFICATION")
            .setTicker("NOTIFICATION")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setLargeIcon(icon)
            .setAutoCancel(true)
            .setContentIntent(pIntent)
            .build();

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

    notificationManager.notify(0, noti);
}}

推荐答案

要在Android中执行后台任务,您应该使用服务.
服务器的服务如下所示:

To perform background tasks in Android you should use Services.
A service for the Server would look like:

public class MyService extends Service {

    public static final String START_SERVER = "startserver";
    public static final String STOP_SERVER = "stopserver";
    public static final int SERVERPORT = 8080;

    Thread serverThread;
    ServerSocket serverSocket;

    public MyService() {

    }

    //called when the services starts
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //action set by setAction() in activity
        String action = intent.getAction();
        if (action.equals(START_SERVER)) {
            //start your server thread from here
            this.serverThread = new Thread(new ServerThread());
            this.serverThread.start();
        }
        if (action.equals(STOP_SERVER)) {
            //stop server
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException ignored) {}
            }
        }

        //configures behaviour if service is killed by system, see documentation
        return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    class ServerThread implements Runnable {

        public void run() {
            Socket socket;
            try {
                serverSocket = new ServerSocket(SERVERPORT);
            } catch (IOException e) {
                e.printStackTrace();
            }
            while (!Thread.currentThread().isInterrupted()) {

                try {

                    socket = serverSocket.accept();

                    CommunicationThread commThread = new CommunicationThread(socket);
                    new Thread(commThread).start();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class CommunicationThread implements Runnable {

        private Socket clientSocket;

        private BufferedReader input;

        public CommunicationThread(Socket clientSocket) {

            this.clientSocket = clientSocket;

            try {

                this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void run() {

            try {

                String read = input.readLine();

                //update ui
                //best way I found is to save the text somewhere and notify the MainActivity
                //e.g. with a Broadcast
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

在活动"中,您可以通过以下方式启动服务:

In your Activity, you can start the Service by calling:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //will start the server
    Intent startServer = new Intent(this, MyService.class);
    startServer.setAction(MyService.START_SERVER);
    startService(startServer);

    //and stop using
    Intent stopServer = new Intent(this, MyService.class);
    stopServer.setAction(MyService.STOP_SERVER);
    startService(stopServer);
}

还必须在AndroidManifest.xml中声明Internet权限.将它们添加到标签上方的行:

also you have to declare the Internet permission in your AndroidManifest.xml. Add these to lines above of the tag:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这篇关于Android套接字在后台连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆