繁体   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