URL Connection

meine Versuche einen String an ein PHP Script zu übergeben, schlagen fehl.
obwohl das Script(die URL) erreichbar ist, bekomme ich bei der Instanziierung des OutputStremWriter eine Fehler (Connection timed out: connect).

hier nun der Code

private void HttpPost(String url, String inhalt) throws Exception
{
    String inhalt_utf8 = URLEncoder.encode(inhalt, "UTF-8");

    URL meine_url = new URL(url);
    URLConnection url_con = meine_url.openConnection();
    url_con.setDoOutput(true);

    OutputStreamWriter osw = new OutputStreamWriter(url_con.getOutputStream());

    osw.write(inhalt_utf8);
    osw.close();

}

kann mir jemand helfen?

  1. Poste mal die genauere Exception
  2. Welche URL steuerst du denn an?

zu 1. mit e.getMessage() bekomme ich " Connection timed out: connect"
zu 2. bredenbruch.de/sm.php

zu 1. mit e.getMessage() bekomme ich " Connection timed out: connect"

Nutz mal e.printStacktrace();

die aufrufende Methode sieht so aus:

            {
                if (isNameOk() && isEmailOk() && isBetreffOk() && isInhaltOk())
                    {
                        btn_Senden.setEnabled(false);

                        String url = "http://www.bredenbruch.de/sm.php";
                        String was = "";
                        was += "name=" + tf_Name.getText();
                        was += "&email=" + tf_Email.getText();
                        was += "&betreff=" + tf_Betreff.getText();
                        was += "&nachricht=" + ta_Inhalt.getText();

                        try
                            {
                                HttpPost(url, was);

                                JOptionPane.showMessageDialog(null,
                                        "Mail wurde erfolgreich versandt", "Mailverfolgung",
                                        JOptionPane.OK_OPTION);
                            }
                        catch (Exception e)
                            {
                                System.out.println(e.getMessage());
                                JOptionPane.showMessageDialog(null,
                                        "Mail wurde nicht erfolgreich versandt", "Mailverfolgung",
                                        JOptionPane.OK_OPTION);
                            }

                        btn_Senden.setEnabled(true);
                    }

            }```

Die Methode println(boolean) im Typ PrintStream ist für die Argumente nicht anwendbar (void)

Hier eine Sample:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import javax.swing.JOptionPane;

public class Senden {
	String url		= "http://www.bredenbruch.de/sm.php";
	
	public static void main(String[] args) {
		new Senden();
	}
	
	public Senden() {
		try {
			String name			= URLEncoder.encode("Max Mustermann",				"UTF-8");
			String email		= URLEncoder.encode("a.preuss@hovida-design.de",	"UTF-8");
			String betreff		= URLEncoder.encode("Demonstration",				"UTF-8");
			String nachricht	= URLEncoder.encode("Hallo Welt",					"UTF-8");
			String gesendet		= HTTPPost(String.format("name=%s&email=%s&betreff=%s&nachricht=%s", name, email, betreff, nachricht));
			
			JOptionPane.showMessageDialog(null, gesendet, "Mailverfolgung", JOptionPane.OK_OPTION);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	
	public String HTTPPost(String data) {
		try {
			URL meine_url				= new URL(this.url);
			URLConnection connection	= meine_url.openConnection();
			connection.setDoOutput(true);
			connection.setDoInput(true);
		 
		    OutputStreamWriter output = new OutputStreamWriter(connection.getOutputStream());
		    output.write(data);
		    output.close();

		    StringBuffer response	= new StringBuffer();
		    InputStreamReader input = new InputStreamReader(connection.getInputStream());
		    int available			= input.read();
		    while(available != -1){
		        response.append((char) available);
		        available = input.read();
		    }
		    input.close();
		    
	        return response.toString();
		} catch (MalformedURLException e) {
			e.printStackTrace();
			return String.format("Fehler aufgetreten: %s", e.getMessage());
		} catch (IOException e) {
			return String.format("Fehler aufgetreten: %s", e.getMessage());
		}
	}
}

ich mache mich sofort an die Arbeit…

selbst wenn ich Deinen Code 1:1 übernehme, bekomme ich den gleichen Fehler …
an meinem E-Mail Account kann ich jedoch erkennen, dass Deine Lösung stimmt.

Ich vermute mal, dass es sich um “offene Ports” handelt.
Hier ist nur der port 80 offen…

vielen Dank für Deine Bemühungen…

Port 80 ist Standardmäßig offen (ausgehend, nicht eingehend), sonst könntest du keine Internetseiten aufrufen.

Wenn doch der gleiche “Fehler” kommt, was steht denn da in der Konsole?
Da muss ein komplettes Stacktrace stehen wenn du meins übernommen hast und nicht was du da unsinnigerweise mit “getMessage()” ausgibst.

Überall wo ein try/catch ist, mach ein e.printStackTrace(); rein, damit du den Fehler besser verfolgen kannst.´

Edit:
Hab ich an einer stelle z.B. ausversehen vergessen:

 } catch (MalformedURLException e) {
	e.printStackTrace();	// <<<<<<<< Hier ist es drin
	return String.format("Fehler aufgetreten: %s", e.getMessage());
} catch (IOException e) {
					// <<<<<<<< Hier aber NICHT
	return String.format("Fehler aufgetreten: %s", e.getMessage());
}

[QUOTE=Bernhard]Hier ist nur der port 80 offen…

[/QUOTE]
Das kannst Du testen:

telnet empfängerhost.example.com 25

[OT][QUOTE=Bizarrus]Port 80 ist Standardmäßig offen (ausgehend, nicht eingehend), sonst könntest du keine Internetseiten aufrufen.[/QUOTE]
Hm? Hab ich was verpasst? Das war noch nie so und ist es meines Wissens nach auch noch immer nicht …
[/OT]

[QUOTE=Akeshihiro][OT]
Hm? Hab ich was verpasst? Das war noch nie so und ist es meines Wissens nach auch noch immer nicht …
[/OT][/QUOTE]

Ich gehe da von einem Firmenpc mit paranoidem Admin aus…

Konsolenausgabe :

java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
at Testpack.Senden.HTTPPost(Senden.java:58)
at Testpack.Senden.(Senden.java:34)
at Testpack.Senden.main(Senden.java:22)


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.swing.JOptionPane;

public class Senden
    {

        String url = "http://www.bredenbruch.de/sm.php";


        public static void main(String[] args)
            {
                new Senden();
            }


        public Senden()
            {
                try
                    {
                        String name = URLEncoder.encode("Horst", "UTF-8");
                        String email = URLEncoder.encode("h.sarafin@halfa.de", "UTF-8");
                        String betreff = URLEncoder.encode("Demon", "UTF-8");
                        String nachricht = URLEncoder.encode("dieses ist die Nachricht", "UTF-8");
                        String gesendet = HTTPPost(String.format(
                                "name=%s&email=%s&betreff=%s&nachricht=%s", name, email, betreff,
                                nachricht));

                        JOptionPane.showMessageDialog(null, gesendet, "Mailverfolgung",
                                JOptionPane.OK_OPTION);
                    }
                catch (UnsupportedEncodingException e)
                    {
                        e.printStackTrace();
                    }
            }


        public String HTTPPost(String data)
            {
                try
                    {
                        URL meine_url = new URL(this.url);
                        URLConnection connection = meine_url.openConnection();
                        connection.setDoOutput(true);
                        connection.setDoInput(true);

                        OutputStreamWriter output = new OutputStreamWriter(
                                connection.getOutputStream());
                        output.write(data);
                        output.close();

                        StringBuffer response = new StringBuffer();
                        InputStreamReader input = new InputStreamReader(connection.getInputStream());
                        int available = input.read();
                        while (available != -1)
                            {
                                response.append((char) available);
                                available = input.read();
                            }
                        input.close();

                        return response.toString();
                    }
                catch (MalformedURLException e)
                    {
                        e.printStackTrace();
                        return String.format("Fehler aufgetreten: %s", e.getMessage());
                    }
                catch (IOException e)
                    {
                        e.printStackTrace();
                        return String.format("Fehler aufgetreten: %s", e.getMessage());
                    }
            }
    }```

der Source

Hm? Hab ich was verpasst? Das war noch nie so und ist es meines Wissens nach auch noch immer nicht …

Würdest du dann in irgendeiner Form eine Internetseite besuchen können? Definitiv nicht.
Wenn du www.test.de im Browser aufrufst weist du ja schon, dass der Browser dies Standardmäßig als www.test.de:80 intepretiert? Der Standardport 80 ist nun mal für HTTP gesetzt.

Und wenn der Port dicht ist, oder in irgendeiner Form geblockt wird, funzt es nicht.

Ich gehe da von einem Firmenpc mit paranoidem Admin aus…

Möglich. Oder Eltern die über den Router Seiten sperren, andernfalls auch der Server selber der Ihn als Clienten blockt (Stichwort ist hier iptables im bezug auf fail2ban oder wie auch immer).

Und die Exception sagt aus:

Connection timed out: connect

Dass ein Timeout stattgefunden hat - Der Host hat in dem Zeitraum sich nicht gerührt.

Denn ich bekomme von meiner Seite aus eine Verbindung. Bei mir funktioniert auch die zuletzt gepostete Source.

ich habe die Lösung auch gefunden, vielen Dank für Deine Bemühungen… das Runtime muss dem Standardproxy zugewiesen bekommen…

im Souce:

System.setProperty("java.net.useSystemProxies", "true");

das Runtime muss dem Standardproxy zugewiesen bekommen…

Aber auch nur wenn du da irgendwelche Blockaden drin hast.
Oder du hast in den Java-Einstellungen selber einen Proxy gesetzt der aber derzeit nicht erreichbar ist (?)

[QUOTE=Bizarrus]Würdest du dann in irgendeiner Form eine Internetseite besuchen können? Definitiv nicht.
Wenn du www.test.de im Browser aufrufst weist du ja schon, dass der Browser dies Standardmäßig als www.test.de:80 intepretiert? Der Standardport 80 ist nun mal für HTTP gesetzt.

Und wenn der Port dicht ist, oder in irgendeiner Form geblockt wird, funzt es nicht.[/QUOTE]

Genau das meinte ich, das ist Quatsch … Du verwechselst hier etwas oder hast keine Ahnung von Netzwerkkommunikation. Natürlich könnte ich und auch jeder andere auf die Webseite gehen, wenn der Port 80 gesperrt ist, das ist nämlich vollkommen egal. Dass der Server auf Port 80 lauscht, heißt nicht, dass der Client den Port 80 benötigt. Der Port 80 und auch jeder andere Port für einen Dienst ist nur für die aller erste Anfrage in Richtung Server von Bedeutung, damit man eine erste Anlaufstelle hat, darum wurden diverse Dienste mit bestimmten Ports standartisiert (auch bekannt als well known ports). Welchen Port der Client für den Netzwerkaufbau verwendet bzw. vom OS zugewiesen bekommen hat, weißt du nicht, es ist ein völlig willkürlicher nicht belegter Port und es ist, das kann ich dir versichern, niemals der Port 80! Und auch der Server kommuniziert nach dem Verbindungsaufbau ebenfalls über einen völlig anderen Port als 80, um diesen wieder freizugeben für neue Clients, die versuchen eine Verbindung aufzubauen.

Von Clientseite gibt es nur eine Möglichkeit, wie man den Port 80 “dicht” machen könnte, nämlich eine Firewall welcher Art auch immer, die aber alle Anfragen, die der Client raushaut und welche als Ziel den Port 80 haben, rausfiltert und verwirft. Somit kommen die Anfragen nie raus. Der Client verwendet aber nie den Port 80, sondern wie schon gesagt, einen x-beliebigen und das ist der Firewall total egal. Und selbst wenn die Firewall rausgehende Pakete mit dem Zielport 80 verwirft, das heißt noch nicht, dass der Clientport 80 zu ist. Und umgekehrt eben genauso. Wenn die Firewall eingehende Pakete mit dem Zielport 80 verwirft, heißt das noch nicht, dass ausgehende Pakete mit dem Zielport 80 auch geblockt werden, ebenso für den Quellport 80. Aber wie gesagt, die Ports 0-1023 werden sowieso nie als Quellport vergeben, von daher ist das an der Stelle auch total irrelevant und ob diese geblockt werden/gesperrt sind ebenso wenig.

Akeshihiro, sonst immer sehr ausführliche verständliche und richtige Posts, die ich sehr gerne lese. Aber das stimmt nicht. Die Kommunikation bleibt auf dem Port 80 des Servers. Ein Wechsel wird nicht vollzogen und ist auch nicht nötig. Denn es muss nichts freigegeben werden. Auch weitere Vergindungsversuche können auf dem Port 80 vom Server entgegen genommen werden.