Как я могу исправить мою проблему IOException, когда я использую Internel Server. (Java / Android)

0

В настоящее время я пытаюсь отправить сообщение из моего приложения на мой внутренний сервер SQL. В настоящее время я получаю IOException с помощью оператора connection.getOutputStream(). Я использовал тот же код для хостинга, и все работает отлично.

Я уже сделал свой SQL-сервер доступным извне, используя DNS и переадресацию портов, но я все еще получаю IOException. Может быть, кто-то может мне помочь. Внутренним сервером является Raspberry Pi, который был настроен с использованием Apache2.

package com.example.myapplication;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import static android.widget.Toast.*;



public class MainActivity extends AppCompatActivity {
 EditText et;
 Button btn;
 TextView tv;

final String scripturlstring = "hostingservice.net";          
//final String scripturlstring = "192.168.178.97:80/index.php";   // Ip adress raspberry pi
@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et = (EditText) findViewById(R.id.editText);
    tv = (TextView) findViewById(R.id.textView);
    btn = (Button) findViewById(R.id.button);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(internetAvailable()){
                sendToServer(et.getText().toString());
            }else{
                makeText(getApplicationContext(), "Internet ist nicht Verfügbar", LENGTH_SHORT).show();
            }
        }
    });
}

public void sendToServer(final String text){
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {

                String textparam = "text1=" + URLEncoder.encode(text, "UTF-8");
                tv.setText(textparam);
                URL scripturl = new URL(scripturlstring);
                HttpURLConnection connection = (HttpURLConnection) scripturl.openConnection();


                connection.setDoOutput(true);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
               connection.setFixedLengthStreamingMode(textparam.getBytes().length);

                // Problem entsteht beim connection.getOutputStream

                OutputStreamWriter contentWriter;
                contentWriter = new OutputStreamWriter(connection.getOutputStream());
                contentWriter.write(textparam);
                contentWriter.flush();
                contentWriter.close();


                InputStream answerInputStream = connection.getInputStream();
                final String answer = getTextFromInputStream(answerInputStream);


                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //Toast.makeText(getApplicationContext(), "noThread", Toast.LENGTH_SHORT).show();

                        tv.setText(answer);

                    }
                });
                answerInputStream.close();
                connection.disconnect();
                connection.close();
            }catch (MalformedURLException e){
                e.printStackTrace();
                tv.setText("Pi hat probleme mit dem MalformedUrlException");
            }catch(IOException e){
                tv.setText("Pi hat probleme mit dem IOexception");
                        //System.err.println("Error creating HTTP connection");
                e.printStackTrace();
            }

        }
    }).start();
}
public String getTextFromInputStream (InputStream is){
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder stringBuilder = new StringBuilder();
    try {
        String aktuellZeile;
        while((aktuellZeile = reader.readLine()) != null){
        stringBuilder.append(aktuellZeile);
        stringBuilder.append("\n");
    }
    }catch (IOException e){
        e.printStackTrace();
    }

    return stringBuilder.toString().trim();
}
public boolean internetAvailable(){
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();

 }
}
  • 2
    Может быть, какая-то исключительная трассировка
Теги:
raspberry-pi
webserver

1 ответ

1

Конечно, вы не добавили это: -

PS: - Большую часть времени I0Exception относится к интернету. Пожалуйста, добавьте

 <uses-permission android:name="android.permission.INTERNET" />

в AndroidManifest.xml

Я не вижу другой причины для I0Exception.

Также в onDestory(...) остановите поток.. иначе вы получите еще одно исключение. (если поток все еще работает)

  • 0
    Поговорите с почтальоном один раз ..
  • 0
    Интернет-разрешение задается в файле XML. Как ни странно, программа также работает гладко, когда я устанавливаю переменную scripturlstring для внешнего поставщика услуг хостинга (webhost.com). Сообщение об ошибке появляется только тогда, когда я хочу использовать свой частный сервер. Я использую скрипт PHP на стороне сервера, чтобы сохранить сообщение. Может ли ошибка в сценарии быть причиной ошибки IOException?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню