将数据从客户端发送到台式机服务器

时间:2018-06-27 09:33:34

标签: java android sockets client-server networkonmainthread

我试图将日期从客户端的Android应用程序发送到服务器端的桌面NetBeans应用程序,连接工作正常,即使发送数据,但是在我将Android IDE更新到版本3之前!

现在,当我尝试发送数据时,出现以下异常:

  

android.os.NetworkOnMainThreadException

现在我看到这里的帖子是Stackoverflow ... this one,我明白这是因为发送数据发生在主线程上,但是我没有使用主线程来发送数据,并且每次尝试发送数据时,我仍然会收到此错误。


代码说明:我有两种发送数据的方法,一种方法是在建立连接后仅发送一次数据,第二种方法是随时发送数据,现在是我的第一手方法。在主线程上,但是第二个在另一个线程上,例外情况永远不会在第一个线程上发生,但是它总是会在第二个线程上发生,我听说一个解决方案是使用AsyncTask并且我'v在第二个上使用了它,现在我大部分时间都得到了惊喜,但并非总是如此。


这是我的代码,用于更好地理解:

这是第一个仅在主线程上运行一次的方法,它将始终有效:

private void SendInformation(){
    try{
        OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
        OutPut.write(android.os.Build.MODEL);
        OutPut.newLine();
        OutPut.flush();
    }catch(Exception e){
        e.printStackTrace();
    }
}

这是我的第二个带有线程的东西,这个总是给出例外:

public static void SendDetails(String S1, String S2){
    Handler handler = new Handler();

    handler.postDelayed(new Runnable(){

        public void run(){
            try{
                OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
                OutPut.write(S1 + "," + S2);
                OutPut.newLine();
                OutPut.flush();
            }catch(Exception e){
                e.printStackTrace();
                MainActivity.ErrorMessage.setText(e.toString());
            }
        }
    }, Delay * 1000);
}

这是一次相同的秒,但是使用AsyncTask

private static SendInfoTask SIT = new SendInfoTask();

public static void SendDetails(String S1, String S2){
    Handler handler = new Handler();

    handler.postDelayed(new Runnable(){

        public void run(){
            SIT.execute();
        }
    }, Delay * 1000);
}

static class SendInfoTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        try{
            OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
            OutPut.write(Client.AppName + "," + Client.NotificationText);
            OutPut.newLine();
            OutPut.flush();
        }catch(Exception e){
            e.printStackTrace();
            MainActivity.ErrorMessage.setText(e.toString());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
    }
}

有时它可以工作,有时不起作用,当它尝试发送5次后整个应用程序崩溃时,它确实可以工作!

有人可以帮助我吗?什么是我要做的最佳实践? (感谢您的帮助)

0 个答案:

没有答案