Hallo Forum,
Ich wollte einen Server und einen client schreiben, welche sich über Object verständigen.
Dazu benutze ich die ObjectOutputStream und ObjectInputStream.
als erstes wollte ich nen Chat damit bauen.
Der Server:
funktion broadcast -> um das Object an alle zu verteilen.
und die readObject funktion um neue Nachrichten zu umpfangen.
der Code:
Der code für die connection im Server:
Der Client:
die Klasse tcpContent (inhalt -> object)
Mein fehler ist folgender:
die Nachricht wird nur beim ersten mal ausgeliefert, mehr oder weniger...
dann kommt:
Fehler:java.io.StreamCorruptedException: invalid type code: AC
Fehler:java.io.StreamCorruptedException: invalid type code: AC
wo liegt mein Fehler :/
danke
Ich wollte einen Server und einen client schreiben, welche sich über Object verständigen.
Dazu benutze ich die ObjectOutputStream und ObjectInputStream.
als erstes wollte ich nen Chat damit bauen.
Der Server:
funktion broadcast -> um das Object an alle zu verteilen.
und die readObject funktion um neue Nachrichten zu umpfangen.
der Code:
Code:
package server;
import java.net.*;
import java.io.*;
import java.util.*;
public class server implements Runnable
{
public static final int PORT = 4711;
protected ServerSocket listen;
protected Vector connections;
Thread connect;
public server()
{
try
{
listen = new ServerSocket(PORT);
} catch (IOException e)
{
System.err.println("Fehler beim Erzeugen der Sockets: " + e);
System.exit(1);
}
connections = new Vector();
connect = new Thread(this);
connect.start();
}
public void run()
{
try
{
while(true)
{
Socket client=listen.accept();
connection c = new connection(this, client);
connections.addElement(c);
}
} catch (IOException e)
{
System.err.println("Fehler beim Warten auf Verbindungen:"+e);
System.exit(1);
}
}
public static void main(String[] args)
{
new server();
}
public void broadcast(Object o) throws IOException
{
int i;
connection you;
for (i=0; i<connections.size(); i++)
{
you = (connection) connections.elementAt(i);
you.out.writeObject(o);
you.out.flush();
}
}
}
Der code für die connection im Server:
Code:
package server;
import java.net.*;
import java.io.*;
class connection extends Thread
{
protected Socket client;
protected ObjectInputStream in;
protected ObjectOutputStream out;
protected server server;
public connection(server server, Socket client)
{
this.server=server;
this.client=client;
try
{
in = new ObjectInputStream(client.getInputStream());
out = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e)
{
try {
client.close();
} catch (IOException e2) {System.out.println(e2);}
System.err.println("Fehler beim Erzeugen der Streams in Class 'connection': " + e);
return;
}
this.start();
}
public void run()
{
Object o;
try
{
do {
o = in.readObject();
System.out.println(this + " received: " );
server.broadcast(o);
} while (o != null);
} catch (IOException e)
{
System.out.println("Fehler:" + e);
} catch (ClassNotFoundException e) {
System.err.println("Fehler in: in.readObject");
e.printStackTrace();
}
}
}
Der Client:
Code:
package client;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Event;
import java.awt.Font;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JFrameChat extends Frame implements Runnable {
private static final long serialVersionUID = -9002765186074024965L;
int PORT = 4711;
String IP = "10.12.0.5";
Socket socket;
ObjectInputStream in;
ObjectOutputStream out;
TextField inputfield;
TextArea outputarea;
Thread thread;
TextField tf;
public JFrameChat(String titel) {
super(titel); // Programm name
tf = new TextField("Ihr Name");
tf.setVisible(true);
inputfield = new TextField();
outputarea = new TextArea();
outputarea.setFont( new Font("Dialog", Font.PLAIN, 12));
outputarea.setEditable(false);
this.setLayout(new BorderLayout());
add("North", tf);
add("South", inputfield);
add("Center", outputarea);
setBackground(Color.lightGray);
setForeground(Color.black);
inputfield.setBackground(Color.white);
outputarea.setBackground(Color.white);
this.setSize(500, 300);
addWindowListener(new CMeinWindowLauscher());
this.setVisible(true);
}
// Fenster Schließbar machen
class CMeinWindowLauscher extends WindowAdapter {
public void windowClosing(WindowEvent ev) {
System.exit(1);
}
}
public void start() {
try
{
say("Verbindung wird hergestellt... " + IP + ":" + PORT);
socket = new Socket(IP, PORT);
say("Verbindung zum Server aufgenommen...");
} catch (IOException e)
{
String Error = e.toString();
say("Verbindung zum Server fehlgeschlagen! \n" + Error);
say("IP ADRESSE: " + IP + " PORT: " + PORT);
}
if (thread == null)
{
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
}
public void run() {
try {
in = new ObjectInputStream(socket.getInputStream());
System.out.println("lese inpustream");
Object receivedObject = null;
tcpContent tC;
do {
receivedObject = in.readObject();
tC = (tcpContent) receivedObject;
System.out.println(this + " received: " + tC.getChatText());
outputarea.appendText(tC.getChatText() + '\n' );
} while (receivedObject != null);
}
catch (IOException e) {
say("Verbindung zum Server abgebrochen"); } catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("Fehler bei in.Readobject: ");
e.printStackTrace();
}
}
// aus Application Actionevent auslesen ob herkunft von inputfeld kommt
public boolean action(Event e, Object what) {
if (e.target==inputfield)
{
String inp = (String) e.arg;
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
tcpContent tC = new tcpContent();
String tmp_chat = (tf.getText() + " [" + sdf.format(now) + "]: " + inp);
tC.setChatText(tmp_chat);
tC.setUsername("name");
try {
out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(tC);
out.flush();
} catch (IOException e1) {
System.out.println("fehler in der Ausgabe von out");
e1.printStackTrace();
}
inputfield.setText("");
return true;
}
return false;
}
public void say(String msg)
{
outputarea.appendText("*** "+msg+" ***\n");
}
public void destroy()
{
try
{
socket.close();
} catch (IOException e)
{
System.out.println(e.toString());
}
if ((thread !=null) && thread.isAlive())
{
thread.stop();
thread = null;
}
}
public static void main(String[] args) {
JFrameChat jfc = new JFrameChat("www.Systemhaus-Schuth.de - Communication Software");
jfc.pack();
jfc.setSize(500, 300);
jfc.start();
}
}
die Klasse tcpContent (inhalt -> object)
Code:
import java.io.Serializable;
public class tcpContent implements Serializable {
private static final long serialVersionUID = -3933058717055994310L;
public tcpContent() {
}
String chatText;
String username;
// Getter and Setter CHATTEXT
public void setChatText(String a) {
this.chatText = a;
}
public String getChatText() {
return this.chatText;
}
// Getter and Setter USERNAME
public void setUsername(String n) {
this.username = n;
}
public String getUsername() {
return this.username;
}
}
Mein fehler ist folgender:
die Nachricht wird nur beim ersten mal ausgeliefert, mehr oder weniger...
dann kommt:
Fehler:java.io.StreamCorruptedException: invalid type code: AC
Fehler:java.io.StreamCorruptedException: invalid type code: AC
wo liegt mein Fehler :/
danke