发送按钮在聊天服务器应用程序中不起作用

时间:2015-01-29 15:50:27

标签: java swing sockets event-dispatch-thread

好的,我知道这里有很多类似的问题,但我无法通过它们找出问题。所以我必须发布这个。对于那些家伙。这是我的问题...我做了一个聊天服务器,几天前在netbeans控制台上工作,输出正常。但现在我正在使用Jframes。但是,当我点击一个客户端框架上的发送按钮时,按钮冻结,没有任何反应。该消息不会转到第二个客户端的另一帧。

这是我的客户端代码。我已经在客户端类中创建了线程类。我不知道这是否会产生问题。

public class chat extends javax.swing.JFrame {
    Socket socket;
    DataOutputStream dos  ;
chat() {
       initComponents();
}


private void sendActionPerformed(java.awt.event.ActionEvent evt) {                                     
try{
   dos = new DataOutputStream(socket.getOutputStream());

        String data ="";
        data = msg.getText();
      do{
            dos.writeUTF(msg.getText());
            dos.flush();
        }
          while(data!= "stop");

      } 
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(this, e, "Error @ Cthread1", JOptionPane.ERROR_MESSAGE);
    }
    finally{
        try{

        dos.close();
    }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(this,e,"Error @Finally of Cthread1",JOptionPane.ERROR_MESSAGE);
        }
    }


}                                    

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
                  try{
           chat n = new chat();
         n.run();
         n.setVisible(true);
            }catch(Exception e){
                JOptionPane.showMessageDialog(null,e,"main",JOptionPane.ERROR_MESSAGE);
            }       
            }
    });
}                     
private javax.swing.JLabel jLabel1;
public javax.swing.JTextField msg;
private javax.swing.JButton send;              

public void run()
  {
try{

 socket = new Socket("127.0.0.1", 1036);
 dos = new DataOutputStream(socket.getOutputStream());

  Cthread2 thread2 = new Cthread2(socket);
  thread2.start();
}
 catch(Exception e){
    JOptionPane.showMessageDialog(null, e,"Error @ MAin run",      JOptionPane.ERROR_MESSAGE);
  }
}


class Cthread2 extends Thread{
  Socket socket;
Cthread2(Socket socket) {
  this.socket = socket;
 }
 public void run() {
 try {
 String fromServer ="";
     while(fromServer != "stop")
     {
         DataInputStream sr = new DataInputStream(socket.getInputStream());
        fromServer = sr.readUTF();
            msg.setText(fromServer);
     }
  } catch (IOException e) {
   JOptionPane.showMessageDialog(null,e,"Error @ Cthread2", JOptionPane.ERROR_MESSAGE);
 }
}

}

}

这是我的服务器类

public class Multiserver {

ServerSocket serversocket;
Socket socket;
ArrayList<Socket> al = new ArrayList<Socket>();
DataInputStream dis;
DataOutputStream dos;
Multiserver() throws IOException
{

     serversocket = new ServerSocket(1036);
     //JOptionPane.showMessageDialog(null,"Server Started on port 1036","Info !", JOptionPane.ERROR_MESSAGE);
      System.out.println("Server Started on port 1036");
    while(true)
    {

        socket = serversocket.accept();
        System.out.println(socket);
        al.add(socket);
        Pthread  thread = new Pthread(socket, al);
        thread.start();


    }

这是服务器线程

 public class Pthread extends Thread {


 DataInputStream dis;
 DataOutputStream dos;
 ArrayList al;
 Socket socket;
 Pthread(Socket socket, ArrayList al)
 {
    this.al = al;
    this.socket = socket;

 }
  public void run()
   {
    try{
        String data =new chat().msg.getText();
        dis = new DataInputStream(socket.getInputStream());
        while(data != null)
        {
            data = dis.readUTF();
            if(data != "stop")
              broadcast(data);
            else
            {
                dos = new DataOutputStream(socket.getOutputStream());
                dos.writeUTF(data);
                dos.flush();

            }
        }
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(null,e,"Error @run",JOptionPane.ERROR_MESSAGE);
    }




  }

   public void broadcast(String data )

    {
    try{
    Iterator it = al.iterator();
    while(it.hasNext())
    {
       Socket socket1 = (Socket)it.next();
        dos = new DataOutputStream(socket1.getOutputStream());
        dos.writeUTF(data);
        dos.flush();


    }
    }
    catch(Exception e){
           JOptionPane.showMessageDialog(null, e,"Error @ broadcast",JOptionPane.ERROR_MESSAGE);
            }
 }


}

我试着找出问题所在,但我似乎无法得到它。当我试图在我的脑海里运行程序来理解它时,我陷入困境。令人沮丧。感谢任何能帮助我解决问题的人。是的我试图将以前在控制台上工作的程序更改为使用框架的程序。

1 个答案:

答案 0 :(得分:2)

data = msg.getText();
do{
      dos.writeUTF(msg.getText());
      dos.flush();
  }
while(data!= "stop");

=如果第一个getText没有返回&#34;停止&#34; <无效循环。

如果您真的想以这种方式执行此操作,则必须在循环内更新data,以便根据当前条目进行评估。但即使这样也不行。您将充斥服务器,因为您不会等到msg文本发送前发生更改。因此,如果msg包含&#34; hello&#34;,这将向您的服务器发送很多问候,然后才能写出&#34; stop&#34; ...

为什么不一次发送一行( - &gt;这里没有循环)?

此外,您无法将字符串值与==或!=进行比较,请使用String.equals。请参阅this关于该主题的高评价答案。

另外,在安德鲁如此真实地提及的情况下,不要在美国东部时间做网络活动。