Socket Chat entwickeln mit Java Server Client

Hannah *

Mitglied
Hallo

ich bin Neu hier, habe mir das Java programmieren weitestgehend selbst bei gebracht und bin sicher kein Profi.
Ich versuche gerade ein Chat zu programmieren mit Java in Eclipse. Die GUI habe ich mit Window Builder gemacht. Das Netzwerk mit Server habe ich nach einer online Anleitung nach programmiert, allerdings wurde die GUI dort nicht mit einem Window Builder erstellt. Leider funktioniert die Client Server Verbindung nicht. Der Server müsste so einigermaßen laufen. Die Threads beim Client sind glaube ich nicht ganz so richtig.

Gibt es vielleicht jemand der mich bei meinem Projekt einbisschen untersützen kann?

Ich bin super dankbar wenn mir jemand bald helfen kann.

Hannah
 

Anhänge

Im Layout_2 hast du zwei Fehler:

1. du hast den Aufruf von connectToServer auskommentiert, der ja die Verbindung vom Client zum Server herstellt
2. du überschattest/verdeckst Instanzvariablen, weil du sie mit demselben Namen nochmal als lokale Methodenvariablen deklarierst, auf die du aber später als Instanzvariablen wieder zugreifst und sie dann null sind, z.B. `txtArea_Ausgabe` und `txtArea_Eingabe`.

Anschliessend funktioniert es (solange du ein 9 Zeichen langes Passwort eingegeben hast).

Kleiner Tipp am Rande: Drücke mal bitte die Tastenkombinationen Strg+Shift+F und anschliessend Strg+Shift+O.
 
[CODE lang="java" title="Klasse Client"]import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class Client {

private JFrame frame;
private JTextField txtField_Chatname;
private JTextField txtField_Passworteingabe;
private JTextField txtField_Userschreibt;
private JTextField txtField_Passwortabfrage;

private JTextArea txtArea_Ausgabe;
private JScrollPane scrollPane_Ausgabe;
private JTextArea txtArea_Eingabe;
private JScrollPane scrollPane_Eingabe;

private JButton btnChaten;
private JButton btnSend;
private JButton btnSendSave;
private JButton btnPasswortprüfen;
//-----------------------------------------------------------------
String name;
String nachricht;
String passwort;
String passworttest;
String sicherheit;
//------------------------------------------------------------------
Socket client;
PrintWriter writer;
BufferedReader reader;
//-------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------
public static void main(String[] args)
{
GUI();
}


public static void GUI()
{
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
try
{
Client window = new Client();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});

}

// Client Verbindung zum Server
public boolean connectToServer()
{
try
{
client = new Socket("127.0.0.1", 5555); // Erzeuge Verbindung zu Server
reader = new BufferedReader(new InputStreamReader(client.getInputStream())); // InputStream
writer = new PrintWriter(client.getOutputStream()); // OutputStream
txtArea_Ausgabe.append("Verbindung hergestellt\n"); // ausgabe Verbindung wurde hergestellt.

return true;
}
catch(Exception e)
{
txtArea_Ausgabe.append("Verbindung konnte nicht hergestellt werden\n"); // if(!connectToServer())
//e.printStackTrace();

return false;
}
}

// Message wird als ein String an den Server gesendet
public void sendMessageToServer()
{
String message = new String ();
message = sicherheit + "|" + name + "|" + passwort + "|" + nachricht ;
writer.println(message); // zeile wird an server gesendet
writer.flush();
}

// Message wird vom Server empfangen
public class MessagesFromServerListener implements Runnable
{
@Override
public void run()
{
String nachrichtAus = null;

try
{
while((nachrichtAus = reader.readLine()) != null)
{
appendTextMessages(nachrichtAus);
txtArea_Ausgabe.setCaretPosition(txtArea_Ausgabe.getText().length());
}
}
catch (IOException e)
{
//txtArea_Ausgabe.append("Nachricht konnte nicht empfangen werden!");
//e.printStackTrace();
}
}
}

// Text wird dem Chatverlauf hinzugefügt
public void appendTextMessages(String nachrichtAus)
{
// Test
//txtArea_Ausgabe.append("\n"+ nachrichtAus);

//writer.println(sicherheit + "|" + name + "|" + passwort + "|" + nachricht );
// hier müssen die Ausgaben abgefragt werden

String sicherheitAus;
String nameAusgabe;
String passwortAusgabe;
String nachrichtAusgabe;

String str = nachrichtAus;
String split[] = str.split("\\|");

sicherheitAus = split[0] ;
nameAusgabe = split[1] ;
passwortAusgabe = split[2];
nachrichtAusgabe = split[3] ;

// Test
/*
System.out.print(sicherheitAus + "\n");
System.out.print(nameAusgabe + "\n");
System.out.print(passwortAusgabe + "\n");
System.out.print(nachrichtAusgabe + "\n");
txtArea_Ausgabe.append(nameAusgabe + ":" + nachrichtAusgabe +"\n");
*/

if (sicherheitAus.contains("0"))
{
txtArea_Ausgabe.append( nameAusgabe + " : " + nachrichtAusgabe + "\n");
}

else if (sicherheitAus.contains("1"))
{
txtField_Userschreibt.setText(nameAusgabe);

btnPasswortprüfen.addActionListener(new btnPasswortprüfenListener());

// frage btnPasswortprüfenListener nach Passwort!


txtArea_Ausgabe.append( nameAusgabe + " : " + nachrichtAusgabe + "\n" );


if (passwortAusgabe == passworttest)
{
//txtArea_Ausgabe.append( nameAusgabe + " : " + nachrichtAusgabe + "\n");
}
else
{
txtArea_Ausgabe.append("falsches Passwort für Save Chat Nachricht von " + nameAusgabe + "\n" );
}


}

}

//-----------Listener Buttons----------------------------------------------------------------------------------------------------------------------

// Sucht Chatusername
public class btnChatenListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
name = txtField_Chatname.getText();
}
}

// Sendebutton für normale Nachrichten
public class btnSendListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
nachricht = txtArea_Eingabe.getText();
passwort = txtField_Passworteingabe.getText();
sicherheit = "0";

sendMessageToServer(); // nachricht an Server senden
txtArea_Eingabe.setText(null);

if (passwort.length() == 9)
{
// führe aus
// sende an server user, nachricht, passwort
//txtArea_Ausgabe.append(name +": " + nachricht + "\n");
}
}
}

// Sendebutton für sichere Nachrichten
public class btnSendSaveListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
nachricht = txtArea_Eingabe.getText();
passwort = txtField_Passworteingabe.getText();
sicherheit = "1";

if (passwort.length() == 9)
{
// führe aus
// sende an server user, nachricht, save passwort
//txtField_Userschreibt.setText(name);
sendMessageToServer(); // nachricht an Server senden
txtArea_Eingabe.setText(null);
}
else
txtField_Passworteingabe.setToolTipText("Das Passwort muss genau 9 Zeichen haben");
}
}

// Passwortprüfen
public class btnPasswortprüfenListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
passworttest = txtField_Passwortabfrage.getText();

}
}


//-----------------------------------------------------------Layout------------------------------------------

public Client()
{
initialize();
}

public void initialize()
{
// Neues Fenster
frame = new JFrame();

frame.getContentPane().setBackground(new Color(188, 212, 230)); // Farbe Hintergrund
frame.setBounds(100, 100, 750, 800); // Größe Fenster
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Schließen wenn das Fenster geschloßen wird
frame.getContentPane().setLayout(null);

//--------------Titel--------------------------------------------------------

JLabel lblSaveChat = new JLabel("Projekt Save Chat");
lblSaveChat.setFont(new Font("Arial", Font.BOLD, 12));
lblSaveChat.setBounds(28, 11, 102, 14);
frame.getContentPane().add(lblSaveChat);

//-------------Chatverlauf--------------------------------------------------------------------------

scrollPane_Ausgabe = new JScrollPane();
scrollPane_Ausgabe.setBounds(28, 36, 442, 474);
frame.getContentPane().add(scrollPane_Ausgabe);

txtArea_Ausgabe = new JTextArea();
txtArea_Ausgabe.setEditable(false);
txtArea_Ausgabe.setBorder(null);
txtArea_Ausgabe.setToolTipText("Chatverlauf");
txtArea_Ausgabe.setLineWrap(true);
scrollPane_Ausgabe.setViewportView(txtArea_Ausgabe);

//-----------Client-----------------------------------------------------------------

JLabel lblname = new JLabel("Chatname eingeben");
lblname.setFont(new Font("Arial", Font.PLAIN, 12));
lblname.setBounds(502, 36, 198, 14);
frame.getContentPane().add(lblname);

txtField_Chatname = new JTextField();
txtField_Chatname.setToolTipText("Geben Sie hier Ihren Namen ein ");
txtField_Chatname.setBounds(502, 56, 96, 20);
frame.getContentPane().add(txtField_Chatname);
txtField_Chatname.setColumns(10);

btnChaten = new JButton("chat on");
btnChaten.setFont(new Font("Arial", Font.PLAIN, 12));
btnChaten.setBackground(new Color(0, 255, 255));
btnChaten.setToolTipText("Drücken Sie hier um dem Chat beizutreten");
btnChaten.setBounds(611, 55, 89, 23);
frame.getContentPane().add(btnChaten);

// Aktion
btnChaten.addActionListener(new btnChatenListener());

//--------------Texteingabe-----------------------------------------------------------------------------

JLabel lblTexteingabe = new JLabel("Texteingabe");
lblTexteingabe.setFont(new Font("Arial", Font.PLAIN, 12));
lblTexteingabe.setBounds(29, 521, 75, 14);
frame.getContentPane().add(lblTexteingabe);

scrollPane_Eingabe = new JScrollPane();
scrollPane_Eingabe.setBounds(28, 546, 442, 83);
frame.getContentPane().add(scrollPane_Eingabe);

txtArea_Eingabe = new JTextArea();
txtArea_Eingabe.setText("Deine Nachricht");
txtArea_Eingabe.setBorder(null);
txtArea_Eingabe.setToolTipText("Geben Sie hier Ihre Nachricht ein...");
txtArea_Eingabe.setLineWrap(true);
scrollPane_Eingabe.setViewportView(txtArea_Eingabe);

//---------Passworteingabe----------------------------------------------------------------------------------

JLabel lblPasswort = new JLabel("Passwort (9 Zeichen)");
lblPasswort.setFont(new Font("Arial", Font.PLAIN, 12));
lblPasswort.setBounds(28, 669, 124, 14);
frame.getContentPane().add(lblPasswort);

txtField_Passworteingabe = new JTextField();
txtField_Passworteingabe.setToolTipText("Geben Sie hier ein Passwort mit genau 9 Zeichen ein");
txtField_Passworteingabe.setBounds(28, 694, 113, 20);
frame.getContentPane().add(txtField_Passworteingabe);
txtField_Passworteingabe.setColumns(10);

//--------Senden------------------------------------------------------------------------------------------------

btnSend = new JButton("Send");
btnSend.setBackground(new Color(255, 240, 245));
btnSend.setFont(new Font("Arial", Font.PLAIN, 12));
btnSend.setForeground(new Color(0, 0, 0));
btnSend.setToolTipText("Nachricht wird an alle User zugestellt");
btnSend.setBounds(209, 676, 113, 23);
frame.getContentPane().add(btnSend);

JLabel lblSendnormal = new JLabel("Nachricht wird an alle User zugestellt");
lblSendnormal.setFont(new Font("Arial", Font.PLAIN, 11));
lblSendnormal.setBounds(344, 679, 185, 14);
frame.getContentPane().add(lblSendnormal);

// Aktion Normaler Sendeknopf
btnSend.addActionListener(new btnSendListener());

//-------Sicher Senden---------------------------------------------------------------------------------------------

btnSendSave = new JButton("Send Save");
btnSendSave.setBackground(new Color(216, 191, 216));
btnSendSave.setFont(new Font("Arial", Font.PLAIN, 12));
btnSendSave.setToolTipText("User muss das Passwort eingeben um die Nachricht zu sehen");
btnSendSave.setBounds(209, 710, 113, 23);
frame.getContentPane().add(btnSendSave);

JLabel lblSendSave = new JLabel("User muss das Passwort eingeben um die Nachricht zu sehen");
lblSendSave.setFont(new Font("Arial", Font.PLAIN, 11));
lblSendSave.setBounds(344, 710, 316, 20);
frame.getContentPane().add(lblSendSave);

// Aktion SaveSendeknopf
btnSendSave.addActionListener(new btnSendSaveListener());

//-----------Passwortprüfung----------------------------------------------------------------------------------

JLabel lblPasswortabfage = new JLabel("Save Chat Passwortabfrage");
lblPasswortabfage.setFont(new Font("Arial", Font.PLAIN, 12));
lblPasswortabfage.setBounds(502, 353, 185, 14);
frame.getContentPane().add(lblPasswortabfage);

txtField_Userschreibt = new JTextField();
txtField_Userschreibt.setBounds(502, 378, 113, 20);
frame.getContentPane().add(txtField_Userschreibt);
txtField_Userschreibt.setColumns(10);

JLabel lblUserPasswortabfrage = new JLabel("... schreibt, geben Sie das Passwort ein um zulesen");
lblUserPasswortabfrage.setBounds(502, 409, 211, 14);
frame.getContentPane().add(lblUserPasswortabfrage);

txtField_Passwortabfrage = new JTextField();
txtField_Passwortabfrage.setToolTipText("Geben Sie hier das Passwort ein, das Ihr Chatpartner Ihnen mitgeteilt hat");
txtField_Passwortabfrage.setBounds(564, 434, 149, 20);
frame.getContentPane().add(txtField_Passwortabfrage);
txtField_Passwortabfrage.setColumns(10);

btnPasswortprüfen = new JButton("Pruefen");
btnPasswortprüfen.setBackground(new Color(216, 191, 216));
btnPasswortprüfen.setFont(new Font("Arial", Font.PLAIN, 12));
btnPasswortprüfen.setToolTipText("Klicken Sie hier, damit Sie die Nachricht bekommen");
btnPasswortprüfen.setBounds(624, 465, 89, 23);
frame.getContentPane().add(btnPasswortprüfen);

// Aktion Passwortprüfen
btnPasswortprüfen.addActionListener(new btnPasswortprüfenListener());


//-------Frage ob Server kontakt besteht------------------------------------------------------------------------------------

if(!connectToServer())
{
// Connect-Label anzeigen ob verbunden oder nicht...
}

//-----Thread.....................................................................................................................

Thread t = new Thread(new MessagesFromServerListener());
t.start();

frame.getContentPane().add(scrollPane_Ausgabe);
frame.getContentPane().add(scrollPane_Eingabe);
frame.getContentPane().add(txtField_Chatname);
frame.getContentPane().add(txtField_Passworteingabe);
frame.getContentPane().add(txtField_Passwortabfrage);
frame.getContentPane().add(txtField_Userschreibt);
frame.getContentPane().add(btnChaten);
frame.getContentPane().add(btnSend);
frame.getContentPane().add(btnSendSave);
frame.getContentPane().add(btnPasswortprüfen);

}
}

//-------------ENDE-------------------------------------------------------------------------------------------------------
[/CODE]
 

Neue Themen


Zurück
Oben