Server, Fenster bleibt hängen
lima-city → Forum → Programmiersprachen → Java
ansicht
anwendung
bann
code
dimension
eingehende verbindungen
fenster
holen
import
konsole
listen
message
null
output
port
server
starten
string
swing
verbindung
-
Hallo Leute, ich arbeite momentan an einem Server/Client Chat.
Da ich schon ein bisschen weiter an dem Projekt bin, habe ich mich dazu entschieden die Server Anwendung in einem Fenster laufen zu lassen und nicht nur via Konsole.
Nun mein Problem, sobald ich den Server starte, bleibt das Fenster hängen obwohl der Server läuft, kann mir da jemand helfen?
/** Created on 11.09.09 by Remo Blaser Created under Open Source License take it, change it, deploy it! www.jblog.ch.vu */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Toolkit; import java.awt.event.ActionListener; import java.io.*; import java.net.*; import java.util.*; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Server { public ServerSocket ss; Socket s; @SuppressWarnings("unchecked") Hashtable outputStreams = new Hashtable(); LinkedHashSet<String> users = new LinkedHashSet<String>(); BannUser bUser = new BannUser(); static JTextArea taLog; static Server srv; public DataOutputStream dout; public Server() throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { createWin(); } private static void createWin() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException { UIManager .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); JFrame frmWin = new JFrame("Jat Server"); frmWin.setLayout(new BorderLayout()); frmWin.setMinimumSize(new Dimension(700, 500)); frmWin.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width - frmWin .getWidth()) / 2, (Toolkit.getDefaultToolkit() .getScreenSize().height - frmWin.getHeight()) / 2); frmWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pnlGUI = new JPanel(); JPanel pnlTXT = new JPanel(); pnlGUI.setLayout(new GridBagLayout()); pnlTXT.setLayout(new BorderLayout()); JTabbedPane tabbedPane = new JTabbedPane(); GridBagConstraints c = new GridBagConstraints(); taLog = new JTextArea(); taLog.setEditable(false); taLog.setBackground(Color.BLACK); taLog.setForeground(Color.WHITE); taLog.setFont(new Font(null, Font.BOLD, 12)); taLog.setSize(pnlTXT.getSize()); pnlTXT.add(taLog); JLabel lblPort = new JLabel("Port: "); c.fill = GridBagConstraints.BOTH; c.gridx = 0; c.gridy = 0; pnlGUI.add(lblPort, c); final JTextField txtPort = new JTextField(); c.fill = GridBagConstraints.BOTH; c.gridx = 1; c.gridy = 0; c.weightx = 0.5; pnlGUI.add(txtPort, c); JButton btnStart = new JButton("Starten"); c.fill = GridBagConstraints.BOTH; c.gridx = 0; c.gridy = 1; pnlGUI.add(btnStart, c); btnStart.addActionListener(new ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { String strPort = txtPort.getText(); if (strPort.isEmpty()) { try { srv.listen(6611); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { try { srv.listen(Integer.parseInt(strPort)); } catch (Exception e1) { System.out.println("Dies ist kein Port!"); } } } }); tabbedPane.addTab("GUI ansicht", pnlGUI); tabbedPane.addTab("Konsolen ansicht", pnlTXT); frmWin.add(tabbedPane); frmWin.pack(); frmWin.setVisible(true); } @SuppressWarnings("unchecked") public void listen(int port) throws IOException { // Neuen ServerSocket instanzieren ss = new ServerSocket(port); taLog.append("!> Höre auf " + ss.getInetAddress().getHostAddress() + ":" + ss.getLocalPort() + "\n"); while (true) { // Auf Verbindung warten s = ss.accept(); if (bUser.check(s)) { taLog.append("!> Verbunden mit " + s.getInetAddress() + "\n"); // Eingang einer Verbindung bestätigen dout = new DataOutputStream(s.getOutputStream()); if (!users.isEmpty()) { dout.writeUTF("|¦getusers¦" + users.toString().replaceAll(", ", "¦")); } outputStreams.put(s, dout); // Schliesslich den Server Thread starten new ServerThread(this, s); } else { dout = new DataOutputStream(s.getOutputStream()); dout.writeUTF("|¦info¦banned"); } } } @SuppressWarnings("unchecked") Enumeration getOutputStreams() { // Funktion um die Outputstreams zu holen return outputStreams.elements(); } @SuppressWarnings("unchecked") void SCPsendtoAll(String fullMessage, String[] splitMessage) { synchronized (outputStreams) { // Für jeden Client for (Enumeration e = getOutputStreams(); e.hasMoreElements();) { // den output stream holen DataOutputStream dout = (DataOutputStream) e.nextElement(); // und Message senden try { if (fullMessage.startsWith("|¦message¦")) dout.writeUTF(fullMessage); else if (fullMessage.startsWith("|¦userdisconnect¦")) { users.remove(splitMessage[2]); dout.writeUTF(fullMessage); } else if (fullMessage.startsWith("|¦userconnect¦")) { users.add(splitMessage[2]); dout.writeUTF(fullMessage); } else if (fullMessage.startsWith("|¦nickchange¦")) { users.remove(splitMessage[2]); users.add(splitMessage[3]); dout.writeUTF(fullMessage); } else if (fullMessage.startsWith("|¦userkick¦")) { users.remove(splitMessage[2]); dout.writeUTF(fullMessage); } else if (fullMessage.startsWith("|¦userbann¦")) { users.remove(splitMessage[2]); bUser.bann(s); dout.writeUTF(fullMessage); } } catch (IOException ie) { taLog.append(ie.toString()); } } } } static public void main(String args[]) throws Exception { srv = new Server(); } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
In deinem Eventhandler vom Startbutton rufst du listen auf, dass dann in eine Endlosschleife geht und auf eingehende Verbindungen wartet. Damit tötest du die Eventqueue von Awt/Swing, da du das im selben Thread machst, wie die Message Loop läuft. Warte in einem eigenen Thread auf eingehende Verbindungen und die Message Loop läuft dann wieder und das Fenster verhält sich so wie gewohnt.
-
Hammer, Danke dir es hat funktioniert!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage