Java 没有消息的聊天服务器

Java chat server without messages

所以我有一个来自教程的基本聊天,除了没有消息外,一切都很好。 我的意思是服务器 运行 客户端也是...但是发送按钮或其他什么有问题?是啊是的 server.java 很慢,有时 freeze.I 使用 Netbeans 的框架选项。

这是客户

package chat;

import java.io.DataInputStream;
import java.io.DataOutputStream;

import java.net.Socket;

 public class chat_client extends javax.swing.JFrame {

static DataInputStream din;
static DataOutputStream dout;
static Socket s;


public chat_client() {
    initComponents();
}


private void msg_sendActionPerformed(java.awt.event.ActionEvent evt) {                                         

    try {
    String msgout = "";
   msgout = msg_text.getText().trim();
   dout.writeUTF(msgout);
    } catch(Exception e) {
           }

}                                        

public static void main(String args[]) {




    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new chat_client().setVisible(true);
        }
    });

    try {
         s = new Socket("127.0.0.1",1201); //The Local address because the Computer is the same

         din = new DataInputStream(s.getInputStream());
         dout = new DataOutputStream(s.getOutputStream());
         String msgin = "";


         while(msgin.equals("exit")) {
             msgin = din.readUTF();
             msg_area.setText(msg_area.getText().trim()+"\n Server:\t"+ msgin);

         }
    }catch (Exception e) {
}
}


}

这是服务器

package chat;


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class chat_server extends javax.swing.JFrame {

 static ServerSocket ss;
 static Socket s;
 static DataInputStream din;
  static DataOutputStream dout;

  public chat_server() {
    initComponents();
}




    msg_text.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            msg_textActionPerformed(evt);
        }
    });

    msg_send.setText("Send");
    msg_send.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            msg_sendActionPerformed(evt);
        }
    });



private void msg_textActionPerformed(java.awt.event.ActionEvent evt) {                                         

}                                        

private void msg_sendActionPerformed(java.awt.event.ActionEvent evt) {                                         
   try {




    String msgout = "";
   msgout = msg_text.getText().trim();
   dout.writeUTF(msgout); // sending the server message to the client
  } catch (Exception e) {


  }
}                                        


public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new chat_server().setVisible(true);
        }
    });

    String msgin = "";
    try {
         ss = new ServerSocket(1201); // The server starting port
          s = ss.accept();             // allow Connection


          din = new DataInputStream(s.getInputStream());
         dout = new DataOutputStream(s.getOutputStream());

         while(!msgin.equals("exit")) {
             msg_area.setText(msg_area.getText().trim()+"\n"+msgin);  //Displaying message

    }

    }catch(Exception e) {

    }
}

                  }

在客户端代码中,在 main 方法中 while 循环的条件是错误的,你错过了一个 ! 来否定它(实际上你在服务器上所做的)。所以应该是while (!msgin.equals("exit")).

在服务器代码中,您没有从输入流中读取(实际上您在客户端上是这样做的),因此您错过了 while 循环中的 msgin = din.readUTF(); 语句。
这也是服务器速度慢的原因,它不断循环并在文本上写一个空文本,而它应该在读取输入流上的下一个输入时被阻止。

您可以对代码应用的进一步改进:

  • 使用 camel case for class names(即使用 ChatClient 而不是 chat_client)
  • 使用日志记录机制(即 log4j,或在此示例中使用 System.out.println("log here the "+variable) 调用)来获取操作和交互的反馈
  • 不要离开catch blocks empty:您可能会错过例外情况。所以在 catch 块中至少添加像 System.out.err(e); 这样的语句(但是,同样,最好使用具有正确日志级别的日志库)
  • 发送消息后清除客户端文本字段中的文本(目前文本保留在那里)。 msg_sendActionPerformed 方法的 try 块末尾的 msg_text.setText(""); 已经足够了。