Habe 2 Probleme: Input eingabe und Multi Socket Server

Status
Nicht offen für weitere Antworten.

Darthzed

Mitglied
Hallo,
ich beschäftige mich zurzeit mit der Programmierung eines Java Chats über Socket mit grafischer Oberfläche.
Ich bin eigentlich schon fast fertig aber da sind noch zwei große Probleme, zum einem bekomme ich es nicht hin
die Daten die der Server zum Clint schickt zu einem String umzuwandeln und dann auf einer jTextArea auszugeben. Und zum anderen kann mein Socket Server nur immer an einen Client die Nachricht schicken.
Ich arbeite mit dem Handbuch der Java-Programmierung und habe von dort aus Kapitel 45 die Beispiele vom Server und vom Client genommen und dann verändert.


Hier ist mein versuch mit dem Inputstream. Der Fehler ist weiter unten in dem Thread. Ich bereits eine Funktion gefunden namens getBytes aber die funktioniert nicht richtig und scheint veraltet zu sein:

Code:
import java.net.*;
import java.io.*;

public class SocketClient
{

	Socket sock;
	InputStream in;
	OutputStream out;
	OutputThread th;

	public void verbinden(String url, Prototype fenster)
	{
		fenster.setStatusAusgabeJTextAreaEingabe("Client gestartet\n");

		try
		{
			sock = new Socket(url, 7);

			in = sock.getInputStream();
			out = sock.getOutputStream();

			th = new OutputThread(in);
		}
		catch (IOException e)
		{
			fenster.setStatusAusgabeJTextAreaEingabe
				("Fehler:\nUngültige URL oder Server antwortet nicht\n");
			th.requestStop();
			fenster.setStatusAusgabeJTextAreaEingabe("Client beendet\n");
			e.printStackTrace();
		}
	}

	/**
	 * Diese Methode trennt die Verbindung zum Server
	 * 
	 */
	public void trennen(Prototype fenster)
	{
		try
		{
			in.close();
			out.close();
			sock.close();
			th.requestStop();
			fenster.setStatusAusgabeJTextAreaEingabe("Client beendet\n");
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * Diese Methode sendet den eingegebenen Textstring zu Server
	 * 
	 */
	public void senden(String msg)
	{
		try
		{
			out.write(msg.getBytes());
			out.write('\r');
			out.write('\n');

			//Ausgabe abwarten
			th.yield();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}

	}

}

class OutputThread extends Thread
{
	Prototype fenster = null;

	InputStream in;
	boolean stoprequested;

	public OutputThread(InputStream in, Prototype fenster)
	{
		super();
		this.in = in;
		stoprequested = false;
		this.fenster = fenster;
	}

	public OutputThread(InputStream in)
	{
		super();
		this.in = in;
		stoprequested = false;
	}

	public synchronized void requestStop()
	{
		stoprequested = true;
	}

	public void run()
	{
		int len;
		byte[] b = new byte[100];

		try
		{
			while (!stoprequested)
			{
				try
				{
					if ((len = in.read(b)) == -1)
					{
						break;
					}

					String eingabe = null;

					try
					{
						eingabe.getBytes(0, len, b, 0);
					}
					catch (IndexOutOfBoundsException e)
					{
					}
					//eingabe = String.valueOf(out.write(b, 0, len)).stringValue();

--------->					System.out.write(b, 0, len);

					fenster.setNachrichtenAusgabeJTextAreaEingabe(eingabe);
					fenster.setNachrichtenAusgabeJTextAreaEingabe("\n");
				}
				catch (InterruptedIOException e)
				{
					fenster.setStatusAusgabeJTextAreaEingabe(
						"Fehler beim empfangen\n");
				}
			}
		}
		catch (IOException e)
		{
			fenster.setStatusAusgabeJTextAreaEingabe(
				"OutputThread: " + e.toString());
			fenster.setStatusAusgabeJTextAreaEingabe("\n");
		}
	}
}

Bei dem Server habe ich versucht mithilfe einer Threadliste die Threads einzutragen damit der Server wenn ein Client eine Nachricht schickt, sie an alle anderen Clients weiter geschickt wird:

Code:
import java.net.*;
import java.io.*;

public class SocketServer
{
	int cnt = 0;

	public static void main(String[] args)
	{
		SocketServer ss = new SocketServer();
		ss.starteServer();
	}

	int getCounter()
	{
		return cnt;
	}

	public void starteServer()
	{
		Socket clientList[] = new Socket[5];

		try
		{
			System.out.println("Warte auf Verbindungen auf Port 7...");
			ServerSocket echod = new ServerSocket(7);
			while (true)
			{
				Socket socket = echod.accept();
				clientList[cnt] = socket;
				cnt++;
				EchoClientThread ect=new EchoClientThread(this, clientList);
				ect.start();
			}
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
	}
}

class EchoClientThread extends Thread
{
	private SocketServer ss;
	private Socket[] clientList;

	public EchoClientThread(SocketServer ss, Socket[] socket)
	{
		this.ss = ss;
		this.clientList = socket;
	}

	public void run()
	{
		String msg = "EchoServer: Verbindung " + ss.getCounter();
		System.out.println(msg + " hergestellt");
		try
		{
			InputStream in = clientList[0].getInputStream();
			//OutputStream out = socket.getOutputStream();
			// out.write((msg + "\r\n").getBytes());
			int c;
			while ((c = in.read()) != -1)
			{
				for (int i = 0; i < ss.getCounter(); i++)
				{
					Socket socket = clientList[i];
//					InputStream in = socket.getInputStream();
					OutputStream out = socket.getOutputStream();
					out.write((char) c);
					System.out.print((char) c);
//					socket.close();
				}
			}
			System.out.println("Verbindung " + ss.getCounter() + " wird beendet");
			//			socket.close();
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
		}
	}
}

Der funktionierende Server der allerdings nur an einen Client eine nachreicht schicken kann sieht so aus:

Code:
import java.net.*;
import java.io.*;

public class EchoServer
{
	public static void main(String[] args)
	{
		SocketServer ss = new SocketServer();
		ss.starteServer();
	}

	public void starteServer()
	{
		int cnt = 0;
		Socket clientList[] = new Socket[5];

		try
		{
			System.out.println("Warte auf Verbindungen auf Port 7...");
			ServerSocket echod = new ServerSocket(7);
			while (true)
			{
				Socket socket = echod.accept();
				(new EchoClientThread1(++cnt, socket)).start();
			}
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
	}
}

class EchoClientThread1 extends Thread
{
	private int name;
	private Socket socket;

	public EchoClientThread1(int name, Socket socket)
	{
		this.name = name;
		this.socket = socket;
	}

	public void run()
	{
		String msg = "EchoServer: Verbindung " + name;
		System.out.println(msg + " hergestellt");
		try
		{
			InputStream in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();
			out.write((msg + "\r\n").getBytes());
			int c;
			while ((c = in.read()) != -1)
			{
				out.write((char) c);
				System.out.print((char) c);
			}
			System.out.println("Verbindung " + name + " wird beendet");
			socket.close();
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
		}
	}
}

Ich habe schon überall nach einer lösung für die beiden probleme gesucht aber nichts brauchbares gefunden.

Vielen dank für jede Hilfe
 

Darthzed

Mitglied
Mein erstes Problem konnte ich so lösen:
Code:
public void run()
{
    int zeichen;
    int stringLaenge;
    int counter = 0;
    String eingabe;´
    StringBuffer buchstaben = new StringBuffer();
       
    try
    {
        while ((zeichen = in.read()) != -1)
        {
            //System.out.print((char) zeichen);
            buchstaben.append((char) zeichen);
            counter++;

            if (zeichen <= 31)
            {
                eingabe = buchstaben.toString();
                fenster.setNachrichtenAusgabeJTextAreaEingabe(eingabe);

                stringLaenge = buchstaben.length();
                buchstaben.delete(0, stringLaenge);
                eingabe = null;
            }
        }
    }
    catch (InterruptedIOException e)
    {
    }
    catch (IOException e)
    {
    }
}
 

Darthzed

Mitglied
Kommt Zeit kommt Rat,
jedenfalls konnte ich das Problem mit dem Server selbst lösen.
Falls es jemanden interessiert hier ist der Quellcode:

Code:
import java.net.*;
import java.io.*;

public class SocketServer
{

	public static String textSpeicher = "0";
	public static int neueDaten = 0;

	/**
	 * Diese Methode Speichert einen empfangenen Text von einem Thread.
	 * Sie ist Synchronisiert damit die Threads abwechselnd drauf zugreifen können
	 * 
	 */
	public synchronized void setTextSpeicher(String textZwischenSpeicher)
	{
		textSpeicher = textZwischenSpeicher;
	}

	/**
	 * Diese Methode gibt den gespeicherten Text wieder zurück.
	 * Sie ist Synchronisiert damit die Threads abwechselnd drauf zugreifen können
	 * 
	 */
	public synchronized String getTextSpeicher()
	{
		return textSpeicher;
	}

	/**
	 * In Diese Methode wird der Integer + 1 gerechnet, 
	 * wenn was neues im textSpeicher steht
	 * Sie ist Synchronisiert damit die Threads abwechselnd drauf zugreifen können
	 * 
	 */
	public synchronized void setNeueDaten(int neu)
	{
		SocketServer sock = new SocketServer();
		sock.neueDaten = neu;
	}

	/**
	 * Diese Methode gibt an, wenn etwas neues im textSpeicher ist
	 * Sie ist Synchronisiert damit die Threads abwechselnd drauf zugreifen können
	 * 
	 */
	public synchronized int getNeueDaten()
	{
		SocketServer sock = new SocketServer();
		return sock.neueDaten;
	}

	public static void main(String[] args)
	{
		int cnt = 0;

		try
		{
			System.out.println("Warte auf Verbindungen auf Port 10\n");

			SocketServer server = new SocketServer();

			ServerSocket senden = new ServerSocket(11);
			ServerSocket empfangen = new ServerSocket(10);

			while (true)
			{
				Socket ssocket = senden.accept();
				Socket esocket = empfangen.accept();

				SendeClientThread clientThread =
					new SendeClientThread(++cnt, ssocket, server);
				clientThread.start();

				(new EmpfangsClientThread(cnt, esocket, clientThread, server))
					.start();

				try
				{
					Thread.sleep(50);
				}
				catch (InterruptedException e)
				{
				}

				System.out.println("\nClient " + cnt + ":");
				System.out.println("Sende    Socket " + senden);
				System.out.println("Empfangs Socket " + empfangen + "\n");
			}
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
			System.exit(1);
		}
	}
}

class EmpfangsClientThread extends Thread
{
	private int name;
	private Socket socket;
	private SocketServer server;

	SendeClientThread clientThread;

	int zeichen;
	int oldZeichen;
	int counter = 0;
	int stringLaenge;
	
	StringBuffer buchstaben = new StringBuffer();
	String eingabe;

	public EmpfangsClientThread(
		int name,
		Socket socket,
		SendeClientThread clientThread,
		SocketServer server)
	{
		this.name = name;
		this.socket = socket;
		this.server = server;
		this.clientThread = clientThread;
	}

	public void run()
	{
		try
		{
			InputStream in = socket.getInputStream();

			while ((zeichen = in.read()) != -1)
			{
				buchstaben.append((char) zeichen);

				if (zeichen == '\n')
				{
					eingabe = buchstaben.toString();

					System.out.print(eingabe);

					stringLaenge = buchstaben.length();
					buchstaben.delete(0, stringLaenge);

					server.setTextSpeicher(eingabe);

					counter = server.getNeueDaten();
					counter = counter + 1;
					server.setNeueDaten(counter);
					eingabe = null;
				}
			}
			System.out.println("Verbindung " + name + " wird beendet\n");
			clientThread.stop();
			socket.close();
		}
		catch (IOException e)
		{
			System.err.println(e.toString());
		}
	}
}

class SendeClientThread extends Thread
{
	private int name;
	private Socket socket;
	private SocketServer server;

	public SendeClientThread(int name, Socket socket, SocketServer server)
	{
		this.name = name;
		this.socket = socket;
		this.server = server;
	}

	public void run()
	{
		try
		{
			OutputStream out = socket.getOutputStream();

			int counter = 0;
			
			String msg = "Chat Server: Verbindung " + name;
			System.out.println(msg + " hergestellt");

			out.write((msg + "\n").getBytes());

			msg = "0";

			try
			{
				while (true)
				{
					try
					{
						Thread.sleep(10);
					}
					catch (InterruptedException e)
					{
					}

					if (server.getNeueDaten() != counter)
					{
						msg = server.getTextSpeicher();
						out.write(msg.getBytes());
						counter = server.getNeueDaten();
					}
				}
			}
			catch (IOException e)
			{
				System.err.println(e.toString());
			}
			socket.close();
		}

		catch (IOException e)
		{
			System.err.println(e.toString());
		}
	}
}

Es werden pro Client der sich beim Server einloggt, zwei Sockets geöffnet. Einer zum senden und einer zum empfangen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Developer_X Habe fragen zur Chat Programmierung Netzwerkprogrammierung 4
M ich habe ein stream problem Netzwerkprogrammierung 7
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
A habe kurze Definitionsfrage. Netzwerkprogrammierung 2
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
Niggo_ Probleme mit Java Mail Netzwerkprogrammierung 14
F Probleme mit Connection Reset bei Telnet Verbindung Netzwerkprogrammierung 1
K Probleme bei HTML-Mail-Abruf mit IMAP bei 1und1 Netzwerkprogrammierung 2
L Socket SSLServer Probleme Netzwerkprogrammierung 0
H Probleme mit UDP Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
R Probleme mit JMS Netzwerkprogrammierung 1
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
M RMI RMI Probleme zwischen Client und Server Netzwerkprogrammierung 5
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
M Probleme mit FTP Netzwerkprogrammierung 19
windl URLConnection unter 1.7 macht Probleme Netzwerkprogrammierung 14
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
Maxim6394 Probleme bei Messenger Netzwerkprogrammierung 16
I Socket UDP Hole Punching bereitet Probleme Netzwerkprogrammierung 14
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
S HTTP Probleme mit POST-Befehl Netzwerkprogrammierung 2
R FTPS - Probleme mit FTPSClient Netzwerkprogrammierung 2
S Probleme mit XMLEncoder/XMLDecoder Netzwerkprogrammierung 2
D Server - Client Probleme Netzwerkprogrammierung 9
Weiti HTTP Zertifikat-Probleme - InstallCert.java Netzwerkprogrammierung 2
M Socket Probleme mit einfacher Socketverbindung Netzwerkprogrammierung 3
H Probleme mit GUI (RMI) Netzwerkprogrammierung 6
T RMI Probleme mit RMI-Server Netzwerkprogrammierung 4
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
T FTP Probleme mit Passiv und Binary Mode Netzwerkprogrammierung 3
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
S Socket SocketServer und Client machen Probleme Netzwerkprogrammierung 6
B Server / Client Anwendung, Client GUI Probleme Netzwerkprogrammierung 11
F RMI probleme Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
E jPcap Probleme Netzwerkprogrammierung 3
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
T Probleme mit Jpcap Netzwerkprogrammierung 18
P Probleme mit OutputStream Netzwerkprogrammierung 7
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
B Probleme mit FTP verbindung Netzwerkprogrammierung 22
L Probleme bei Chatserver Netzwerkprogrammierung 6
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
G Probleme mit SecruityManager + RMI Netzwerkprogrammierung 10
derMartin Probleme mit NNTP Client Netzwerkprogrammierung 2
A Probleme mit Citrix Netzwerkprogrammierung 17
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
K RXTXcomm : Install - Probleme Netzwerkprogrammierung 7
R Probleme mit UDP Netzwerkprogrammierung 4
P Probleme bei Chat programm Netzwerkprogrammierung 2
I Probleme mit 'JSSE Samples' von Sun Netzwerkprogrammierung 5
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
E InetAddress Klasse-Probleme Netzwerkprogrammierung 4
M dateien übertragen, probleme mit versch. Strömen? Netzwerkprogrammierung 4
R Rechte Probleme bei Applets Netzwerkprogrammierung 16
D EA-Exception Network Adapter macht probleme Netzwerkprogrammierung 2
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
P Probleme mit Input- / Output-Streams Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
F WLAN Probleme (CLIENT-SERVER) Netzwerkprogrammierung 4
J Probleme mit ObjectOutputStream! Netzwerkprogrammierung 15
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6
M Probleme beim Abfangen von Streams Netzwerkprogrammierung 5
G Fragen/Probleme mit JavaMail Netzwerkprogrammierung 2
N Java-Chat (lauffähig) macht Probleme auf der Konsole Netzwerkprogrammierung 6
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
C Probleme bei Dateiupload mit socket Netzwerkprogrammierung 4
T FTP Chatprogramm probleme Netzwerkprogrammierung 2
C RMI Probleme mit iptables Netzwerkprogrammierung 2
D socket exception + timing probleme Netzwerkprogrammierung 2
G Probleme bei Proxy-Server! Netzwerkprogrammierung 5
S Probleme mit HttpURLConnection Netzwerkprogrammierung 10
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
M Socket kein Input Netzwerkprogrammierung 8
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
H Input-/OutputStream Frage Netzwerkprogrammierung 6
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
lacyuu Warum empfängt mein Stream keinen Input? Netzwerkprogrammierung 4
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben