Compare commits

...
8 Commits
Author SHA1 Message Date
Js_Sman a25f1617c8 Bisschen aufgeräumt und Logger aktualisiert 2023-12-12 20:23:25 +01:00
Js_Sman 72b3888984 Funktioniert (Nicht schön aber selten) 2023-12-12 19:35:05 +01:00
schuhmannje82308 109123a241 Zwischenstand 2023-12-12 16:47:01 +01:00
schuhmannje82308 7cd668f8ce Adapter 2023-12-12 13:21:13 +01:00
schuhmannje82308 320c6041b7 Transmitter als Abstrakte Klasse 2023-12-12 11:47:07 +01:00
schuhmannje82308 83ddb02477 Client umgebaut 2023-12-12 11:22:16 +01:00
schuhmannje82308 8a7019bfca Server umgebaut 2023-12-12 10:48:57 +01:00
schuhmannje82308 0853e26034 Server/Client verbindung durch rBtn 2023-12-11 18:05:46 +01:00
12 changed files with 422 additions and 193 deletions

No files matched your search

-79
View File
@@ -1,79 +0,0 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package ChatProgramm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.*;
/**
* Builder Class
* @author le
*/
public class Client
{
private static Logger lg = Logger.getLogger("netz");
private static final int PORT = 35000; //lt. iana port > 2¹⁵
private static final String IP = "127.0.0.1";
public Client() throws IOException
{
lg.info("Client: versuche zu verbinden");
Socket s = new Socket(IP, PORT); // ACHTUNG blockiert!
lg.info("Client: Verbindung akzeptiert");
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
//Umwandlung der Byteströme
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
OutputStreamWriter osr = new OutputStreamWriter(os, "UTF-8");
//Puffer
BufferedReader in = new BufferedReader(isr);
//BufferedWriter out = new BufferedWriter(osr);
//besser
PrintWriter out = new PrintWriter(osr);
lg.info("Client: Streams erfolgreich initialisiert");
lg.info("Client: sende Textnachricht");
out.println("Hallo Du Server - ich bin ein Client");
out.flush();
lg.info("Client: warte auf Serverantwort");
String nachricht = in.readLine(); // ACHTUNG blockiert
lg.info("Client: Serverbestätigung erhalten");
lg.info("Client: fertig");
in.close();
out.close();
s.close();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
try
{
new Client();
}
catch (IOException ex)
{
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
-81
View File
@@ -1,81 +0,0 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package ChatProgramm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.*;
/**
* Builder Class
* @author le
*/
public class Server
{
private static Logger lg = Logger.getLogger("netz");
private static final int PORT = 35000; //lt. iana port > 2¹⁵
public Server() throws IOException
{
ServerSocket sSocket = new ServerSocket(PORT);
lg.info("Server: warte auf Verbindung");
Socket s = sSocket.accept(); // ACHTUNG blockiert!
lg.info("Server: Verbindung akzeptiert");
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
//Umwandlung der Byteströme
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
OutputStreamWriter osr = new OutputStreamWriter(os, "UTF-8");
//Puffer
BufferedReader in = new BufferedReader(isr);
//BufferedWriter out = new BufferedWriter(osr);
//besser
PrintWriter out = new PrintWriter(osr);
lg.info("Server: Streams erfolgreich initialisiert");
lg.info("Server: warte auf Textnachricht");
String nachricht = in.readLine(); // ACHTUNG blockiert
lg.info("Server: Nachricht erhalten");
System.out.println("Server: NACHRICHT = " + nachricht);
// ACHTUNG: blockiert NICHT!!!!
out.println("Server an Client: Nachricht erhalten");
out.flush(); // wichtig
lg.info("Server: fertig");
in.close();
out.close();
s.close();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
try
{
new Server();
}
catch (IOException ex)
{
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
+3 -2
View File
@@ -19,9 +19,10 @@ public class Start
{ {
public Start() public Start()
{ {
Transmitter transmitter = new Transmitter(); //Transmitter transmitter = new Transmitter();
ChatView view = new ChatView(); ChatView view = new ChatView();
CommandController controller_commands = new CommandController(view, transmitter); //CommandController controller_commands = new CommandController(view, transmitter);
CommandController controller_commands = new CommandController(view);
controller_commands.registerEvents(); controller_commands.registerEvents();
controller_commands.registerCommands(); controller_commands.registerCommands();
view.setVisible(true); view.setVisible(true);
@@ -21,12 +21,17 @@ import java.awt.event.ActionListener;
public class CommandController implements ActionListener{ public class CommandController implements ActionListener{
private ChatView view; private ChatView view;
private Transmitter transmitter; //private Transmitter transmitter;
private CommandInvoker invoker; private CommandInvoker invoker;
public CommandController(ChatView view, Transmitter transmitter){ // public CommandController(ChatView view, Transmitter transmitter){
// this.view = view;
// this.transmitter = transmitter;
// this.invoker = new CommandInvoker();
// }
public CommandController(ChatView view){
this.view = view; this.view = view;
this.transmitter = transmitter;
this.invoker = new CommandInvoker(); this.invoker = new CommandInvoker();
} }
@@ -36,8 +41,9 @@ public class CommandController implements ActionListener{
} }
public void registerCommands(){ public void registerCommands(){
invoker.addCommand(view.getBtnConnect(), new CommandConnect()); CommandSend commandSend = new CommandSend(view);
invoker.addCommand(view.getTfNachricht(), new CommandSend()); invoker.addCommand(view.getBtnConnect(), new CommandConnect(view, commandSend));
invoker.addCommand(view.getTfNachricht(), commandSend);
} }
/** /**
+27 -2
View File
@@ -9,10 +9,35 @@ package ChatProgramm.controller;
* *
* @author ahren * @author ahren
*/ */
class Nachricht public class Nachricht
{ {
public Nachricht() private String nachricht;
//private int id;
public Nachricht(String nachricht)
{ {
this.setNachricht(nachricht);
//this.id = id;
} }
/**
* @return the id
*/
// public int getId() {
// return id;
// }
/**
* @return the nachricht
*/
public String getNachricht() {
return nachricht;
}
public void setNachricht(String nachricht) {
this.nachricht = nachricht;
}
} }
+15 -13
View File
@@ -2,9 +2,9 @@
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/ */
package ChatProgramm.controller; package ChatProgramm.controller;
import ChatProgramm.view.ChatView;
import java.util.concurrent.Flow; import java.util.concurrent.Flow;
import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.Flow.Subscriber;
@@ -12,30 +12,32 @@ import java.util.concurrent.Flow.Subscriber;
* *
* @author ahren * @author ahren
*/ */
public class ReceiveAdapter implements Subscriber<Nachricht> public class ReceiveAdapter implements Subscriber<Nachricht> {
{
public ReceiveAdapter()
{
private ChatView view;
private Flow.Subscription subscription;
public ReceiveAdapter(ChatView view) {
this.view = view;
} }
@Override @Override
public void onSubscribe(Flow.Subscription subscription) public void onSubscribe(Flow.Subscription subscription) {
{ this.subscription = subscription;
this.subscription.request(1);
} }
@Override @Override
public void onNext(Nachricht item) public void onNext(Nachricht item) {
{ view.getTxtChat().setText(item.getNachricht());
this.subscription.request(1);
} }
@Override @Override
public void onError(Throwable throwable) public void onError(Throwable throwable) {
{
} }
@Override @Override
public void onComplete() public void onComplete() {
{
} }
} }
@@ -5,20 +5,65 @@
package ChatProgramm.controller.commands; package ChatProgramm.controller.commands;
import ChatProgramm.model.Client;
import ChatProgramm.model.Server;
import ChatProgramm.util.OhmLogger;
import ChatProgramm.view.ChatView;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JRadioButton;
/** /**
* *
* @author ahren * @author ahren
*/ */
public class CommandConnect implements CommandInterface public class CommandConnect implements CommandInterface
{ {
public CommandConnect() private JRadioButton rBtnServer;
{ private JRadioButton rBtnClient;
private JDialog dialogFenster;
private static Logger lg = OhmLogger.getLogger();
private CommandSend commandSend;
private ChatView view;
public CommandConnect(ChatView view, CommandInterface value)
{
rBtnServer = view.getBtnServer();
rBtnClient = view.getBtnClient();
dialogFenster = view.getjDialog1();
commandSend = (CommandSend) value;
this.view = view;
} }
@Override @Override
public void execute() public void execute()
{ {
if(rBtnServer.isSelected()){
lg.info("Server ausgewählt");
try {
commandSend.transmitterInterface = new Server(view);
} catch (IOException ex) {
lg.info("Die Verbindung zum Server ist Fehlgeschlagen");
}
}
if(rBtnClient.isSelected()){
lg.info("Client ausgewählt");
try {
commandSend.transmitterInterface = new Client(view);
} catch (IOException ex) {
lg.info("Die Verbindung zum Client ist Fehlgeschlagen");
}
}
dialogFenster.setVisible(false);
} }
@Override @Override
@@ -5,20 +5,47 @@
package ChatProgramm.controller.commands; package ChatProgramm.controller.commands;
import ChatProgramm.controller.Nachricht;
import ChatProgramm.model.Client;
import ChatProgramm.model.Server;
import ChatProgramm.model.Transmitter;
import ChatProgramm.model.TransmitterInterface;
import ChatProgramm.util.OhmLogger;
import ChatProgramm.view.ChatView;
import java.util.Objects;
import java.util.logging.Logger;
import javax.swing.JTextField;
/** /**
* *
* @author ahren * @author ahren
*/ */
public class CommandSend implements CommandInterface public class CommandSend implements CommandInterface
{ {
public CommandSend() private static Logger lg = OhmLogger.getLogger();
{
private ChatView view;
public TransmitterInterface transmitterInterface;
private JTextField eingabeFeld;
public Server server;
public Client client;
public CommandSend(ChatView view)
{
this.view = view;
this.eingabeFeld = view.getTfNachricht();
transmitterInterface = null;
} }
@Override @Override
public void execute() public void execute()
{ {
if(transmitterInterface != null && !eingabeFeld.getText().isEmpty()){
transmitterInterface.send(new Nachricht(eingabeFeld.getText()));
eingabeFeld.setText("");
}
} }
@Override @Override
+57
View File
@@ -0,0 +1,57 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package ChatProgramm.model;
import ChatProgramm.util.OhmLogger;
import ChatProgramm.view.ChatView;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.*;
/**
* Builder Class
*
* @author le
*/
public class Client extends Transmitter {
private static Logger lg = OhmLogger.getLogger();
public Client(ChatView view) throws IOException {
super(view);
connect();
initIO();
// out.println("Hallo Du Server - ich bin ein Client");
// out.flush();
//
// lg.info("Client: warte auf Serverantwort");
//
// String nachricht = in.readLine(); // ACHTUNG blockiert
// lg.info("Client: Serverbestätigung erhalten");
//
// lg.info("Client: fertig");
// in.close();
// out.close();
// s.close();
}
@Override
public void connect() throws IOException {
try {
lg.info("Client: Verbindung wird aufgebaut");
socket = new Socket(IP, PORT);
lg.info("Client: Verbindung aufgebaut");
} catch (java.io.InterruptedIOException e) {
lg.warning("Timeout" + "(" + timeout / 1000 + "s)");
}
}
}
+74
View File
@@ -0,0 +1,74 @@
/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package ChatProgramm.model;
import ChatProgramm.model.Transmitter;
import ChatProgramm.util.OhmLogger;
import ChatProgramm.view.ChatView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.Flow;
import java.util.concurrent.SubmissionPublisher;
import java.util.logging.*;
/**
* Builder Class
*
* @author le
*/
public class Server extends Transmitter {
private static Logger lg = OhmLogger.getLogger();
@Override
public void connect() throws IOException {
try {
ServerSocket sSocket = new ServerSocket(PORT);
sSocket.setSoTimeout(timeout);
lg.info("Server: warte auf Verbindung");
socket = sSocket.accept();
lg.info("Server: Verbindung akzeptiert");
} catch (java.io.InterruptedIOException e) {
lg.warning("Timeout" + "(" + timeout / 1000 + "s)");
}
}
public Server(ChatView view) throws IOException {
super(view);
connect();
initIO();
// String nachricht = in.readLine(); // ACHTUNG blockiert
// lg.info("Server: Nachricht erhalten");
// System.out.println("Server: NACHRICHT = " + nachricht);
//
// // ACHTUNG: blockiert NICHT!!!!
// out.println("Server an Client: Nachricht erhalten");
// out.flush(); // wichtig
//
// lg.info("Server: fertig");
// in.close();
// out.close();
// s.close();
}
}
+151 -7
View File
@@ -2,22 +2,166 @@
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
*/ */
package ChatProgramm.model; package ChatProgramm.model;
import ChatProgramm.controller.Nachricht;
import ChatProgramm.controller.ReceiveAdapter;
import ChatProgramm.util.OhmLogger;
import ChatProgramm.view.ChatView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Flow;
import java.util.concurrent.Flow.Subscriber;
import java.util.concurrent.SubmissionPublisher;
import java.util.logging.Level;
import java.util.logging.Logger;
/** /**
* *
* @author ahren * @author ahren
*/ */
public class Transmitter implements Runnable public abstract class Transmitter implements Runnable, Subscriber<Nachricht>, TransmitterInterface {
{
public Transmitter()
{
static final int timeout = 30000;
protected static final int PORT = 35000;
protected static final String IP = "127.0.0.1";
private static Logger lg = OhmLogger.getLogger();
protected Socket socket;
protected BufferedReader reader;
protected PrintWriter writer;
private SubmissionPublisher<Nachricht> textPublisher;
private ExecutorService eService;
private boolean laufend = false;
private ChatView view;
private ReceiveAdapter receiveAdapter;
public Transmitter(ChatView view) {
socket = new Socket();
eService = null;
this.view = view;
textPublisher = new SubmissionPublisher<>();
receiveAdapter = new ReceiveAdapter(view);
addWertSubscription(receiveAdapter);
}
public abstract void connect() throws IOException;
public void addWertSubscription(Subscriber<Nachricht> subscriber) {
textPublisher.subscribe(subscriber);
}
public void initIO() {
try {
lg.info("Initialisiere reader und writer");
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
OutputStreamWriter osr = new OutputStreamWriter(os, "UTF-8");
reader = new BufferedReader(isr);
writer = new PrintWriter(osr);
lg.info("Initialisierung abgeschlossen");
start();
} catch (IOException ex) {
Logger.getLogger(Transmitter.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void start(){
synchronized (this){
laufend = true;
}
if (eService == null){
eService = Executors.newSingleThreadExecutor();
eService.execute(this);
}
lg.info("Starte Chat");
}
public void send(Nachricht nachricht) {
lg.info("Nachricht wird gesendet");
writer.println(nachricht.getNachricht());
writer.flush();
lg.info("Nachricht wird angezeigt");
textPublisher.submit(nachricht);
}
public Nachricht receive(){
Nachricht nachricht = new Nachricht("");
try {
String txtNachricht = reader.readLine();
if(!txtNachricht.isEmpty()){
lg.info("Nachricht erhalten");
nachricht.setNachricht(txtNachricht);
return nachricht;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return nachricht;
}
@Override
public void run() {
while (true) {
lg.info("Warte auf Nachricht");
if(laufend) {
Nachricht eingehendeNachricht = receive();
if(!eingehendeNachricht.getNachricht().isEmpty()){
textPublisher.submit(eingehendeNachricht);
}
}
else{
break;
}
}
} }
@Override @Override
public void run() public void onSubscribe(Flow.Subscription subscription) {
{ throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
@Override
public void onError(Throwable throwable) {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
@Override
public void onComplete() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
@Override
public void onNext(Nachricht item) {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
}
} }
@@ -0,0 +1,8 @@
package ChatProgramm.model;
import ChatProgramm.controller.Nachricht;
public interface TransmitterInterface{
public void send(Nachricht nachricht);
public Nachricht receive();
}