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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

//页面的布局
class FrameDemo
{
        private JFrame fr;
        private JTextArea jta1;
        private JTextField jta2;
        private JButton jb;

        FrameDemo()
        {
                fr =new JFrame("QQ聊天界面");
                jta1= new JTextArea(15,5); // 接受
                jta2= new JTextField();//发送
                jb= new JButton("发送");

                fr.setBounds(200,300,400,600);
                fr.setLayout(new BorderLayout(10,20));

                fr.add(jta1,BorderLayout.NORTH);
                fr.add(jta2,BorderLayout.SOUTH);
                fr.add(jb,BorderLayout.CENTER);

                fr.setVisible(true);
                jta2.addActionListener(new myListener());
        }
        class SendDemo implements Runnable
{
        private DatagramSocket ds ;
        public void run()
        {
                try
                {
                        ds= new DatagramSocket();
                         BufferedReader br = new BufferedReader(new FileReader(jta2.getText()));
                         String line=null;
                         while((line= br.readLine())!=null)
                          {
                                byte[] buf = line.getBytes();
                                DatagramPacket dp= new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),2668);
                                ds.send(dp);
                           }
                }
                catch (Exception e )
                {
                        throw new RuntimeException("有问题111");
                }
                ds.close();
        }
               
}
               
class ReceiveDemo implements Runnable
                {
                        public void run()
                        {
                                try
                                {
                                        DatagramSocket ds1 =new DatagramSocket(2668);
                                          while (true )   //  这个是为了支持不停的循环读
                                        {
                                                byte[] bt =new byte[1024]; //  这个byte字节是用来暂时存储接受过来的数据
                                                DatagramPacket dp1= new DatagramPacket(bt,bt.length);
                                                ds1.receive(dp1);
                                                String ip=dp1.getAddress().getHostAddress();
                                                String content= new String(dp1.getData(),0,dp1.getLength());
                                                jta1.append(ip+"::"+content);
                                        }
                                }
                                catch (Exception e )
                                {
                                        throw new RuntimeException("有问题2222");
                                }
                               

                        }
                }
        class  myListener implements ActionListener
        {
                public void actionPerformed(ActionEvent e)
                {
                        SendDemo sd= new SendDemo();
                        ReceiveDemo rd = new ReceiveDemo();
                        Thread sd1= new Thread(sd);
                        Thread rd1=new Thread(rd);
                        sd1.start();
                        rd1.start();
                        String name =jta2.getText();
                        jta1.append(name);
                }
        }
   
}

//开始写发送和接受机制  你想想啊  我已点击按钮  就要把我写在area中的数据发送出去



class  UdpSendRe
{
        public static void main(String[] args)
        {   

                FrameDemo fd= new FrameDemo();
      
        }
}


这是本人写的一个用UDP协议来实现QQ的聊天程序    调试了一天   编译没问题  但是   运行出现了大问题    可能是思想错了   求牛人解救??

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

3 个回复

倒序浏览
楼主这程序写的很让人纠结啊。。。
首先是我感觉你是要点击“发送”按钮然后发送消息,你为什么要把监听器放在一个文本域上

其次,你用一个FileReader来读取文本域的内容,但是FileReader接收的参数是文件啊,不是字符串

然后,你是在监听器你开启线程,这样做不是很合适吧:你每次发送一个消息后都会重新开启两个新的线程
这么做,怎么可能接收到信息,还没有接收,新的线程又被创建了。。。

最后,说一下异常,楼主这样处理异常总会让人头疼的,没有具体的异常信息,
让人很难调试程序啊
回复 使用道具 举报
张天天 发表于 2012-7-11 05:38
楼主这程序写的很让人纠结啊。。。
首先是我感觉你是要点击“发送”按钮然后发送消息,你为什么要把监听器 ...

不好意思  这个程序是之前的   我把监听器放在文本上   是想按ENTER键之后就发送信息  发送按钮其实是没有作用的   

其余两个问题  给了我很大的启发  我在写写看看  

谢了
回复 使用道具 举报
   正确的程序  应该是这样的:
/*
        写一个最简单的类似QQ的聊天程序
       
        这样来完成

        思路:
        1,首先,写一个图形化界面
        2,利用UDP的通信功能
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
//页面的布局
class FrameDemo
{
        private JFrame fr;
        private JTextArea jta1;
        private JTextField jta2;
        private JButton jb;
        private JScrollPane jlp;

        FrameDemo()
        {
                fr =new JFrame("QQ聊天界面");
                jta1= new JTextArea(10,35); // 接受
                jta2= new JTextField();//发送
                jb= new JButton("发送");
          
                fr.setBounds(200,300,400,600);
                fr.setLayout(new BorderLayout());

                fr.add(jta1,BorderLayout.NORTH);
                fr.add(jta2,BorderLayout.SOUTH);jlp= new JScrollPane(jta1);
                fr.add(jb,BorderLayout.CENTER);
               
                fr.add(jlp);
               
                fr.pack();

                fr.setVisible(true);
                //jta2.addActionListener(new myListener());
                   SendDemo sd= new SendDemo();
                        ReceiveDemo rd = new ReceiveDemo();
                        Thread sd1= new Thread(sd);
                        Thread rd1=new Thread(rd);
                        sd1.start();
                        rd1.start();
        }
        class SendDemo implements Runnable  // 现在的问题是  这里不能获取数据
   {
        private DatagramSocket ds ;
        public void run()
        {   
                jta2.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e)
                {
                        try
                        {
                                String line = jta2.getText();
                               
                         ds= new DatagramSocket();
                      byte[] buf = line.getBytes();
                      DatagramPacket dp= new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.32.1"),2668);
               String ip=InetAddress.getLocalHost()c.getHostAddress();
                       jta1.append(ip+":"+line+"\r\n");
                           ds.send(dp);
                           jta2.setText("");
                        }
                        catch (Exception ex )
                        {
                                throw new RuntimeException("有问题2222");

                        }
                }
                });
        }
   }
                       
class ReceiveDemo implements Runnable
                {
                        public void run()
                        {
                                try
                                {
                                        DatagramSocket ds1 =new DatagramSocket(2668);
                                          while (true )   //  这个是为了支持不停的循环读
                                        {
                                                byte[] bt =new byte[1024]; //  这个byte字节是用来暂时存储接受过来的数据
                                                DatagramPacket dp1= new DatagramPacket(bt,bt.length);
                                                ds1.receive(dp1);
                                                String ip=dp1.getAddress().getHostAddress();
                                                String content= new String(dp1.getData(),0,dp1.getLength());
                                                jta1.append(ip+"::"+content+"\r\n");
                                        }
                                }
                                catch (Exception e )
                                {
                                        throw new RuntimeException("有问题2222");
                                }
                               

                        }
                }
        class  myListener implements ActionListener
        {
                public void actionPerformed(ActionEvent e)
                {
               
                }
        }
}
   


//开始写发送和接受机制  你想想啊  我已点击按钮  就要把我写在area中的数据发送出去



class  UdpSendRe
{
        public static void main(String[] args)
        {   

                FrameDemo fd= new FrameDemo();
      
        }
}

点评

技术分 +1  发表于 2012-7-12 06:42
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马