注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一个博客

两个标题

 
 
 

日志

 
 

聊天软件,点对点(只有两人)  

2007-08-24 23:28:03|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
功能不是很完善
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
class MyFrame extends Frame {
    public TextArea getMessage;
    public TextField sendMessage;
    public Button getIP;
    public Chose ch;
    int flag;//记录选择了哪个端
    boolean isConnect;//确认连接
    MyFrame(String name) {
        super(name);
        getMessage = new TextArea();
        sendMessage = new TextField();
        getIP = new Button("请输入IP");
        isConnect = false;
        ch = new Chose(this);
        getMessage.setEditable(false);
        sendMessage.setEditable(false);
        this.add(getMessage,BorderLayout.CENTER);
        this.add(sendMessage,BorderLayout.SOUTH);
        this.add(getIP,BorderLayout.NORTH);
        pack();
        this.setBounds(10, 10, 500, 500);
        this.addWindowListener(new MyClose());
        sendMessage.addActionListener(new TextSend(this));
        getIP.addActionListener(ch);
        this.setVisible(true);
    }
    class MyClose extends WindowAdapter {
        public void windowClosing(WindowEvent e){
            /*try {
                isConnect = false;
                if(flag == 0) {
                    ch.ser.dis.close();
                    ch.ser.dos.close();
                    ch.ser.send.close();
                } else {
                    ch.con.dis.close();
                    ch.con.dos.close();
                    ch.con.send.close();
                }
                System.exit(0);
            } catch(IOException e2) {
                e2.printStackTrace();
            } finally {
                System.exit(-1);
            }*/
            new BeSureClose();
        }
    }
    class BeSureClose extends Frame {
        Button yes;
        Button no;
        Label l;
        Panel p;
        BeSureClose() {
            super("警告");
            l = new Label("确定要退出吗?");
            yes = new Button("恩");
            no = new Button("不");
            p = new Panel();
            p.setLayout(new FlowLayout());//确定布局,布局为流水式,要是不写,默认为BordLayout
            p.add(yes);
            p.add(no);
            yes.addActionListener(new Yes());
            no.addActionListener(new No());
            add(l,BorderLayout.CENTER);
            add(p,BorderLayout.SOUTH);
            this.addWindowListener(new MyClose1());
            pack();
            setVisible(true);
        }
        class MyClose1 extends WindowAdapter {
            public void windowClosing(WindowEvent e){
                setVisible(false);//这个不能关闭程序
            }
        }
        class Yes implements ActionListener {
            public void actionPerformed(ActionEvent arg0) {
                try {
                    isConnect = false;
                    if(flag == 0) {
                        ch.ser.dis.close();
                        ch.ser.dos.close();
                        ch.ser.send.close();
                    } else {
                        ch.con.dis.close();
                        ch.con.dos.close();
                        ch.con.send.close();
                    }
                    System.exit(0);
                } catch(IOException e2) {
                    e2.printStackTrace();
                } finally {
                    System.exit(-1);
                }
            }
        }
        class No implements ActionListener {
            public void actionPerformed(ActionEvent arg0) {
                setVisible(false);
            }
        }
    }
}
class Server {
    MyFrame mf;
    ServerSocket ss;
    Socket send;
    DataInputStream dis;
    DataOutputStream dos;
    Server(MyFrame mf) {
        try {
            this.mf = mf;
            ss = new ServerSocket(8888);
            send = ss.accept();
            dis = new DataInputStream(send.getInputStream());
            dos = new DataOutputStream(send.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void send(String s) {
        SendMes sm = new SendMes(mf,dos,s);
        Thread t = new Thread(sm);
        t.start();
    }
    public void get() {
        GetMes gm = new GetMes(mf,dis);
        Thread t = new Thread(gm);
        t.start();
    }
}
class SendMes implements Runnable {
    MyFrame mf;
    String s2;
    DataOutputStream dos;
    SendMes(MyFrame mf,DataOutputStream dos,String s2) {
        this.mf = mf;
        this.dos = dos;
        this.s2 = s2;
    }
    public void run() {
        try {
            dos.writeUTF(s2);
            dos.flush();
        } catch(IOException e) {
            try {
                dos.close();
            } catch (IOException e1) {
                System.exit(-1);
            }
            e.printStackTrace();
        }
    }
}
class GetMes implements Runnable {
    MyFrame mf;
    DataInputStream dis;
    GetMes(MyFrame mf,DataInputStream dis) {
        this.mf = mf;
        this.dis = dis;
    }
    public void run() {
        try {
            while(mf.isConnect) {
                String mess = dis.readUTF();
                mf.getMessage.append("\n" + mess + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class Connect {
    String IPAdd;
    int port;
    Socket send;
    MyFrame mf;
    DataInputStream dis;
    DataOutputStream dos;
    Connect(String IP,int port,MyFrame mf) {
        IPAdd = IP;
        this.port = port;
        this.mf = mf;
        try {
            send = new Socket(IPAdd,port);
            dis = new DataInputStream(send.getInputStream());
            dos = new DataOutputStream(send.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void send(String s) {
        SendMes sm = new SendMes(mf,dos,s);
        Thread t = new Thread(sm);
        t.start();
    }
    public void get() {
        GetMes gm = new GetMes(mf,dis);
        Thread t = new Thread(gm);
        t.start();
    }
}
class TextSend implements ActionListener {
    MyFrame mf;
    TextSend(MyFrame mf) {
        this.mf = mf;
    }
    public void actionPerformed(ActionEvent e) {
        String message = mf.sendMessage.getText();
        if(mf.flag == 0) {
            mf.ch.ser.send(message);
        }
        if(mf.flag == 1) {
            mf.ch.con.send(message);
        }
        mf.sendMessage.setText("");
        mf.getMessage.append(message + "\n");
    }
   
}
class Chose extends Frame implements ActionListener {//监听getIP并且选择是做服务器还是客户机
    Connect con;
    Server ser;
    TextField getRes;//输入框
    String[] IP;//IP地址
    MyFrame mf;
    Chose(MyFrame mf) {//选择是做服务器还是客户机
        super("请选择");
        this.mf = mf;
        getRes = new TextField("输入为空作主机,客户机请输入:127.0.0.1:8888");
        add(getRes);
        getRes.addActionListener(new ChoseEvent());
        pack();
        this.setBounds(10,10,320,60);//适当修改
    }
    public void actionPerformed(ActionEvent arg0) {//监听getIP
        mf.getIP.setEnabled(false);
        setVisible(true);//按按钮,显示Chose
    }
    class ChoseEvent implements ActionListener {//监听getRes的结果
        public void actionPerformed(ActionEvent arg0) {
            String s = getRes.getText().trim();
            getRes.setText("请等待");
            getRes.setEditable(false);//编辑好后不能再编辑
            if(s.equals("")) {//s为空,表示是服务器
                mf.flag = 0;//表示是服务器
                ser = new Server(mf);
                mf.isConnect = true;
                ser.get();
                setVisible(false);
                mf.sendMessage.setEditable(true);
            } else {
                mf.flag = 1;//表示是客户机
                IP = s.split(":");//把String用:分开,例如127.0.0.1:8888被分割为:“127.0.0.1“,”8888”两个部分
                con = new Connect(IP[0],8888,mf);//分别传入IP地址和端口(注:Integer.parseInt(IP[1])是把IP[1](Stirng)转换成INT类型)
                mf.isConnect = true;
                con.get();
                setVisible(false);
                mf.sendMessage.setEditable(true);
            }
        }
    }
}
public class Client {
    public static void main(String[] args) {
        MyFrame mf = new MyFrame("ChatRoom!");
    }
}
关闭时已经添加了关闭提示,防止误关闭。
  评论这张
 
阅读(220)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017