Socket empfängt Nachricht nicht

********Hallo,
ich habe eine Client-Socket Anwendung geschrieben, bei der der Client einfach nur auf Knopfdruck eine Nachricht an den Server schicken soll. Das klappt auch ganz gut, solange ich „localhost“ verwende. Sobald ich aber meine IP-Addresse oder meine DynDNS Addresse verwende, bekomme ich zwar eine Verbindung, aber die Nachricht wird nicht gesendet… Die Nachricht wird nur gesendet. wenn ich danach den OutputStream schließe. Da das ganze mit localhost funktioniert, muss es ja irgendwie an meiner Verbindung liegen, doch die Firewall auszuschalten hat nichts gebracht. Den Port habe ich natürlich weitergeleitet. Ich benutze den Router W921v der Telekom. Wie gesagt, ich habe ja eine Verbindung, aber die Nachrichten werden nicht gesendet!?

Client:
Java Code:

[ol]
[li]import java.awt.event.ActionEvent; [/li][li]import java.awt.event.ActionListener; [/li][li]import java.io.BufferedWriter; [/li][li]import java.io.IOException; [/li][li]import java.io.OutputStreamWriter; [/li][li]import java.net.InetSocketAddress; [/li][li]import java.net.Socket; [/li][li]import java.net.UnknownHostException; [/li][li] [/li][li]import javax.swing.JButton; [/li][li]import javax.swing.JFrame; [/li][li] [/li][li]public class Client { [/li][li] private Socket socket; [/li][li] public static void main(String[] args) { [/li][li] new Client().connect(); [/li][li] } [/li][li] [/li][li] public void connect() { [/li][li] try { [/li][li] socket = new Socket(); [/li][li] socket.connect(new InetSocketAddress(„localhost“, 5001), 3000); [/li][li] JFrame frame = new JFrame(); [/li][li] frame.setSize(500,500); [/li][li] frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); [/li][li] JButton btn = new JButton(„Klick“); [/li][li] btn.addActionListener(new ActionListener() { [/li][li] public void actionPerformed(ActionEvent e) { [/li][li] try { [/li][li] sendMessage(„Hi“); [/li][li] } catch (IOException e1) { [/li][li] // TODO Auto-generated catch block [/li][li] e1.printStackTrace(); [/li][li] } [/li][li] } [/li][li] }); [/li][li] frame.add(btn); [/li][li] frame.setVisible(true); [/li][li] } catch (UnknownHostException e) { [/li][li] // TODO Auto-generated catch block [/li][li] e.printStackTrace(); [/li][li] } catch (IOException e) { [/li][li] // TODO Auto-generated catch block [/li][li] e.printStackTrace(); [/li][li] } [/li][li] } [/li][li] [/li][li] public void sendMessage(String s) throws IOException { [/li][li] BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); [/li][li] writer.write(s); [/li][li] writer.newLine(); [/li][li] writer.flush(); [/li][li] } [/li][li]} [/li][/ol]

Server:

Java Code:

[ol]
[li]import java.io.BufferedReader; [/li][li]import java.io.InputStreamReader; [/li][li]import java.io.PrintWriter; [/li][li]import java.net.ServerSocket; [/li][li]import java.net.Socket; [/li][li] [/li][li]public class Server { [/li][li] [/li][li] public static void main(String[] args) { [/li][li] new Server().go(); [/li][li] } [/li][li] [/li][li] public void go() { [/li][li] try { [/li][li] @SuppressWarnings(„resource“) [/li][li] ServerSocket serverSocket = new ServerSocket(5001); [/li][li] while(true) { [/li][li] Socket clientSocket = serverSocket.accept(); [/li][li] Thread t = new Thread(new ClientHandler(clientSocket)); [/li][li] t.start(); [/li][li] System.out.println(„Connection“); [/li][li] } [/li][li] } catch(Exception e) { [/li][li] e.printStackTrace(); [/li][li] } [/li][li] } [/li][li] [/li][li] public class ClientHandler implements Runnable { [/li][li] private BufferedReader br; [/li][li] private Socket socket; [/li][li] private PrintWriter pw; [/li][li] [/li][li] public ClientHandler(Socket clientSocket) { [/li][li] try { [/li][li] socket = clientSocket; [/li][li] br = new BufferedReader(new InputStreamReader(socket.getInputStream())); [/li][li] } catch(Exception e) { [/li][li] e.printStackTrace(); [/li][li] } [/li][li] } [/li][li] [/li][li] public void run() { [/li][li] try { [/li][li] String msg; [/li][li] while ((msg = br.readLine()) != null) { [/li][li] System.out.println(msg); [/li][li] } [/li][li] } catch(Exception e) { [/li][li] e.printStackTrace(); [/li][li] } [/li][li] } [/li][li] } [/li][li] [/li][li]} [/li][/ol]
Hoffentlich könnt ihr mir helfen, jede noch so kleine Idee wäre schon etwas :slight_smile:

Viele Grüße

=== fälschlicherweise zusammengeführt ===
// EDIT GAST 2
ich wollte mich eigentlich über fehlerhafte tags aufregen, bis ich auf „erweitert“ geklickt habe
entweder haut das code-plugin nich richtig hin oder der IE11 macht mal wieder irgendwas was nich standard is

zum code selbst

auch wenn das ganze ziemlich wild aussieht ist es syntaktisch korrekt (sonst würde es ja auch nicht über localhost laufen)
ich hätte jetzt zwar in zeile 45 eher ein PrintStream out=new PrintStream(socket.getOutputStream()); genutzt und dann einfach auf out.println() gebaut, aber so wie du es hast geht es ja auch
vor allem weil das flush() ja auch kommt

ich würde testweise einfach mal die länge der nachricht erhöhen
damit meine ich aber nicht nur so ein oder zwei buchstaben, sondern schon mal was richtig großes um die 2kB

es kann sein das dein speedport mist baut und auf ein volles TCP-paket wartet (bei DSL mit ner MTU von 1492 glaub ich)
oder es kann einfach nicht korrekt mit „hairpin-connections“ umgehen, daher einfach mal über n zweiten anschluss (also z.b. von nem freund) aus testen lassen

ich hab mal zum test deinen code compiled und an meinem system getestet

Cable-Modem : Scientific Atlanta SA EPC2203
Router : DIR-100 v1.14DE

und bei mir funktioniert es auch wenn ich mich „extern“ anspreche (so wohl IP als auch DynDNS)
fehler am code also auszuschließen

frag mal google nach deinem router modell

Vielen, vielen Dank! Als ich eine halbe Seite oder so gesendet habe, hat alles funktioniert.
Aber was heißt das jetzt genau? Muss ich so und so viel Bytes in den Buffer schreiben, damit er tatsächlich geflusht wird, oder was läuft da schief? Gibt es eine Möglichkeit das einfach zu umgehen?

Aber schonmal vielen Dank!

Viele Grüße

Schade, schade… Ich war so euphorisch, dass ich nicht gesehen habe, dass ich noch auf “localhost” gestellt habe Mit meiner normalen Addresse funktionert es wieder nicht. Das Komische ist, dass ich schonmal eine Socket-Anweendung geschrieben habe, die funktioniert hat (selber Router, aber neuer PC). Deswegen kann ich eigentlich ausschließen, dass hairpinning nicht unterstützt wird. Ich werde mal zu meinem Router googeln und schauen, ob ich noch was rausfinde.

(Ich bin derselbe wie vorher habe jetzt aber einen Account :))

du könntest ja noch mal folgenden code testen
ob es aber einen unterschied macht kann ich nicht sagen

import java.net.*;
import java.util.*;
public class Server
{
	private ServerSocket serverSocket=null;
	private ArrayList<ClientRunnable> clients=null;
	private static Server server=null;
	public static void main(String[] args)
	{
		System.out.println("start-up chat-server");
		server=new Server();
		server.startup();
		System.out.println("start-up complete");
	}
	private Server()
	{
		System.out.print("try to create ServerSocket ... ");
		try
		{
			serverSocket=new ServerSocket(12345);
		}
		catch(Exception e)
		{
			System.out.println("failed to create ServerSocket");
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("ok");
		clients=new ArrayList<ClientRunnable>();
	}
	private void startup()
	{
		System.out.print("setting up accept-thread ... ");
		Thread thread=new Thread(new Runnable()
		{
			public void run()
			{
				while(true)
				{
					try
					{
						Socket client=serverSocket.accept();
						ClientRunnable clientRunnable=new ClientRunnable(server, client);
						(new Thread(clientRunnable)).start();
						clients.add(clientRunnable);
					}
					catch(Exception e)
					{
						System.out.println("failed to accept client");
						e.printStackTrace();
					}
				}
			}
		});
		System.out.println("ok");
		System.out.println("starting accept-thread");
		thread.start();
	}
	protected void broadcast(String msg)
	{
		for(ClientRunnable client : clients)
		{
			client.send(msg);
		}
	}
	protected void disconnect(ClientRunnable client)
	{
		clients.remove(client);
	}
}```
```import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ClientApplet extends JApplet
{
	private Socket socket=null;
	private BufferedReader in=null;
	private PrintStream out=null;
	private JTextField jTextField=null;
	private JTextArea jTextArea=null;
	public ClientApplet()
	{
		setLayout(new BorderLayout());
		setBackground(Color.LIGHT_GRAY);
		setForeground(Color.BLACK);
	}
	public void init()
	{
		jTextField=new JTextField();
		jTextField.setBackground(Color.WHITE);
		jTextField.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				try
				{
					String msg=jTextField.getText();
					if(!msg.equalsIgnoreCase("DC"))
					{
						out.println(msg);
					}
					jTextField.setText("");
				}
				catch(Exception ex)
				{
					jTextArea.append(ex.toString()+"
");
				}
			}
		});
		jTextArea=new JTextArea();
		jTextArea.setBackground(Color.WHITE);
		jTextArea.setEditable(false);
		this.add("South", jTextField);
		this.add("Center", jTextArea);
	}
	public void start()
	{
		try
		{
			socket=new Socket(this.getCodeBase().getHost(), 12345);
			in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out=new PrintStream(socket.getOutputStream());
		}
		catch(Exception e)
		{
			jTextArea.append(e.toString()+"
");
			jTextArea.append("cant connect to server");
			return;
		}
		jTextArea.append("connected
");
		(new Thread(new Runnable()
		{
			public void run()
			{
				String line="";
				while(true)
				{
					try
					{
						line=in.readLine();
						if(line==null)
						{
							break;
						}
						if(line.equals(""))
						{
							continue;
						}
						jTextArea.append(line+"
");
					}
					catch(Exception e)
					{
						jTextArea.append(e.toString()+"
");
					}
				}
				jTextArea.append("ERROR");
				try
				{
					in.close();
					out.close();
					socket.close();
				}
				catch(Exception e)
				{
					jTextArea.append(e.toString()+"
");
				}
				return;
			}
		})).start();
	}
	public void stop()
	{
	}
	public void destroy()
	{
		try
		{
			out.println("DC");
			in.close();
			out.close();
			socket.close();
		}
		catch(Exception e)
		{
			jTextArea.append(e.toString()+"
");
		}
	}
}```

Nein, hat leider auch nichts gebracht… Aber es kann ja nicht am Code liegen, da dieser mit localhost oder 127.0.0.1 ja funktioniert. Irgendetwas lässt zwar eine Verbindung, aber keine Kommunikation zu. Ich wende miceh gleich mal an die Telekom, ob die vielleicht etwas wissen.

Viele Grüße,
mathiasj

hmm … so aus meiner erfahrung raus dürfte die dtag-hotline dir da nicht wirklich viel zu sagen können

bei so nem problem (oder generell eigentlich allen) kommt ne sog. fehler-vorqualizierung, also erstmal ein grober check um was es überhaupt geht
dabei sind in der regel folgende punkte wichtig

  1. tritt der fehler nur unter einer bestimmten oder auch anderen konfigurationen auf (also auch mal pc und router austausch)
  2. ist der fehler nur lokal oder auch extern ? (einfach möglichkeit : du machst den server und jemand anders baut “von außen” ne verbindung auf, danach das ganze vice-versa)
  3. sind bestimmte fehler zu erkennen ? (einfachstes beispiel : mit wireshark gucken ob java die daten auch wirklich raussendet oder ob halt nichts ankommt weil erst gar nichts gesendet wurde)
  4. wie siehts mit anderen programmen aus ?
  5. sicherheitssoftware / firewall

man könnte die liste noch weiter führen …

fakt ist : nur durch sehr viel ausprobieren hat man eine chance rauszubekommen woran es liegen KÖNNTE
und da du ja sagtest das es mit einem anderen rechner funktioniert hat bleibt nicht viel übrig außer die config des rechners und ggf einfach falsche weiterleitung

Oft hat auch ein Router, die Einstellung das er alles ohne Anfrage vom Internet kommende blockt, jenachdem wie dein Paket zu dir zurückkommt kann es auch an so einer Einstellung liegen.
Verwendest du deine Ip-Adresse bei euch im Netzwerk, oder die die du im Internet hast, die sind bei mir zum Beispiel auch verschieden. Um die beiden zu vergleichen, es gibt einige Web-Seiten die dir deine Ip-Adresse mitteilen, beispielsweise: http://www.wieistmeineip.de/

@cresse Also mit der internen IP (also die die ich in meinem Netzwerk habe) funktioniert es einwandfrei, sowohl auf dem PC, auf dem der Server läuft, als auch auf anderen PCs im Netzwerk.
@Unregistered

  1. Auch mit dem Client auf einem anderen PC tritt der Fehler auf; Router kann ich leider nicht austauschen
  2. Extern werde ich nachher probieren, wenn ein Freund Zeit hat
  3. WireShark verstehe ich irgendwie überhaupt nicht… Ich wähle Drahtlose Verbindung aus (ich habe einen WLAN Stick) und klicke auf Start, dann wird mir ein Fenster angezigt: Ich verstehe jetzt nicht wirklich, wo ich ausgehende Nachrichten sehen kann.
  4. Was meinst du mit anderen Programmen? Also ich kann z.B. ganz normal Online Spiele spielen
  5. Bei der Firewall auf Windows habe ich javaw.exe überall zugelassen, AVG Firewall habe ich nicht mal installiert. Leider hat mein Router eine Firewall, die man nicht konfigurieren kann, aber wie gesagt, es hat mit dem selben Router schonmal geklappt

Viele Grüße,
mathiasj

*** Edit ***

Also extern klappt alles (gerade ausprobiert). Ändert sich denn eine interne IP Addresse? Denn sonst könnte ich ja einfach für meinen PC eine Version mit der internen IP Addresse erstellen, und sonst eine “normale” Version veröffentlichen. Aber vielen vielen Dank, ihr habt mir schon sehr geholfen!

Viele Grüße,
mathiasj

ICh würde versuchen eine feste Ip Adresse mit in ein Programm zu setzen, da man nicht vermeiden kann, das sich diese Adressen ändern (im Heimnetzwerk geht das vielleciht noch sonst dürfte das schwierig werden). Du könntest als einfach Lösung die Ip Adresse z.B. in einer Textdatei abspeichern und auslesen, dann kannst du die einfach ändern und anpassen

Das wäre an sich eine gute Idee, aber da ich das ganze auf meinem Tablet realisieren will klappt das ganze nicht. Ich gehe jetzt aber im Netzwerk durch den Computernamen in Verbindung. Vielen, vielen Dank, ihr habt mir wirklich sehr geholfen! Danke!

Viele Grüße,
mathiasj

EDIT: Ich kann das Thema nicht als gelöst markieren, da ich ja als Gast den ersten Beitrag verfasst habe. Bitte kümmert euch darum, Moderatoren!

du musst in wireshark im filter als protokoll TCP und als port dann den gewählten port auswählen damit du auch nur den traffic mitliest den du willst
wenn alles korrekt läuft müssten entsprechende pakete gelistet werden
wenn aber nicht mal ein paket rausgeht liegt es an java
wenn das paket rausgeht aber kein syn-ack paket zurück kommt könnte es am router leigen

und auch innerhalb des netzwerkes solltest du IMMER mit IP-adressen arbeiten, WINS-namen sollte man vermeiden