Chat聊天 - 客户端

引用
ChatClient.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.SocketException;
import java.net.UnknownHostException;

/**
 * 聊天客户端
 * @author Administrator
 */
public class ChatClient extends Frame {

    private Socket s = null;
    private DataOutputStream dos = null;
    private DataInputStream dis = null;
    private TextField tfText = new TextField();
    private TextArea taContent = new TextArea();
    //解决空指针问题;
    private boolean bconnected = false;

    Thread recv = new Thread(new RecvClient());
    public static void main(String[] args) {
        new ChatClient().launchFrame();
    }

    /**
     * 1、创建一个窗口;
     * 2、分部窗口布局;
     * 3、响应窗口关闭按钮;
     */
    public void launchFrame() {
        setLocation(400, 300);
        setSize(300, 300);
        add(tfText, BorderLayout.SOUTH);
        add(taContent, BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {
            @Override
            //关闭窗口
            public void windowClosing(WindowEvent arg0) {
                disconnect();
                System.exit(0);
            }
        });
        tfText.addActionListener(new TFListener());
        setVisible(true);
        connect();
        recv.start();
    }

    //连接Socket,建立输入、输出管道;
    public void connect() {
        try {
            s = new Socket("127.0.0.1",8888);
            dos = new DataOutputStream(s.getOutputStream());
            dis = new DataInputStream(s.getInputStream());
System.out.println("connect!");
            bconnected = true;
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }      
    }

    //关闭窗口时必做的事
    public void disconnect(){
        try {
            bconnected = false;
            s.close();
            dos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 1、响应addActionListener;
     * 2、发送消息;
     */
    private class TFListener implements ActionListener {

        //将自己发出的消息显示在窗口里并发送给服务器端
        public void actionPerformed(ActionEvent e) {
            String str = tfText.getText().trim();
            tfText.setText(""); 
            try {
                dos.writeUTF(str);
                dos.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }        
    }

    /**
     * 1、创建一个线程解决多个客户端连接不能发送消息的问题;
     * 2、接收服务器端发过来的消息并显示在窗口里;
     */
    private class RecvClient implements Runnable {

        //线程起动
        public void run() {
            try {
                while(bconnected) {
                    String str = dis.readUTF();
                    System.out.println();
                    taContent.setText(taContent.getText() + str + '\n');   
                }
            } catch(SocketException e) {
                System.out.println("Client exit!");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }      
    }

你可能感兴趣的:(java,thread,.net,socket,dos)