Seridor(Socket) travando

E ai galera! blz! Minha dúvida e meu grande problema é o seguinte: é natural uma aplicação cliente/servidor usando socket deixar o servidor lento, mesmo tendo apenas um cliente conectado?? Minha aplicação envia datagrams para os clientes, porém quando eu conecto qualquer cliente na minha máquina servidor ela trava geral e mesmo quando eu fecho o cliente ela ainda fica travada. E agora qual é problema?? segue abaixo o código que conecta o cliente, vejam se eu estou erando em alguma coisa??
Falow’s e desde já agradeço!!

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Server extends JInternalFrame implements MessageListener{
  private JTextField enterField;
  private JTextArea displayArea,nickArea;
  private ObjectOutputStream output;
  private ObjectInputStream input;
  private ServerSocket server;
  private Socket connection;
  private final String MESSAGE_SEPARATOR = ">>>";

  public Server(){
    setTitle("Servidor");

    Container container= getContentPane();


    enterField= new JTextField();
    enterField.setEnabled(false);

    enterField.addActionListener(
       new ActionListener(){
          public void actionPerformed(ActionEvent e){
             messageReceived("wso",e.getActionCommand());
          }
       }
    );

    container.add(enterField, BorderLayout.NORTH);

    displayArea= new JTextArea();
    displayArea.setEditable(false);
    container.add(new JScrollPane(displayArea),BorderLayout.CENTER);

    nickArea= new JTextArea(10,10);
    nickArea.setEditable(false);
    nickArea.append("");
    container.add(new JScrollPane(nickArea),BorderLayout.EAST);
   
   
    setSize(300,150);

  }

  public void runServer(){
    try{
      server= new ServerSocket(5000,100);
      displayArea.append("Servidor conectando a porta 5000 ..." );
      while(true){
         Socket clientSocket = server.accept();
        new ReceivingThread(this,clientSocket).start();

        System.out.println("O filha da mãe da máquina "+ clientSocket.getInetAddress() +" se conectou");

        enterField.setEnabled(true);
      }
    }

     catch(IOException ioException){
       ioException.printStackTrace();
     }
  }

  public void messageReceived(String from,String message){
     String completeMessage = from + MESSAGE_SEPARATOR + message;

     displayArea.append("\n" + from+MESSAGE_SEPARATOR+message);
     displayArea.setCaretPosition(displayArea.getText().length());

     new MulticastSendingThread(completeMessage.getBytes()).start();
  }

  public static void main(String args[]){
     Server application= new Server();
     application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     application.runServer();
  }
} 

Cara o problema é q vc colocou tudo numa thread só :smiley:

Eu naum entendi todo o seu código, mas oq tá dando problema é o método public void runServer(). Olha:

server= new ServerSocket(5000,100);

Com isso vc levanta o seu server, fazendo sua aplicação ficar escutando na porta 5000.

while(true){

Aki fode tudo. Vc entra num loop infinito q nunca acaba ( while(true) sem nenhum break lá dentro!) Essencialmente, é ISSO q tá travando o seu server, ele entra nesse método e nunca mais sai!

 Socket clientSocket = server.accept();

Com o método accept() vc tá falando pra bloquear aí até q algum client conecte no seu server, vai ficar tudo travado aí até q algum client conecte, e qd algum conhectar vc só vai rodar as outras 3 linhas e recomeçar o loop, bloqueando nesse método dinovo.

O resto do código eu entendi pouco, parece q vc abre uma janela AWT q naum entendi pra q serve, e tb tem esses metodos messageReceived q eu naum entendi.

Eu percebi q sempre q um client conecta vc instancia uma thread nova pra conversar com ele e passa o Socket criado pra essa thread. Bliz isso tá certo, daí a thread vai ficar conversando com o client na boa.
Mas eu naum percebi nada sobre vc ter uma thread tratando o server. Em essência ele é levantado qd alguém chama o método runServer(), q naum é um Runnable pra fácil integração com Thread. Se quem chamar esse método perceber isso e escrever uma Thread pra rodar esse objeto blz, mas como eu disse pelo fato desse método nunca retornar, quem chamar ele vai travar aí dentro. Se uma thread com mais coisa pra fazer chamar ele ela vai travar.

Oq vc precisa fazer é criar uma Thread SÓ pra ficar tratando o server, rodando o loop infinito q chama o server.accept() e bloqueia aí.
Daí, como vc fez, sempre q um client conectar vc instancia uma thread pra conversar com ele.

Minha sugestão é vc separar esse código da janela do código da rede, extender uma Thread e mudar o nome do runServer() pra run(). Vc deixa essa thread só por conta de ficar esperando client conectar e cria métodos na classe pra fazer oq for preciso, como dizer q o server deve fechar.
Aí no seu programa qd vc quiser levantar o server é só instanciar esse objeto e dar start() nele pra ele ficar rodando sem travar mais nada no programa.