黑马程序员技术交流社区

标题: 自己写的一个直接通过UDP协议实现聊天的软件,能否优化 [打印本页]

作者: jiajun    时间: 2016-8-5 09:07
标题: 自己写的一个直接通过UDP协议实现聊天的软件,能否优化
package easyChat;
import java.io.*;//导入GUI相关包,输入输出流相关
import java.awt.*;//导入GUI相关包,Frame相关
import java.awt.event.*;//导入GUI相关包,监听器相关
import java.net.*;//导入网络相关包,socket服务相关

public class SimpleQQ
{
        public static void main(String[] args)
        {
                new MyFrame();
        }
}

class MyFrame//定义主窗体类
{
        private Frame frame;//定义聊天窗口
        private TextArea chatinfo;//定义聊天显示区域
        private MenuBar mainmenu;//定义主菜单栏
        private MenuItem pic;//定义图片发送菜单
        private MenuItem sound;//定义语音发送菜单
        private MenuItem video;////定义视频发送菜单
        private Menu biaoqing;//定于表情包发送菜单
        private TextField chatarea;//定义聊天文本框
        private Button send;//定义发送按钮
        private Thread t_send;
        private Thread t_recv;
        private UDPSend udpsend;

        MyFrame()//窗口构造函数
        {
                initial();
        }
        public void initial()//定义窗口初始化信息
        {
                frame=new Frame("易Q");
                frame.setBounds(300,200,500,400);//定义主窗体,宽和高
                frame.setLayout(new FlowLayout());//定义流式布局,后期需改动
                chatinfo=new TextArea(20,60);//定义聊天显示区,宽48,高35行
                mainmenu=new MenuBar();
                chatarea=new TextField(53);//定义聊天输入区域大小,宽度45
                send=new Button("发送");//定义发送按钮
                frame.add(chatinfo);//窗体添加聊天显示区域
                frame.setMenuBar(mainmenu);//窗体添加菜单栏
                frame.add(chatarea);//窗体添加聊天输入区域
                frame.add(send);//窗体添加发送按钮
                myEvent();//
                frame.setVisible(true);//设置窗口显示
                udpsend=new UDPSend(chatarea);
                t_recv=new Thread(new UDPRecv(chatinfo));
                //t_send=new Thread(new UDPSend(chatarea));
                t_recv.start();
        }
        public void myEvent()//定义事件监听器及反馈
        {
                frame.addWindowListener(new WindowAdapter()//主窗体监听器
                {
                        public void windowClosing(WindowEvent e)//定义关闭按钮功能-->退出程序
                        {
                                System.exit(0);
                        }
                });
                send.addActionListener(new ActionListener()//定义发送按钮活动监听器
                {
                        public void actionPerformed(ActionEvent e)//定义功能,将文本输入区内容输出到UDP封包,并打印在聊天显示区
                        {       
                                t_send.start();
                                String text=chatarea.getText();//获取文本框内容
                                chatinfo.append(text+"\r\n");//输出到聊天记录窗口
                                chatarea.setText("");//文本框清空
                        }
                });
                chatarea.addKeyListener(new KeyAdapter()//定义文本框键盘回车键监听
                {
                        public void keyPressed(KeyEvent e)
                        {
                                if (e.getKeyCode()==e.VK_ENTER)
                                {
                                        //System.out.println("t-qian");
                                        t_send=new Thread(udpsend);
                                        t_send.start();//调用多线程端口发送
                                        //System.out.println("t-hou");
                                        String text=chatarea.getText();//获取文本框内容
                                        chatinfo.append(text+"\r\n");//输出到聊天记录窗口
                                        chatarea.setText("");//文本框清空
                                }
                        }
                });
        }
}
class UDPSend implements Runnable//定义UDP发送端
{
        private TextField tf;//接收窗口文本框对象
        private DatagramSocket ds_send;
        private DatagramPacket dp1;
        UDPSend(TextField tf)//定义发送端函数,接收文本框数据
        {
                this.tf=tf;
                try
                {       
                        byte[] temp=new byte[1024];
                        ds_send=new DatagramSocket();//创建接口端       
                        dp1=new DatagramPacket(temp,temp.length,InetAddress.getByName("127.0.0.1"),9000);        //封包,目的IP127.0.0.1,端口10000
                }       
                catch (Exception ex)//IP及端口异常捕捉
                {       
                }       
        }
        public void run()
        {
                try
                {
                        byte[] byte_text=tf.getText().getBytes();//转换为byte数组
                        //dp1=new DatagramPacket(byte_text,byte_text.length,InetAddress.getByName("127.0.0.1"),10000);        //封包,目的IP127.0.0.1,端口10000
                        dp1.setData(byte_text);
                        dp1.setLength(byte_text.length);
                        //dp1.setAddress(InetAddress.getByName("127.0.0.1"));
                        //dp1.setPort(10000);
                        ds_send.send(dp1);//数据包发送
                }
                catch (IOException ex)//数据发送异常捕捉
                {
                }
        }

}
class UDPRecv implements Runnable//定义UDP接受端
{
        private TextArea ta;
        private DatagramPacket dp2;
        private DatagramSocket ds_recv;
        UDPRecv(TextArea ta)//定义接收端函数,接收数据
        {
                this.ta=ta;
                try
                {
                        byte[] temp=new byte[1024];
                        ds_recv=new DatagramSocket(10000);
                        dp2=new DatagramPacket(temp,temp.length);
                }
                catch (Exception ex)//IP及端口异常捕捉
                {
                }
        }
        public void run()
        {
                while (true)
                {
                        try
                        {
                               
                                //DatagramPacket dp2=new DatagramPacket(temp,temp.length);
                                ds_recv.receive(dp2);;//数据包接收
                                String ip=dp2.getAddress().getHostAddress();//获取IP地址
                                byte[] data=dp2.getData();//获取数据的byte数组
                                ta.append(ip+"--"+"发送\r\n");//聊天记录区打印IP地址
                                ta.append(new String(data,0,dp2.getLength())+"\r\n");//聊天记录区打印发送内容
                        }
                        catch (IOException ex)
                        {
                        }
                }
                       
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2