针对我的具体问题的好方法

时间:2015-06-03 20:36:08

标签: java android sockets server

我写了一个客户端(android智能手机)-server(java)-program。

它仅用于练习,直到现在我只是将一个字符串发送到服务器,将其保存到文件中。

目前我想实现一项新功能,每隔5分钟将我的gps坐标发送到我的服务器并保存。

为此,我设置AlarmManager每300000毫秒(或5分钟)接收广播。

收到广播后,我想与我的服务器建立连接:

AlarmReceiver.class:

    public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.e("alarmReceiver","received alarm");
        MainActivity activity = (MainActivity) context;
        activity.cConnect = new ConnectionThread(activity.clientServer, activity.out);
        activity.cConnect.start();
    }

}

ConnectionThread.class:

    public class ConnectionThread extends Thread {

    Socket clientServer;
    BufferedWriter out;

    public ConnectionThread(Socket clientServer_, BufferedWriter out_) {
        // TODO Auto-generated constructor stub
        this.clientServer = clientServer_;
        this.out = out_;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        try {
            clientServer = new Socket(MainActivity.dstName, MainActivity.dstPort);

            out = new BufferedWriter(new OutputStreamWriter(clientServer.getOutputStream()));
            out.write("alarm received"); //currently just sending this string
            out.flush();
            out.close();
            clientServer.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

在我的 MainActivity.class 中,我声明了以下内容:

protected static String dstName = ...
protected static int dstPort = ...
public Socket clientServer;
public BufferedWriter out;
private AlarmManager alarmMgr;
private static int repeatAlarmEvery = 30000;
private static int firstAlarmAfter = repeatAlarmEvery;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);...

我的问题是,我担心我在AlarmReceiver接收广播并且已经在同一端口建立连接时尝试传输文本。所以我决定只有一个{{1这样我可以检查socket-object called clientServer - > clientServer != null

但是试图在我的模拟器上运行我的客户端程序我遇到了以下错误:

do not establish a new connection, instead use the existing one

我认为/看到的是广播收到的上下文受到限制,我不能将其投射到我的活动06-03 19:24:29.969: E/AndroidRuntime(2186): Caused by: java.lang.ClassCastException: android.app.ReceiverRestrictedContext cannot be cast to com.example.clientservercommunication.MainActivity 06-03 19:24:29.969: E/AndroidRuntime(2186): at com.example.clientservercommunication.AlarmReceiver.onReceive(AlarmReceiver.java:14) 。因此,我无法从MainActivity访问clientSocketout

现在我有两个解决方案:

1)声明MainActivity.classclientSocket静态。

2)为文本传输建立不同的连接(不同的端口),避免传输文本和gps坐标之间的冲突。例如文本传输端口50000,gps数据在端口50001上传输

问题:

哪一个更好(关于内存泄漏,如果可能有任何等等,不是关于意见,例如因为我更喜欢解决方案等等。)/更常见的方法还是有更好的设计模式/解决方案,以实现我想要的。

对我来说,获得正确模式的支持是非常重要的,因为我厌倦了在没有足够背景知识的情况下尝试它来解决大量问题。希望我能很好地描述我的问题。

0 个答案:

没有答案