多人聊天室的程序设计、编码与分析(三) - 客户端代码分析

客户端代码
package net.java2000.project.chat;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 
 * @author 老紫竹 www.java2000.net
 * 
 */
class ChatClient extends Frame {
  private static final long serialVersionUID = -6290371526617318074L;
  public static void main(String[] args) {
    new ChatClient("chat");
  }
  Button b = new Button("send");
  Socket s = null;
  DataOutputStream dos = null;
  TextField tf = new TextField();
  TextArea ta = new TextArea();
  DataInputStream dis = null;
  boolean bconnected = false;
  ChatClient(String s) {
    super(s);
    setLocation(400, 300);
    setVisible(true);
    setSize(300, 300);
    setLayout(new BorderLayout());
    add("East", b);
    Monitor1 monitor = new Monitor1();
    b.addActionListener(monitor);
    tf.addKeyListener(monitor);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        setVisible(false);
        disconnected();
        System.exit(0);
      }
    });
    add("South", tf);
    add("North", ta);
    pack();
    connect();
    new Thread(new RecvThread()).start();
  }
  public void connect() {
    try {
      s = new Socket("127.0.0.1", 7000);
      dos = new DataOutputStream(s.getOutputStream());
      dis = new DataInputStream(s.getInputStream());
      System.out.println("connected");
      bconnected = true;
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  public void disconnected() {
    try {
      dos.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    try {
      s.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  class Monitor1 extends KeyAdapter implements ActionListener, KeyListener {
    @Override
    public void keyReleased(KeyEvent e) {
      if (e.getKeyCode() == KeyEvent.VK_ENTER) {
        doSend();
      }
    }
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == b) {
        doSend();
      }
    }
    private void doSend() {
      if (bconnected) {
        String str = tf.getText().trim();
        if (str.length() == 0) {
          return;
        }
        tf.setText("");
        try {
          dos.writeUTF(str);
          dos.flush();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
    }
  }
  private class RecvThread implements Runnable {
    public void run() {
      try {
        while (bconnected) {
          String str = dis.readUTF();
          ta.append(str + "\n");
        }
      } catch (java.net.SocketException ex) {
        bconnected = false;
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
快乐渡过每一天,减肥坚持每一天