march alex's blog
hello,I am march alex
posts - 52,comments - 7,trackbacks - 0
这是我很多月以前学习马士兵的Java教学视频的时候在教程的基础上稍微改进了一点的一个聊天室软件。
聊天室软件分为ChatClient类和ChatServer类。
ChatServer相当于一个服务器。
ChatClient类相当于一个客户端。
用户可以通过客户端进行聊天。
客户端登录时会询问你的姓名,输入姓名后大家就可以基于此聊天室软件进行聊天了。

CHatClient.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ChatClient extends Frame {
    Socket socket = null;
    DataOutputStream dos = null;
    DataInputStream dis = null;
    private boolean bConnected = false;
    private String name;
    //private boolean named = false;
    
    TextField tfTxt = new TextField();
    TextArea taContent = new TextArea();
    
    Thread tRecv = new Thread(new RecvThread());
    
    public static void main(String[] args) {
        new ChatClient().launchFrame();
        
    }
    
    public void launchFrame() {
        setLocation(400, 300);
        this.setSize(300, 300);
        add(tfTxt, BorderLayout.SOUTH);
        add(taContent, BorderLayout.NORTH);
        pack();
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                disconnect();
                System.exit(0);
            }
        });
        
        setVisible(true);
        connect();
        
        tfTxt.addActionListener(new TFListener());
        
        //new Thread(new RecvThread()).start();
        tRecv.start();
    }
    
    public void connect() {
            try {
                socket = new Socket("127.0.0.1", 8888);
                dos = new DataOutputStream(socket.getOutputStream());
                dis = new DataInputStream(socket.getInputStream());
                System.out.println("connected!");
                taContent.setText("你叫什么名字?\n");
                bConnected  = true;
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    
    public void disconnect() {
        try {
            dos.close();
            dis.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        /*
        try {
            bConnected = false;
            tRecv.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                dos.close();
                dis.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
*/
    }
    
    private class TFListener implements ActionListener {
        
        private boolean named = false;
        
        public void actionPerformed(ActionEvent e) {
            
            String str = tfTxt.getText().trim();
            //taContent.setText(str);
            tfTxt.setText("");
            
            if(named == false) {
                named = true;
                name = str;
                try {
                    dos.writeUTF(name+" is coming!");
                    dos.flush();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                return;
            }
            
            try {
                //dos = new DataOutputStream(socket.getOutputStream());
                dos.writeUTF(name + ":" + str);
                dos.flush();                    //dos.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
        
    } 
    
    private class RecvThread implements Runnable {
        
        private String name;

        public void run() {
            /*
            while(bConnected) {
                try {
                    String str = dis.readUTF();
                    //System.out.println(str);
                    taContent.setText(taContent.getText()+str+'\n');
                } catch (SocketException e) {
                    System.out.println("退出了,bye!");
                } catch (EOFException e) {
                    System.out.println("退出了,bye - bye!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
*/
            try {
                while(bConnected) {
                    String str = dis.readUTF();
                    //System.out.println(str);
                    taContent.setText(taContent.getText()+str+'\n');
                }
            } catch (SocketException e) {
                System.out.println("退出了,bye!");
            } catch (EOFException e) {
                System.out.println("退出了,bye - bye!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
}

ChatServer.java
import java.io.*;
import java.net.*;
import java.util.*;

public class ChatServer {
    boolean started = false;
    ServerSocket ss = null;
    
    List<Client> clients = new ArrayList<Client>();
    
    public static void main(String[] args) {
        new ChatServer().start();
    }
    
    public void start() {
        try {
            ss = new ServerSocket(8888);
            started = true;
        } catch (BindException e) {
            System.out.println("端口使用中");
            System.out.println("请关掉相应程序并重新运行服务器!");
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        try {
            while(started) {
                Socket s = ss.accept();
                Client c = new Client(s);
                System.out.println("a client connected!");
                new Thread(c).start();
                clients.add(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
    
    class Client implements Runnable {
        private Socket s;
        private DataInputStream dis = null;
        private DataOutputStream dos = null;
        private boolean bConnected = false;
        
        public Client(Socket s) {
            this.s = s;
            try {
                dis = new DataInputStream(s.getInputStream());
                dos = new DataOutputStream(s.getOutputStream());
                bConnected = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public void send(String str) {
            try {
                dos.writeUTF(str);
            } catch (IOException e) {
                clients.remove(this);
                System.out.println("对方退出了!我从List里面去掉了!");
                //e.printStackTrace();
            }
        }
        
        public void run() {
            try {
                while(bConnected) {
                    String str = dis.readUTF();
                    System.out.println(str);
                    for(int i=0;i<clients.size();i++) {
                        Client c = clients.get(i);
                        c.send(str);
                    }
                    /*
                    for(Iterator<Client> it = clients.iterator(); it.hasNext(); ) {
                        Client c = it.next();
                        c.send(str);
                    }
                    
*/
                    /*
                    Iterator<Client> it = clients.iterator();
                    while(it.hasNext()) {
                        Client c = it.next();
                        c.send(str);
                    }
                    
*/
                }    
            } catch (EOFException e) {
                System.out.println("Client closed!");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(dis != null) dis.close();
                    if(dos != null) dos.close();
                    if(s != null) {
                        s.close();
                        s = null;
                    }
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
}

posted on 2015-03-09 08:39 marchalex 阅读(130) 评论(0)  编辑  收藏 所属分类: java小程序

只有注册用户登录后才能发表评论。


网站导航: