Socket Chatserver mit mehreren OutputStreams

Messoras

Aktives Mitglied
Hallo,
Ich versuche mich momentan an einem kleinen Server.
Erstmal soll er nur von verschiedenen Clients Nachrichten bekommen und die an alle anderen weitergeben...
Da das ganze auch im Netzwerk funktionieren soll, habe ich versucht das ganze über ein Socket laufen zu lassen.
Ich habe einen Server, der Anfangs wartet, bis eine Verbindung reinkommt und einen Client, der über In- und OutputStreams mit dem Server kommunizieren kann.
Der EchoServer hat schonmal funktioniert, aber wenn ich jetzt versuche dem Server mehrere OutputStreams zu geben, damit er jeden Client einzeln anschreiben kann, dann kommt bei den Clients nichts mehr an...

Hier ist der Code:

Server
Code:
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class Server extends JFrame
{
    private TextArea info;
    private JButton exit;
    public String ip = "127.0.0.1";
    public int port = 8080;

    static ServerSocket serverSocket;
    static Socket socket;
    static DataOutputStream out[];
    static DataInputStream in;
    Socket[] sockets;
    int sindex;

    public Server(String n0, String ip0, int port0)
    {
        super(n0);
        ip = ip0;
        port = port0;
        sindex = 0;
        out = new DataOutputStream[20];
        init();
        start();
    }

    public void start() {
        try {
            info.append("Starting server...\n");
            repaint();
            serverSocket = new ServerSocket(port);
            info.append("Server started.\n");
            info.append("Awaiting client connection...\n");
            waitforclients();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void waitforclients () {
        SwingWorker<Void, Void> tunerWorker = new SwingWorker<Void, Void>() {

                @Override
                protected Void doInBackground() {
                    try{
                        while(sindex < 20) {
                            Thread.sleep(100);
                            socket = serverSocket.accept();
                            info.append("Connection from: "+ socket.getInetAddress()+".\n");
                            repaint();
                            in = new DataInputStream(socket.getInputStream());
                            out[sindex] = new DataOutputStream(socket.getOutputStream());
                            out[sindex].writeUTF("<Welcome to the server!>");
                            String n = "";
                            n = in.readUTF();
                            sendtoall(n+" joined the server.");
                            repaint();
                            receive();
                            sindex++;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();

                    }
                    return null;
                }
            };
        tunerWorker.execute();
    }

    public void sendtoall(String s) {
        try {
            for (int i = 0; i < sindex; i++) {
                out[i].writeUTF(s);
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void receive() {
        SwingWorker<Void, Void> tunerWorker = new SwingWorker<Void, Void>() {

                @Override
                protected Void doInBackground() {
                    try{
                        while(!socket.isClosed()) {
                            if (in!=null) {
                                String s = in.readUTF();
                                String n = s.substring(0,s.indexOf("#"));
                                String t = s.substring(s.indexOf("#")+1);
                                sendtoall("<"+n+"> : "+t);
                                info.append("Msg received: "+s+"\nSIndex = "+sindex+"\n");
                            }
                            repaint();
                            Thread.sleep(100);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            };
        tunerWorker.execute();
    }

    public Server()
    {
        super("Local Server");
        ip = "localhost";
        port = 8080;
        sockets = new Socket[20];
        sindex = 0;
        out = new DataOutputStream[20];
        init();
        start();
    }

    private void init() {
        this.setSize(400,255);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setLayout(null);

        info = new TextArea("Server IP         = "+ip+"\nServer PORT  = "+port+"\n");
        info.setBounds(10,10,360,165);
        info.setEditable(false);
        this.add(info);

        exit = new JButton("Shutdown");
        exit.setBounds(80,185,200,20);
        exit.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    info.append("Shutting down server...\n");
                    info.append("Closing socket...\n");
                    try {
                        if (socket!=null) {
                            sendtoall("<Server is shutting down...>");
                            socket.close();
                            info.append("Done.\n");
                            sendtoall("<The server is now offline.>");
                        }
                        else {
                            info.append("No active connections.\n");
                        }
                    } catch(IOException ex) {
                        ex.printStackTrace();
                    }

                    //System.exit(0);
                }
            }
        );
        this.add(exit);
    }
}


Client
Code:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import java.io.*;

public class Client extends JFrame
{
    public String name;
    private TextField serverip, serverport, clientname, msg;
    private JButton connect;
    private TextArea text;

    static Socket socket;
    static DataInputStream in;
    static DataOutputStream out;

    public Client()
    {
        super("Chat Client");
        this.setSize(800,450);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLayout(null);

        clientname = new TextField("Client");
        clientname.setBounds(600,10,170,20);
        clientname.setEditable(true);
        this.add(clientname);

        serverip = new TextField("127.0.0.1");
        serverip.setBounds(10,10,80,20);
        serverip.setEditable(true);
        this.add(serverip);

        serverport = new TextField("8080");
        serverport.setBounds(100,10,80,20);
        serverport.setEditable(true);
        this.add(serverport);

        connect = new JButton("Connect");
        connect.setBounds(190,10,100,20);
        connect.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    connect(serverip.getText(),Integer.parseInt(serverport.getText()));
                }
            }
        );
        this.add(connect);

        text = new TextArea("");
        text.setBounds(10,40,760,300);
        text.setEditable(false);
        this.add(text);

        msg = new TextField("");
        msg.setBounds(10,350,760,20);
        msg.setEditable(true);
        this.add(msg);
        msg.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e)
                {
                    send(msg.getText());
                    msg.setText("");
                }
            }
        );

        name = "Client";
    }

    public void send(String s) {
        try {
            s=clientname.getText()+"#"+s;
            out.writeUTF(s);
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }

    public void receive() {
        SwingWorker<Void, Void> tunerWorker = new SwingWorker<Void, Void>() {

                @Override
                protected Void doInBackground() {
                    try{
                        while(socket.isConnected()) {
                            Thread.sleep(100);
                            if (in!=null) {
                                text.append(in.readUTF()+"\n");
                            }
                            repaint();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            };
        tunerWorker.execute();
    }

    private void connect(String serverip0, int serverport0)
    {
        text.append("Trying to connect to host... [IP="+serverip0+" | PORT="+serverport0+"]\n");
        try{
            socket = new Socket(serverip0,serverport0);
            text.append("Connected to "+socket+"\n");
            text.append("Connection success!\n");
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());
            out.writeUTF(clientname.getText());
            text.append(in.readUTF()+"\n");
        } catch (IOException e) {
            e.printStackTrace();
            text.append("Server address or port may be incorrect.\n");
        }
        receive();
    }
}

Irgendwo scheint da ein Problem beim OutputStream Array des Servers zuu liegen.
Könnte mir jemand weiterhelfen?

Gruß,
Messoras
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I ChatServer Netzwerkprogrammierung 9
J Socket Chatserver aus dem Internet nicht erreichbar Netzwerkprogrammierung 19
J Implementation Chatserver Netzwerkprogrammierung 4
L Probleme bei Chatserver Netzwerkprogrammierung 6
A ChatServer Grafisch aufbauen Netzwerkprogrammierung 4
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18
F Schulprojekt erweitern - Online Quiz mit mehreren Clients - Was benötige ich ? Netzwerkprogrammierung 0
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
D Netzwerkprobleme bei mehreren Clients Netzwerkprogrammierung 4
F Peer to Peer Verbindung zwischen mehreren Clients? Netzwerkprogrammierung 8
A Server mit mehreren Clients Netzwerkprogrammierung 2
B Rmi Kommunikation Server zu mehreren Clients? Netzwerkprogrammierung 3
T Chat mit mehreren Clients Netzwerkprogrammierung 3
A Geöffnete ObjectStreams aus mehreren Methoden nutzen Netzwerkprogrammierung 4
R Problem mit mehreren Anfragen auf demselben Port Netzwerkprogrammierung 2
T RMI mit mehreren Servern? Netzwerkprogrammierung 3
J Kommunikation zw. Server und mehreren Clints haut nicht hin Netzwerkprogrammierung 2
L Logingeschützte Website mit mehreren Accs auslesen Netzwerkprogrammierung 3
D Kommunikation zwischen mehreren Servlets??? Netzwerkprogrammierung 3
P Zeit zwischen mehreren Client log-ins bestimmen. Netzwerkprogrammierung 2
S Server mit mehreren Clients Nachrichten austauschen Netzwerkprogrammierung 6
D RMI Character Encoding bei In- / OutputStreams Netzwerkprogrammierung 2
S Socket OutputStreams senden zu oft Netzwerkprogrammierung 6
G Blockieren beim Öffnen der In und Outputstreams Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben