日期:2014-05-20  浏览次数:21075 次

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这个方法里面呢,把它移到构造函数里面试试