socket编写的聊天软件聊天有一问题求解
程序虽然可以聊天,但是需要两边都要说话信息才能显示在窗口里面,下面是主要的代码,请各位帮忙看一看,指导一下,感激不尽。
public ChatFrame(final String name, Socket socket) {
this.name = name;
this.socket = socket;
initComponents();
this.setTitle("正在与" + name + "聊天中");
try {
pw = new PrintWriter(socket.getOutputStream(), true);
din = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
dou = new DataOutputStream(this.socket.getOutputStream());
} catch (
IOException ex) {
Logger.getLogger(ChatFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
// TODO add your handling code here:
if (jTextArea1.getText() != null) {
if (pw != null) {
String info = jTextArea1.getText();
pw.println(info);
pw.flush();
jTextArea2.append("我说:" + jTextArea1.getText() + "\n");
System.out.print("连天信息已发送" + "/n");
jTextArea1.setText("");
} else {
JOptionPane.showMessageDialog(null, "您的好友已经离线!不能发送消息!");
}
} else {
JOptionPane.showMessageDialog(null, "发送的消息不能为空!");
}
new Thread(new Runnable() {
public void run() {
while (true) {
try {
String info = din.readLine();
jTextArea2.append(name + "说:" + info + "\n");
} catch (Exception e) {
return;
}
}
}
}).start();
}
------解决方案--------------------
String info = din.readLine();
readLine();<---这个方法是堵塞线程,
din这个输入流没有收到信息之前这句代码是不会向下执行的
所以如果要聊天的话 起码需要两个线程
一个是输入线程,专门负责接收信息,并且显示在Swing组件上
另一个是输出线程,专门负责取得Swing组件上的内容并,发送信息。
------解决方案--------------------
Sorry我刚刚没有仔细看你的代码就回复了。
我刚刚初步的看了一下你的代码,没有发现问题。
你看看是不是你的转发信息的那个线程里面出的问题
------解决方案--------------------
为什么要把接收消息的线程放到jButton2ActionPerformed这个方法里面呢,把它移到构造函数里面试试