簡體   English   中英

使用服務通過套接字連接發送/接收數據。

[英]Use a service to send/receive data through a socket connection.

我創建了一個客戶端服務器應用程序,雙方使用套接字連接和輸入/輸出流進行通信以發送/接收數據。 一切都很好,但前提是我只有一個使用該連接的活動。 由於我的應用程序中將有多個活動,並且經過一番搜索后,我得出的結論是我必須創建一個服務來處理套接字連接以及從套接字流發送/接收消息。 我以前從未與Services一起工作過,我認為我一次只能邁出一步。 目前,我剛剛創建了一個服務,該服務創建了我的Client類(擴展了Thread)的實例並啟動了該線程,從而建立了與服務器的連接。
我的客戶班
T_Client:

public class T_Client extends Thread {
    private static final String TAG = "T_Client";

    private static String serverIP = "192.168.2.3";
    private static int port = 4444;
    private InetAddress serverAddr = null;
    private Socket sock = null;
    private boolean running = false;
    private ObjectInputStream in;
    private ObjectOutputStream out;
    private Object objIn;

    public void send(MessageCustom _msg) {
        if (out != null) {
            try {
                out.writeObject(_msg);
                out.flush();

                Log.i("Send Method", "Outgoing : " + _msg.toString());
            } catch (IOException ex) {
                Log.e("Send Method", ex.toString());
            }
        }
    }

    public void stopClient() {
        Log.v(TAG,"stopClient method run");
        running = false;
    }

    @Override
    public void run() {
        running = true;
        try {
            serverAddr = InetAddress.getByName(serverIP);

            Log.i("TCP Client", "C: Connecting...");
            sock = new Socket(serverAddr, port);
            try {
                out = new ObjectOutputStream(sock.getOutputStream());

                in = new ObjectInputStream(sock.getInputStream());
                Log.i(TAG, "C: Connected.");
                while (running) {
                    objIn = in.readObject();
                    Log.i("Object Read Class", objIn.getClass().toString());
                    Log.i("Object Read", objIn.toString());
                }
                Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + objIn + "'");
            } catch (Exception e) {
                Log.e(TAG, "S: Error", e);
            } finally {
                out.close();
                in.close();
                sock.close();
                Log.i(TAG, "Closing socket: " + sock);
            }
        } catch (Exception e) {
            Log.e(TAG, "C: Error", e);
        }
    }
}

我的服務等級
我的服務:

public class MyService extends Service {
    private static final String TAG = "MyService";

    private T_Client client;

    @Override
    public void onDestroy() {
        Log.v(TAG, "onDestroy");
            if (client != null) {
                try {
                client.stopClient();
                } catch (Exception e) {
                    Log.e(TAG, "Error on close: " + e);
                }
            }
        super.onDestroy();
        Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v(TAG, "onStartCommand");

        client = new T_Client();
        client.start();

        Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

}

我目前在主要活動中所做的就是使用“開始”和“停止”按鈕來啟動/停止服務

public void start(View v){
    Log.i(TAG,"Start pressed");

    Intent intent=new Intent(getBaseContext(),MyService.class);
    startService(intent);
}

public void stop(View v){
    Log.i(TAG,"Stop pressed");

    Intent intent=new Intent(getBaseContext(),MyService.class);
    stopService(intent);
}

所以我的問題是:

  1. 使用我的服務發送東西我該怎么辦?
  2. 如何處理從服務器讀取的對象,以便讓應用程序實時知道已接收到某些信息?

非常感謝能指導我解決問題的任何意見。
先感謝您。

如果其他人遇到這個問題,也有類似的問題,我設法通過解決這兩篇文章中的代碼來解決我的問題

  1. 示例:使用消息傳遞在活動和服務之間進行通信
  2. 如何在活動發生變化時保持android客戶端與服務器的連接並將數據發送到服務器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM