0
我已經創建了一個客戶端 - 服務器應用程序,雙方使用套接字連接和輸入/輸出流來發送/接收數據。這一切都很好,但只有我只有一個使用連接的活動。由於我將在應用程序中進行的活動不止一次,並且經過一番搜索後,我得出結論,我必須創建一個服務來處理套接字連接以及從套接字流發送/接收數據。我以前從來沒有和服務合作過,我想我一次只能開始一步。目前,我剛剛創建了一個服務,該服務創建了我的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);
}
}
}
我的服務類
爲MyService:
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);
}
所以我的問題是:
- 我有什麼做用我的服務送東西?
- 如何處理我從服務器讀取的對象,以便我可以讓應用程序實時知道已收到某些內容?
任何可以指導我解決我的問題的輸入是非常感謝。
預先感謝您。