Socket (Client) dauerhaft aktiv?

Extremefall

Bekanntes Mitglied
Hallo,
Ich habe momentan folgende Clientenklasse:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class Client implements ActionListener{
    static Socket clientSocket;
 
    public static void connectToSoccet(InetAddress IP, int port) {
        try {
            Socket clientSocket = new Socket(IP, port);
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(
                    clientSocket.getOutputStream()));
            printWriter.println("hhi");
            printWriter.flush();
            printWriter.println("duie");
            printWriter.flush();
           
			clientSocket.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
           e.printStackTrace();
        }
    }

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
    
}
Nun wird der Client ja nach dem Senden geschlossen. Wie kann ich es schaffen, dass ich den Client einfach aufrecht erhalte und somit nicht schließe? Denn wenn ich clientSocket.close() entferne, dann gibt es den Fehler Connection Reset...

Wie kann ich das Problem lösen? Und wie kann ich mittels ActionListener Daten senden?
 

andre111

Bekanntes Mitglied
Wenn es dir nur ums Daten senden geht, dann erzeuge einen eigenen Thread, der in einer Dauerschleife überprüft ob Daten zum Senden vorhanden sind. Falls dies so ist können sie gesendet werden. Die Daten selber könntest du in einer BlockingQueue (z. B. LinkedBlockingQueue) speichern.
 

Michael...

Top Contributor
Unabhängig vom dem Problem würde ich, das static von Socket und von connectToSocket rausschmeißen. Schließlich soll sich ja das Client Objekt eine Socketverbindung aufbauen und nicht die Klasse.
Ob man dann das Socket tatsächlich als Instanzvariable benötigt hängt von der Umsetzung ab (man sollte den Gültigkeitsbereich von Variablen möglichst klein halten).

Definitiv würde ich den Outstream bzw. den Writer darauf als Instanzvariable definieren, so dass man in der actionPerformed ein println(...) darauf aufrufen kann. Besser wäre es eine send - Methode zu definieren und diese in der actionPerformed aufzurufen, das hält die Möglichkeiten zu senden offen. Ein flush() sollte beim PrintWriter nicht notwendig sein - sofern ich die Funktionsweise des PrintWriters korrekt im Kopf habe.

Falls der Client gleichzeitig auch noch eingehende Nachrichten empfangen soll, muss der Inputstream in einem separaten Thread ausgelesen werden, da das Lesen zunächst einmal blockierend ist.
 

Extremefall

Bekanntes Mitglied
Wie kann ich denn jetzt den Clienten dauerhaft am "Leben" lassen, sodass ich jederzeit nachrichten versende? Soll ich einfach einen Thread laufen lassen? Wieso wird bei meinem Versuch dann nichts gesendet bzw. kommt nichts beim Server an?

Wie kann ich denn mit dem ActionListener den Wert in den Thread übertragen? Also wie kann ich etwas über den ActionListener senden?

Mein Code:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
 
public class Client implements Runnable,ActionListener{
    private PrintWriter printWriter;
    private OutputStreamWriter outputstreamwriter;
    private OutputStream outputstream;
    private Socket clientSocket;
    public void connectToSoccet(InetAddress IP, int port) {
            clientSocket = null;
            try {
				clientSocket = new Socket(IP, port);
				outputstream = clientSocket.getOutputStream();
				outputstreamwriter = new OutputStreamWriter(outputstream);
				printWriter = new PrintWriter(outputstreamwriter);
            printWriter.println("duie");
            printWriter.flush();
            Thread sender = new Thread(this);
            sender.start();
            printWriter.println("tow");
            printWriter.flush();
			clientSocket.close();

				}
            
			catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}      
    }
    public void closeClient(){
		
    }
	@Override
	public void actionPerformed(ActionEvent e) {
if (e.getSource()==GUI.send){
	printWriter.println("du");
}
	}
	@Override
	public void run() {
		System.out.println("do");
        printWriter.println("zweiter");
        printWriter.flush();		
	}
	
    
}
 

andre111

Bekanntes Mitglied
Ok, im Nachhinein ist mir aufgefallen, dass der extra Thread wohl gar nicht mal notwendig ist. Genau genommen hast du als Membervariable das Socket, mit dem du eine Verbindung zum Server herstellst. Diese darfst du jedoch nicht sofort wieder per close() schließen. In actionPerformed() kannst du dann Daten versenden indem du den OutputStream des bereits verbundenen Sockets verwendest. Schließen kannst du die Verbindung am Ende wie es dir beliebt (z. B. indem du einen WindowListener am Fenster registrierst, der dies übernimmt sobald du das Fenster schließt).
 

Extremefall

Bekanntes Mitglied
Hi,
kannst du mir vielleicht sagen, was ich mit dem ActionListener jetzt falsch mache?

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
 
public class Client implements Runnable,ActionListener{
    private PrintWriter printWriter;
    private OutputStreamWriter outputstreamwriter;
    private OutputStream outputstream;
    private Socket clientSocket;
    String al_text;
    private JButton send;
    public Client(){
    	JFrame frame = new JFrame();
    	send = new JButton("Senden");
    	send.addActionListener(this);
    	frame.add(send);
    	frame.setVisible(true);
    }
    public void connectToSoccet(InetAddress IP, int port) {
            clientSocket = null;
            try {
				clientSocket = new Socket(IP, port);
				outputstream = clientSocket.getOutputStream();
				outputstreamwriter = new OutputStreamWriter(outputstream);
				printWriter = new PrintWriter(outputstreamwriter);
            printWriter.println("duie");
            printWriter.flush();
            Thread sender = new Thread(this);
            sender.start();
            printWriter.println("tow");
            printWriter.flush();
            
				}
            
			catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}      
    }
    public void closeClient(){
		
    }
	@Override
	public void actionPerformed(ActionEvent e) {
if (e.getSource()==send){
	printWriter.println("Message");
    printWriter.flush();
	System.out.println("sende");
}
	}
	
	public void run() {
		while (true){
		if(clientSocket.isConnected()){
        printWriter.println("HI");
        printWriter.flush();
        }
		try {
			clientSocket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}

    
}
 

andre111

Bekanntes Mitglied
Der ActionListener selber ist soweit richtig, aber in deinem extra Thread (den du nicht mehr benötigst), lässt du das Socket sofort wieder schließen. Dementsprechend können im ActionListener später natürlich auch keine Daten mehr versendet werden.
Den Thread den du startest und die run()-Methode benötigst du nicht.
 

andre111

Bekanntes Mitglied
Folgendermaßen sollte es funktionieren (nicht getestet), ich hoffe es ist soweit verständlich.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class Client implements ActionListener{
    private PrintWriter printWriter;
    private OutputStreamWriter outputstreamwriter;
    private OutputStream outputstream;
    private Socket clientSocket;
    String al_text;
    private JButton send;
    public Client(){
        JFrame frame = new JFrame();
        send = new JButton("Senden");
        send.addActionListener(this);
        frame.add(send);
        frame.setVisible(true);
    }
    public void connectToSoccet(InetAddress IP, int port) {
            clientSocket = null;
            try {
                clientSocket = new Socket(IP, port);
                outputstream = clientSocket.getOutputStream();
                outputstreamwriter = new OutputStreamWriter(outputstream);
                printWriter = new PrintWriter(outputstreamwriter);
            printWriter.println("duie");
            printWriter.flush();
            printWriter.println("tow");
            printWriter.flush();
            
                }
            
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      
    }
    public void closeClient(){
        
    }
    @Override
    public void actionPerformed(ActionEvent e) {
if (e.getSource()==send){
    printWriter.println("Message");
    printWriter.flush();
    System.out.println("sende");
}
    }
    
    }
 
    
}
 
M

Marcinek

Gast
Kann man nach knapp 300 Postings von dir erwarten, dass du deine Probleme im ganzen schilderst?

Ich finde es extrem frustrierend, dass hier so viele Leute ihre Zeit opfern um dir zu helfen du aber kaum fortschritte machst und jeden kleinen Fehler hier postest.

Hier sind btw auch hunderte Postings, die sich mit dem Erstellen eines Chats beschäftigen. Auch ganze PDFs wo alles kleinig genau beschrieben wird. Wieso liest du dir das nicht durch?

---------

Zum Problem: Was passiert den? Nullpointer? Wird die methode "connectToSoccet" auch iwo aufgerufen oder steht sie nur da?

Male dir doch mal auf dem Blatt papier auf was in welcher Reihenfolge passieren soll.

1. Verbindungsaufbau
2. Knopfdrücken
3. Senden
 

Extremefall

Bekanntes Mitglied
Vielen Dank für eure Hilfe. Es geht nun. Ich habe die Programmstruktur etwas geändert. Ich habe die Methode connectToSoccet entfernt und als Konstruktor der Klasse Client genutzt. Dann habe ich noch die GUI ausgelagert. Es klappt alles.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Socket Kommunikation Java Basics - Anfänger-Themen 16
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
G Socket Verbindung aufbauen Java Basics - Anfänger-Themen 11
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
S Asynchrone Socket-Abfragen Java Basics - Anfänger-Themen 5
Meeresgott OOP Socket Verbindung richtig Kapseln Java Basics - Anfänger-Themen 0
O Socket by reference übergeben Java Basics - Anfänger-Themen 0
J Socket schließen - Ist eine SocketException unumgänglich? Java Basics - Anfänger-Themen 4
D Socket ---> Server Socket worauf muss ich achten? Java Basics - Anfänger-Themen 2
N Socket-Programmierung Java Basics - Anfänger-Themen 4
M wait/notify bei Socket Java Basics - Anfänger-Themen 4
B Input/Output Socket I/O - outputStream.write(-1) Java Basics - Anfänger-Themen 2
B Socket OutputStream Java Basics - Anfänger-Themen 17
B Socket Kommunikation in beide Richtungen Java Basics - Anfänger-Themen 12
B Socket, args Java Basics - Anfänger-Themen 22
L Socket in JTextArea Java Basics - Anfänger-Themen 9
T Input/Output Zwei InputStreams von einem Socket Java Basics - Anfänger-Themen 2
B Socket Problem Java Basics - Anfänger-Themen 3
T socket.close aber verbindung besteht noch Java Basics - Anfänger-Themen 4
F Buffered Image über Socket versenden Java Basics - Anfänger-Themen 6
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
B Threads Interrupt während Socket.read()? Java Basics - Anfänger-Themen 3
M Versand von Nachrichten via Socket (Delay) Java Basics - Anfänger-Themen 21
F socket-problem Java Basics - Anfänger-Themen 6
E Input/Output Socket bekommt keine Verbindung bei funktionierendem Fremdziel Java Basics - Anfänger-Themen 2
D Java - Socket - Datenübertragung Java Basics - Anfänger-Themen 18
E Input/Output einfachen Socket für XML-Anfragen bauen Java Basics - Anfänger-Themen 13
R Cannot find a free socket for the debugger Java Basics - Anfänger-Themen 6
F Socket Kommunikation Java Basics - Anfänger-Themen 4
M "Connection reset" gbxRemote Socket Java Basics - Anfänger-Themen 9
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
L FTP per Socket Java Basics - Anfänger-Themen 2
M Audio Stream läuft auf :connection abort: socket write error Java Basics - Anfänger-Themen 2
J Socket - BufferedReader lese Problem Java Basics - Anfänger-Themen 2
M Socket Server Java Basics - Anfänger-Themen 9
N Socket Problem? Java Basics - Anfänger-Themen 9
G Socket erstellen dauert sehr lange. Java Basics - Anfänger-Themen 4
H Java Socket Java Basics - Anfänger-Themen 14
A XML Daten über Socket Java Basics - Anfänger-Themen 3
I Allgemeine fragen zu Socket server Java Basics - Anfänger-Themen 6
C Socket Programmierung Java Java Basics - Anfänger-Themen 4
F Socket Instanz auf Klasse welche von Socket erbt zuweisen Java Basics - Anfänger-Themen 3
ven000m Wieso antwortet mein Server nicht mehr (Socket Anwendung) Java Basics - Anfänger-Themen 2
J Daten von einem (char*)Socket einlesen. Java Basics - Anfänger-Themen 3
S Java Socket Java Basics - Anfänger-Themen 3
K Frage zu SdtOut streams bzw. Socket Programmierung Java Basics - Anfänger-Themen 3
M HTTP-Anfragen und Socket Java Basics - Anfänger-Themen 2
A von Socket-Stream lesen Java Basics - Anfänger-Themen 4
M Ändern einer Socket-Eigenscheft aus einem modalen Dialog? Java Basics - Anfänger-Themen 6
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Unerwartetes Verhalten bei Client Server Chat App Java Basics - Anfänger-Themen 12
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
I Client ObjectInputStream error... Java Basics - Anfänger-Themen 5
W Client verbindet sich nicht Java Basics - Anfänger-Themen 14
B Email Client in der eigenen Software einbauen Java Basics - Anfänger-Themen 3
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
E SocketServer/Client stürzt ab. Address already in use. Java Basics - Anfänger-Themen 2
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
E MCLauncher eigener Client workt nicht? Java Basics - Anfänger-Themen 4
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I Unique client information in WebApp Java Basics - Anfänger-Themen 3
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
Joew0815 Error org.apache.xmlrpc.client.XmlRpcClientConfigImpl.setUserAgent Java Basics - Anfänger-Themen 2
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
O Verriegeln, aber wo? Finde den Client der zu schließem ist. Java Basics - Anfänger-Themen 0
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
T Buffererwriter keine Exception obwohl Client weg Java Basics - Anfänger-Themen 2
E Client Server Java Basics - Anfänger-Themen 12
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
O Server Client Problem Java Basics - Anfänger-Themen 2
N Client soll mehrere Antworten von Servern gleichzeitig empfangen Java Basics - Anfänger-Themen 8
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
T Client-Fenster bei Aufruf unvollständig Java Basics - Anfänger-Themen 12
E Senden von Objects an Client. Variablenwerte kommen nicht an Java Basics - Anfänger-Themen 5
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
E Client hilfe!!! Java Basics - Anfänger-Themen 7
B RMI - Fehlermeldung auf dem Client Java Basics - Anfänger-Themen 6
X Applet - Client/Server Java Basics - Anfänger-Themen 2
E Client ergibt NULL? Java Basics - Anfänger-Themen 24
E HTTP Client - Login durchführen? Java Basics - Anfänger-Themen 4
L Ip-Adresse für Client Java Basics - Anfänger-Themen 14
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
L Wegwerf Client Java Basics - Anfänger-Themen 26
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
L Client aktualisieren Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben