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("");
已经足够了。
所以我有一个来自教程的基本聊天,除了没有消息外,一切都很好。 我的意思是服务器 运行 客户端也是...但是发送按钮或其他什么有问题?是啊是的 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("");
已经足够了。