【问题标题】:Java chat server without messages没有消息的 Java 聊天服务器
【发布时间】:2016-04-12 10:04:04
【问题描述】:

所以我有一个教程中的基本聊天,一切都很好,除了一件事没有消息。 我的意思是服务器也在运行客户端......但是发送按钮或其他什么有问题?是的,server.java 很慢,有时会冻结。我使用了 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) {

    }
}

                  }

【问题讨论】:

  • 如果您的聊天程序没有发送消息,那么“一切正常”并不是首先想到的。无论如何,您需要自己调试代码,或者将给定的代码简化为更具可读性的示例
  • 你说得对。我试着更清楚地编辑,这些是我写的部分。

标签: java server client chat


【解决方案1】:

在客户端代码中,在 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_text.setText("");msg_sendActionPerformed 方法的 try 块末尾就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2021-07-23
    • 2017-03-29
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多