# Chat , Streamproblem, PumpingException, Danke



## chattychan (6. Okt 2006)

Hallo,

ich versuch im Moment einen einfachen Chat zu implementieren.


```
package web;

import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.util.*;

public class Chat extends JFrame{
	
	JPanel paneln;
	JPanel panelc;

	JButton send;
	JButton sendtext;
	JTextField host;
	JTextArea output;
	JTextArea input;
	URL url;
	URLConnection urlcon;
	BufferedReader buf;
	ServerSocket serv;
	Socket outclient;
	InetAddress adress;
	int port = 2006;
	protected Vector connections;
	Thread connect;
	DataInputStream in;
	PrintStream out;

	public Chat() {
		super("Chat 0.1");

		
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		paneln = new JPanel();
		paneln.setLayout(new FlowLayout());
		
		panelc = new JPanel();
		panelc.setLayout(new GridLayout(2,1));
		
		

		
		send = new JButton("Connect");
		sendtext = new JButton("Senden");
		
		host = new JTextField(10);
		
		output = new JTextArea(5,5);
		output.setEditable(false);
		output.setBackground(Color.black);
		output.setForeground(Color.green);
		
		input = new JTextArea(5,5);
		
		
		paneln.add(host);
		paneln.add(send);

		panelc.add(output);
		panelc.add(input);
		
		c.add(paneln, BorderLayout.NORTH);
		c.add(panelc, BorderLayout.CENTER);	
		c.add(sendtext, BorderLayout.SOUTH);
		
		try{
		serv = new ServerSocket(port);
		output.append("ServerSocket erstellt...\nServer lauscht auf Port 2001...\n");

		}
		catch(IOException e){
			output.append("Kann ServerSocket nicht erstellen\n");
		}
		
		
		send.addActionListener(new MeinActionLauscher());
		sendtext.addActionListener(new MeinActionLauscher1());
		

		
	}
	
	
	
	
	class MeinActionLauscher implements ActionListener {
		public void actionPerformed(ActionEvent e){
			try{
				/*
				url = new URL(host.getText());
				buf = new BufferedReader(new InputStreamReader(url.openStream()));
				String s;
				int i=1;
				while((s=buf.readLine())!=null){
					output.append(i+": "+s+"\n");
					i++;
				
				}
				*/
				adress = InetAddress.getByName(host.getText());
				output.append("Verbindung aufbauen mit: "+host.getText()+"\n");
				
				outclient = new Socket(adress, port);
				
				output.append("Verbindung steht... h4ck th3 w0rld :-)\n");
				}
			catch(IOException e1){
				output.append("Verbindung konnte nicht aufgebaut werden...\n");
			}
		}
	}
	
	class MeinActionLauscher1 implements ActionListener{
		public void actionPerformed(ActionEvent e){
			output.append("Ich: "+input.getText()+"\n");		
			out.println("Er: "+input.getText()+"\n");
			input.setText("");
		}
	}
	
	public void broadcast(String msg)
	{
		int i;
		connection you;

		for (i=0; i<connections.size(); i++)
		{
			you = (connection) connections.elementAt(i);
			you.out.println(msg);
		}
	}
	
	public void lauschen() {
		String line;
		try{
			while(true){
				Socket client = serv.accept();
				output.append(client.toString()+"\n");
				output.append("Socket angenommen\n");
				if(client.isConnected())
					output.append("Jupp");
				//connection c = new connection(this, client);
				//connections.addElement(c);
				BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
				out = new PrintStream(client.getOutputStream());
				line = in.readLine();
				if(line!=null)
					output.append(line+'\n' );
			}
		}
		
		catch(IOException e){
			output.append("Verbindung kann nicht angenommen werden! SCHEISSE\n");
		}
	}
	
	public static void main(String[] args){
		Chat chatlein = new Chat();		
		chatlein.setSize(300,400);
		chatlein.setVisible(true);
		chatlein.lauschen();
		
	}
}
```

Dummerweise bekomme ich da immer eine Exception wenn ich den Stream losschicke.
Dabei ist doch der Socket verbunden. Also der SocketServer accepts.

Komisch, ich habs auch schon mal als Thread versucht, da der Server eh später mehrere Verbindungen eingehen soll.
Zur Vereinfachung hab ich dann mal anstatt in run() den code in eine einfache void methode geschrieben.

Hoffe jemand kann mir helfen. 

Gruss
Thomas


----------



## Ceos (6. Okt 2006)

Die exception als ausschrifft wäre nett

erm beim lauschen iss mir einiges nicht ganz klar ist das jetzt der server oder der client ? weil das iss irgendwie gemischt

ich hab das etwas anders gemacht, ich versteh nicht wo du aus dem bytestrom wieder einen lesbaren datenstrom machst, gschweige denn wo du überhaupt schreibst

bleiben wir bei der exception, ich steig bei dir irgendwie net ganz durch kann es sein das du für jeden textschnipsel eine neue verbindung aufbaust ?

normalerweise lauscht man am serverSocket, holt sich einen Socket mit s.accept(), legt sich einen Thread an, der ein einer schleife auf ankommende daten wartet und parallel dazu geht die lausch schleife wieder in s.accept();

senden tut man dann indem man die threads (die man effektiv in einer hashtable anlegt) durchrasselt und jedem Socket in den output schreibt


----------



## chattychan (6. Okt 2006)

Hi,

wow das war aber ne schnelle Antwort.

Ich werd das ganze heute Abend nochmal überdenken und Threads benutzen.
Hab das echt ein bischen komisch gemacht, das liegt aber daran dass ich noch gar nicht
richtig plan hab weil ich sowas noch nie gemacht habe. ich kenn mich gar nicht mit streams aus
und welcher Stream welchem als Container dienen darf weiss ich auch nicht. Hab einfach mal
nen BufferedReader genommen weil ich weiss das es damit geht von stdin zeilenweise auszulesen
und dass er die methode readLine() hat. Da dacht ich einfach, readLine() liefert einen String den kann ich
dann an das JTextArea anhängen. war wohl nix.

Ich poste morgen Mittag nochmal meine neue Version. Wäre super nett wenn du dir das dann nochmal
anschauen könntest.

Gruss
Thomas


----------

