Android将接收到的数据从套接字服务发送到Activity

时间:2016-06-13 09:05:04

标签: android sockets tcp android-asynctask android-handler

我正在寻找一种方法来将接收数据(设置标志时接收)从套接字服务发送到绑定到服务的活动。做这个的最好方式是什么 ?处理程序,AsyncTask还是别的什么?

这是我用来启动连接并处理传入消息的SocketClass:

    class connectSocket implements Runnable {

    @Override
    public void run() {

        running= true;
        try {
            socket = new Socket(serverAddr, SERVERPORT);
            try {
                mBufferOut = new ObjectOutputStream(socket.getOutputStream());
                mBufferIn = new ObjectInputStream(socket.getInputStream());
                while(running){
                     msg = (Message) mBufferIn.readObject();
                }

            }
            catch (Exception e) {
                Log.e("TCP", "S: Error", e);
            }
        } catch (Exception e) {
            Log.e("TCP", "C: Error", e);
        }

    }

}

更新:

public class SocketService extends Service {
private static final String TAG = "com.oos.kiesa.chat";
public static final String SERVERIP = "192.168.X.X";
public static final int SERVERPORT = 4444;
private ObjectOutputStream mBufferOut;
private ObjectInputStream mBufferIn;
Socket socket;
InetAddress serverAddr;
boolean mRun;
Object msg;
public Integer command;
@Override
public IBinder onBind(Intent intent) {
    return myBinder;
}

private final IBinder myBinder = new LocalBinder();

public class LocalBinder extends Binder {
    public SocketService getService() {
        return SocketService.this;

    }
}

@Override
public void onCreate() {
    super.onCreate();
}

public void IsBoundable(){
    Toast.makeText(this,"is boundable", Toast.LENGTH_LONG).show();
}


public void sendMessage(String message) throws IOException {
    if (mBufferOut != null) {
        mBufferOut.writeObject(message);
        mBufferOut.flush();
    }
}

public void sendMessage(Message message) throws IOException {
    if (mBufferOut != null) {
        mBufferOut.writeObject(message);
        mBufferOut.flush();
    }
}

public void sendMessage(User user) throws IOException {
    if (mBufferOut != null) {
        mBufferOut.writeObject(user);
        mBufferOut.flush();
    }
}

public void sendMessage(int command) throws IOException {
    if (mBufferOut != null) {
        mBufferOut.writeInt(command);
        mBufferOut.flush();
    }
}


@Override
public int onStartCommand(Intent intent,int flags, int startId){
    super.onStartCommand(intent, flags, startId);
    System.out.println("I am in on start");
    Runnable connect = new connectSocket();
    new Thread(connect).start();
    return START_STICKY;
}

public void stopClient() throws IOException{

    if (mBufferOut != null) {
        mBufferOut.flush();
        mBufferOut.close();
    }

    mBufferIn = null;
    mBufferOut = null;
    socket.close();
}

class connectSocket implements Runnable {

    @Override
    public void run() {

        mRun = true;
        try {
            socket = new Socket(serverAddr, SERVERPORT);
            try {
                mBufferOut = new ObjectOutputStream(socket.getOutputStream());
                mBufferIn = new ObjectInputStream(socket.getInputStream());
                while(mRun){
                    switch(command.intValue()){
                        case Constants.ADD_MESSAGE:
                            msg = (Message) mBufferIn.readObject(); // send message to Activity 
                            break;
                    }
                }

            }
            catch (Exception e) {
                Log.e("TCP", "S: Error", e);
            }
        } catch (Exception e) {
            Log.e("TCP", "C: Error", e);
        }

    }

}
@Override
public void onDestroy() {
    super.onDestroy();
    try {
        socket.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    socket = null;
}

}

非常感谢一些指导/示例

2 个答案:

答案 0 :(得分:1)

我发给你的是希望它会有所帮助:

class SocketRequestHandler extends Thread {

    static String EOF = "<EOF>";

    TCPResponseModel tcpResponseDS;
    Activity activity;
    boolean doSkip = false;

    String responseStringComplete = "";
    Socket clientSocekt;
    OutputStream clientSocketOutputStream;
    PrintWriter clinetSocketPrintWriter;
    DataInputStream clientSocketInputStream;

    private SocketRequestHandler(TCPResponseModel tcpResponseDS, Activity activity, SaloonListener listener) {
        this.tcpResponseDS = tcpResponseDS;
        this.activity = activity;
        this.listener = listener;
        moreStores = tcpResponseDS.StoresFound;
    }

    public static SocketRequestHandler pingAll(Activity activity, TCPResponseModel tcpResponseDS, SaloonListener listener) {
        SocketRequestHandler requestHandler = new SocketRequestHandler(tcpResponseDS, activity, listener);
        requestHandler.start();
        return requestHandler;
    }

    private void closeStreams() {
        try {
            clientSocekt.close();
            clientSocketInputStream.close();
            clinetSocketPrintWriter.close();
            clientSocketOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            String pingingHost = "URL_TO_PING";
            clientSocekt = new Socket(pingingHost, 12000);
            clientSocketOutputStream = clientSocekt.getOutputStream();
            clinetSocketPrintWriter = new PrintWriter(clientSocketOutputStream);
            String firstPing = "{\"RequestId\":" + tcpResponseDS.RequestId + "}<EOF>";
            clinetSocketPrintWriter.println(firstPing);
            clinetSocketPrintWriter.flush();
            byte[] bytes;
            String pingStr = "";
            clientSocketInputStream = new DataInputStream(clientSocekt.getInputStream());
            while (true) {
                bytes = new byte[1024];
                clientSocketInputStream.read(bytes);
                bytes = trim(bytes);
                if (bytes.length > 0 && !doSkip) {
                    String newString = new String(bytes, "UTF-8");
                    String decoded = pingStr + newString;
                    pingStr = checkForMessage(decoded);
                    responseStringComplete += newString;
                }
                if (doSkip) {
                    break;
                }
            }
            closeStreams();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.print(responseStringComplete);
        }
    }


}

要播放聊天数据,请执行以下操作:

msg = (Message) mBufferIn.readObject(); // Do code after this line                            
 Intent localIntent = new Intent("CHAT_MESSAGE");
 localIntent.putExtra("message", msg); 

LocalBroadcastManager.getInstance(上下文).sendBroadcast(localIntent);

现在,您可以在显示聊天列表的活动中

class ReceiveMessages extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action.equals("CHAT_MESSAGE")) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String chatMessage = getIntent().getStringExtra("message");
                        //get data from intent and update your chat list.
                    }
                });
            }
        }
    }
    ReceiveMessages myReceiver;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //your code
        myReceiver = new ReceiveMessages();
    }

    @Override
    protected void onStart() {
        super.onStart();
        LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver,
                new IntentFilter("CHAT_MESSAGE"));
    }

    @Override
    protected void onStop() {
        super.onStop();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);
    }

答案 1 :(得分:0)

File file = new File("C:\\abc\\def\\ghi"); //def, ghi doesnot exists
file.mkdirs();
BufferedOutputStream stream = null;
try {
     file.createNewFile(); //throw IOE
     stream = new BufferedOutputStream(new FileOutputStream(file));
                   //some logic
} catch (IOException ioe) {
                // handleException
} finally {
       if (stream != null)
       stream.close();
}