A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钟林杰 中级黑马   /  2013-5-14 06:57  /  1789 人查看  /  10 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文


一课聊天小程序花了一个通宵
{:soso_e125:}

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

abstract class ChatWindow
{
        //为了让继承他的子类可以修改文本区域的内容和操作网络,所以将他们设置为protected修饰
        protected DatagramSocket client,server;               
        protected TextArea writeArea,readArea;
       
        //窗体和窗体中的组件不能被修改,所以使用private修饰
        private Frame frame ;
        private Button send,close;
       
        ChatWindow(String IP , int clientPort ,int serverPort)
        {
                try
                {
                        //创建一个接收和发送的套接字
                        client = new DatagramSocket();
               
                        server = new DatagramSocket(serverPort);
                       
                        //连接到指定的服务器
                        client.connect(InetAddress.getByName(IP),clientPort);
                }
                catch(SocketException e)
                {
                        throw new RuntimeException("网络创建失败");                                                                                                       
                }
                catch(UnknownHostException e)
                {
                        throw new RuntimeException("网络连接失败");
                }
               
                ini();       
        }
       
        private void ini()
        {
                //创建发送和关闭两个按键
                send = new Button("发送 Ctr+Enter");
                close = new Button("关闭");
               
               
                //监听关闭按键
                close.addActionListener(new ActionListener()
                {
                        public void actionPerformed(ActionEvent e)
                        {
                                //关闭连接中的套接字
                                client.close();
                                server.close();
                                //退出虚拟机
                                System.exit(0);
                               
                        }
                });
               
                //监听发送按键
                send.addActionListener(new ActionListener()
                {
                        public void actionPerformed(ActionEvent e)
                        {
                                send();
                        }
                });
               
                //设置按键的位置和大小
                send.setBounds(350,410,90,25);
                close.setBounds(450,410,70,25);
               
                //创建输入和读取文本区域
                writeArea = new TextArea("",500,80,readArea.SCROLLBARS_VERTICAL_ONLY);
                readArea        = new TextArea("",500,300,readArea.SCROLLBARS_VERTICAL_ONLY);
               
                //添加键盘监听,实现Ctr+Enter
                writeArea.addKeyListener(new KeyAdapter()
                {
                        public void keyPressed(KeyEvent e)
                        {
                                if((e.getKeyCode()==KeyEvent.VK_ENTER)&&e.isControlDown())
                                                        send();
                        }
                });
               
                //设置输入和读取文本区域的大小
                writeArea.setBounds(20,330,500,80);
                readArea.setBounds(20,40,500,280);
               
                //设置输入和读取文本区域的字体
                writeArea.setFont(new Font("楷体",Font.BOLD,13));
                readArea.setFont(new Font("楷体",Font.BOLD,13));
               
                //创建聊天窗体
                frame = new Frame("Mini 聊天室");
               
                //设置窗口布局为null
                frame.setLayout(null);
               
                //设置窗口大小
                frame.setBounds(500,100,550,450);
               
                //将文本区域添加到聊天窗口
                frame.add(writeArea);
                frame.add(readArea);
               
                //给窗体添加按钮
                frame.add(send);
                frame.add(close);
               
                //显示窗口
                frame.setVisible(true);
               
               
                //添加窗口监听,重写windowClosing,用于关闭聊天窗口
                frame.addWindowListener(new WindowAdapter()                                                               
                {
                        public void windowClosing(WindowEvent e)
                        {
                               
                                //关闭连接中的套接字
                                server.close();
                                client.close();
                       
                                //关闭虚拟机
                                System.exit(0);
                        }
                });
        }
        //抽象的发送方法
        abstract  void send();                                                                       
        //抽象的接收方法
        abstract  void receive();
}

class MiniChat extends ChatWindow
{
        private String name = "";
        //初始化的时候需要输入服务端和客户端的端口
        MiniChat(String IP ,  int clientPort ,int serverPort)
        {
                super(IP,clientPort,serverPort);
                new Thread()                                                                //创建并启动一个线程执行接收数据的功能
                {
                        public void run()
                        {
                                receive();
                        }
                }.start();
        }
        //发送方法的实现
         void send()
        {
                //获取已经输入的文本
                String str =  writeArea.getText();
                String str1 = (name+":\r\n"+writeArea.getText()+"\r\n");
               
                byte[] buf = str1.getBytes();
               
                //创建要发送的数据包
                DatagramPacket sendDate = new DatagramPacket(buf,buf.length);
                try
                {
                        readArea.append(name+":\r\n"+str+"\r\n");
                       
                        //发送数据
                        client.send(sendDate);
                       
                        //数据发送之后情况输入文本区
                        writeArea.setText("");
                       
                }
                catch(IOException e)
                {
                         throw new RuntimeException("文件发送失败");
                }
        }
        //接收方法的实现
         void receive()
        {
                //创建一个保存数据的缓冲区
                byte[] buf = new byte[1024];
               
                //创建要接收数据的数据包
                DatagramPacket reiveDate = new DatagramPacket(buf,buf.length);
               
       
                try
                {
                        //先接收一次数据,为了获取对方IP
                        server.receive(reiveDate);
                       
                        if(name.equals(""))
                        {
                                //用IP地址作为名字
                                name = reiveDate.getAddress().getHostAddress();
                        }
                        while(true)
                        {
                               
                                //将数据转换成字符串
                                String str = new String(buf);       
                               
                                //将字符串读取到文本区
                                readArea.append(str.substring(0,reiveDate.getLength()));
                               
                                        //接收数据
                                server.receive(reiveDate);
                        }
                               
                }
                catch(IOException e)
                {
                }
               
        }
        //提供一个设置名字的方法
        public void setName(String name)
        {
                this.name = name ;
        }
                public static void main(String args[])
        {
               
                MiniChat chat = new MiniChat("127.0.0.1",10000,12000);       
               
               
                chat.setName("张三");
        }
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

10 个回复

倒序浏览
厉害!学习一下,不过我这始终只能创建一个聊天窗口,2个CMD也不可以,不知道为啥
回复 使用道具 举报
好东西啊
回复 使用道具 举报
不错。。。。
回复 使用道具 举报
这是在抢腾讯的饭碗,支持{:soso_e128:}
回复 使用道具 举报
看看      
回复 使用道具 举报
      自动获取IP地址那个东西  能搞不?
回复 使用道具 举报
尹桥印 发表于 2013-5-14 07:48
求楼主传源码文件上来啊~~

源代码都写出来了,复制之后就可以运行了,让后用多个主函数的类创建MiniChat对象就可以达到多人聊天的效果了
回复 使用道具 举报
花开花落总相似 发表于 2013-5-14 11:25
自动获取IP地址那个东西  能搞不?

可以啊,定义一个保存IP的数据成员,然后接收文件之后把接收文件之后把IP作为传送地址就可以了啊。
回复 使用道具 举报
李征 发表于 2013-5-14 07:15
厉害!学习一下,不过我这始终只能创建一个聊天窗口,2个CMD也不可以,不知道为啥 ...

拿代码出来大家一起研究研究呗。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马