Moin, ich arbeite zur Zeit an einer Software, welche über eine Socketverbindung mit einem anderen Gerät kommunizieren soll, sprich Client/Server Verbindung.
Nun habe ich von jedem jeweils eine Klasse und habe den Code so geschrieben, dass ich vom Server schreiben kann und ebenfalls vom Client schreiben kann.
Nun ist mir bewusst, dass das Lesen und Horchen nicht gleichzeitig im Main Thread erfolgen kann. Entweder wird gehorcht oder geschrieben.
Nun habe ich eine dritte Klasse erstellt und versuche einen Thread so zu schreiben, dass dieser einfach nur schreibt, dass dem Client/Server übergibt während die einfach nur am lauschen sind und auf Inhalt vom InputStream warten.
Ich bekomme es aber echt nicht hin. Jemand eine Idee ?
Der Code sieht folgendermaßen aus:
Nun habe ich von jedem jeweils eine Klasse und habe den Code so geschrieben, dass ich vom Server schreiben kann und ebenfalls vom Client schreiben kann.
Nun ist mir bewusst, dass das Lesen und Horchen nicht gleichzeitig im Main Thread erfolgen kann. Entweder wird gehorcht oder geschrieben.
Nun habe ich eine dritte Klasse erstellt und versuche einen Thread so zu schreiben, dass dieser einfach nur schreibt, dass dem Client/Server übergibt während die einfach nur am lauschen sind und auf Inhalt vom InputStream warten.
Ich bekomme es aber echt nicht hin. Jemand eine Idee ?
Der Code sieht folgendermaßen aus:
Java:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
// boolean nachrichtEmpfangen = false;
String empfangeneNachricht;
// String zuSendendeNachricht;
boolean exit = false;
OutputStream zuServer;
PrintStream stream;
Scanner scanner;
InputStream vonServer;
BufferedReader leserVonInput;
// String nickname;
try {
socket = new Socket("localhost", 3456);
zuServer = socket.getOutputStream();
stream = new PrintStream(zuServer);
scanner = new Scanner(System.in);
vonServer = socket.getInputStream();
leserVonInput = new BufferedReader(new InputStreamReader(vonServer));
// System.out.print("Gib dir einen Nickname: ");
// nickname = scanner.nextLine();
Schreiber schreibThread = new Schreiber();
Thread schreiber = new Thread(schreibThread);
schreiber.start();
while (exit == false) {
// System.out.print(nickname + ": ");
// zuSendendeNachricht = scanner.nextLine();
// if (zuSendendeNachricht.equals("quit")) {
// exit = true;
// socket.close();
// }
// stream.println(zuSendendeNachricht);
while (leserVonInput.ready()) {
empfangeneNachricht = leserVonInput.readLine();
System.out.println("Nachricht vom Server: " + empfangeneNachricht);
if (empfangeneNachricht.equals("quit")) {
exit = true;
scanner.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java:
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.util.Scanner;
public class Server {
private final ServerSocket server;
Scanner scanner = new Scanner(System.in);
String nachrichtSpeicher;
String zuSendendeNachricht;
boolean nachrichtEmpfangen = false;
boolean exit = false;
InputStream vonClient;
BufferedReader lesenVonClient;
public Server(int port) throws IOException {
server = new ServerSocket(port);
System.out.println("Server starting...");
}
private void verbinde() {
while (!exit) {
// Endlosschleife für Verbindung
Socket socket = null;
try {
socket = server.accept();
nachrichtenAustausch(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void nachrichtenAustausch(Socket socket) throws IOException {
try {
vonClient = socket.getInputStream();
lesenVonClient = new BufferedReader(new InputStreamReader(vonClient));
OutputStream zuClient = socket.getOutputStream();
PrintStream schreiben = new PrintStream(zuClient);
while (nachrichtEmpfangen == false) {
// System.out.println(lesenVonClient.ready());
while (lesenVonClient.ready()) {
nachrichtSpeicher = lesenVonClient.readLine();
if (nachrichtSpeicher.equals("test")) {
URL soundbyte = new File("C:\\Users\\T0244695\\Desktop\\Dokumente und Diagramme/old-phone-ringing.wav").toURI().toURL();
java.applet.AudioClip clip = java.applet.Applet.newAudioClip(
soundbyte );
clip.play();
System.out.println("Nachricht von Client: " + nachrichtSpeicher);
} else if (nachrichtSpeicher.equals("quit")) {
schreiben.println("quit");
System.out.println("Verbindung wird getrennt...");
scanner.close();
socket.close();
exit = true;
nachrichtEmpfangen = true;
} else {
System.out.println("Nachricht von Client: " + nachrichtSpeicher);
System.out.println("Geben Sie Nachricht ein: ");
zuSendendeNachricht = scanner.nextLine();
if (zuSendendeNachricht.contains("quit")) {
scanner.close();
socket.close();
exit = true;
nachrichtEmpfangen = true;
}
schreiben.println(zuSendendeNachricht);
}
}
}
} catch (Exception e) {
System.out.println("Serververbindung getrennt.");
}
}
public static void main(String[] args) throws IOException {
Server server = new Server(3456);
server.verbinde();
}
}
Java:
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Schreiber implements Runnable {
Socket socket;
OutputStream zuServer;
Scanner scanner;
PrintStream schreibWerkzeug;
String nickname;
String zusendendeNachricht;
boolean exit = false;
public Schreiber() throws FileNotFoundException {
Scanner scanner = new Scanner(System.in);
this.scanner = scanner;
this.schreibWerkzeug=schreibWerkzeug;
}
@Override
public void run() {
System.out.print("Gib dir einen Nickname: ");
nickname = scanner.nextLine();
while (exit == false) {
System.out.print(nickname + ": ");
zusendendeNachricht = scanner.nextLine();
if (zusendendeNachricht.equals("quit")) {
exit = true;
} else {
schreibWerkzeug.println(zusendendeNachricht);
}
}
}
}