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
Client
Irgendwo scheint da ein Problem beim OutputStream Array des Servers zuu liegen.
Könnte mir jemand weiterhelfen?
Gruß,
Messoras
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