kostenloser Webspace werbefrei: lima-city


Server, Fenster bleibt hängen

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    sirferguson

    sirferguson hat kostenlosen Webspace.

    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();
    	}
    }
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c****s

    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.
  4. Autor dieses Themas

    sirferguson

    sirferguson hat kostenlosen Webspace.

    Hammer, Danke dir es hat funktioniert!
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!