黑马程序员技术交流社区
标题:
GUI 用UDP协议实现类似于QQ的聊天程序 求助
[打印本页]
作者:
李海
时间:
2012-7-10 22:37
标题:
GUI 用UDP协议实现类似于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的聊天程序 调试了一天 编译没问题 但是 运行出现了大问题 可能是思想错了 求牛人解救??
作者:
张天天
时间:
2012-7-11 05:38
楼主这程序写的很让人纠结啊。。。
首先是我感觉你是要点击“发送”按钮然后发送消息,你为什么要把监听器放在一个文本域上
其次,你用一个FileReader来读取文本域的内容,但是FileReader接收的参数是文件啊,不是字符串
然后,你是在监听器你开启线程,这样做不是很合适吧:你每次发送一个消息后都会重新开启两个新的线程
这么做,怎么可能接收到信息,还没有接收,新的线程又被创建了。。。
最后,说一下异常,楼主这样处理异常总会让人头疼的,没有具体的异常信息,
让人很难调试程序啊
作者:
李海
时间:
2012-7-11 13:42
张天天 发表于 2012-7-11 05:38
楼主这程序写的很让人纠结啊。。。
首先是我感觉你是要点击“发送”按钮然后发送消息,你为什么要把监听器 ...
不好意思 这个程序是之前的 我把监听器放在文本上 是想按ENTER键之后就发送信息 发送按钮其实是没有作用的
其余两个问题 给了我很大的启发 我在写写看看
谢了
作者:
李海
时间:
2012-7-11 16:28
正确的程序 应该是这样的:
/*
写一个最简单的类似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();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2