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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© NewDemo 中级黑马   /  2014-4-18 15:58  /  1326 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 NewDemo 于 2014-4-18 19:28 编辑

毕老师UDP聊天程序问题
1.输入886停不下来的原因应该是因为多线程的缘故,我是把break改成了System.exit(0),不知道大家是怎么处理的
2.想弄成图形界面的耍耍,刚开始就出错。。求指教


  1. package day23;

  2. import java.net.*;
  3. import java.io.*;
  4. import java.awt.*;
  5. import java.awt.event.*;
  6. public class Test4 {

  7.         /*
  8.          * UDP协议的聊天程序:收和发是分开的,所以将收发的动作分别封装到两个线程的run方法中即可 1.定义两个类send
  9.          * rece分别实现Runnable,初始化时关联DatagramSocket 2.将收发动作分别封装到两个类的run方法中
  10.          * 3.在主函数中开启两个线程
  11.          */
  12.         private Frame f;
  13.         private TextArea ta1,ta2;
  14.         private Button b;
  15.         Test4(){
  16.                 method_0();
  17.         }
  18.         private void method_0(){
  19.                 Frame f = new Frame("对话");
  20.                 TextArea ta1 = new TextArea();
  21.                 TextArea ta2 = new TextArea();
  22.                 Button b = new Button("发送");
  23.                
  24.                 f.setBounds(200,100,400,350);
  25.                 f.add(ta1);
  26.                 f.add(ta2);
  27.                 f.add(b);
  28.                 myEvent();
  29.                 f.setVisible(true);
  30.                
  31.         }
  32.                
  33.         private void myEvent(){
  34.                 f.addWindowListener(new WindowAdapter(){
  35.                         public void windowClosing(WindowEvent e){
  36.                                 System.out.println("操作了窗体上的关闭");
  37.                                 System.exit(0);
  38.                         }
  39.                 });
  40.         }               
  41.                         
  42.                
  43.         public static void main(String[] args) {
  44. //                new Test4();这句话打开就报错,本来兴致满满想要做界面的,结果界面都出不来,想知道该怎么处理
  45.                 try{
  46.                         DatagramSocket dsend= new DatagramSocket();
  47.                         DatagramSocket drece= new DatagramSocket(10004);
  48.                         new Thread(new Send(dsend)).start();
  49.                         new Thread(new Rece(drece)).start();
  50.                 }
  51.                 catch(Exception e){
  52.                         throw new RuntimeException("监听端口失败");
  53.                 }
  54.         }
  55. }
  56.         class Send implements Runnable{
  57.                 private DatagramSocket ds;

  58.                 Send(DatagramSocket ds) {
  59.                         this.ds = ds;
  60.                 }

  61.                 public void run() {
  62.                         try {
  63.                                 BufferedReader bufr = new BufferedReader(new InputStreamReader(
  64.                                                 System.in));//用到了缓冲区,为什么没有刷新操作,在哪里刷新??
  65.                                 String line = null;
  66.                                 while ((line = bufr.readLine()) != null) {
  67.                                         if (line.equals("886"))
  68.                                                 break;//用break语句根本停不下来,
  69. //                                                System.exit(0);
  70.                                         byte[] buf = line.getBytes();
  71.                                         DatagramPacket dp = new DatagramPacket(buf, buf.length,
  72.                                                         InetAddress.getByName("127.0.0.1"), 10003);// ?怎么写这个包收到的长度??
  73.                                         System.out.println("我::"+line);
  74.                                         ds.send(dp);
  75.                                 }
  76.                         }
  77.                         catch (Exception e) {
  78.                                 throw new RuntimeException("发送消息失败");
  79.                         }
  80.                 }
  81.         }

  82.         class Rece implements Runnable{
  83.                 private DatagramSocket ds;
  84.                 Rece(DatagramSocket ds) {
  85.                         this.ds = ds;
  86.                 }
  87.                 public void run() {
  88.                         try {
  89.                                 while(true){
  90.                                         byte[] buf = new byte[1024];
  91.                                         DatagramPacket dp = new DatagramPacket(buf,buf.length);
  92.                                         ds.receive(dp);
  93.                                         String ip = dp.getAddress().getHostAddress();
  94.                                         String data = new String(dp.getData(),0,dp.getLength());
  95.                                         System.out.println(ip+"来自dos命令行:"+data);
  96.                                 }
  97.                         }
  98.                         catch (Exception e) {
  99.                                 throw new RuntimeException("接收消息失败");
  100.                         }
  101.                 }
  102.         }
复制代码





评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

4 个回复

倒序浏览
1.我觉得你不应该把发送的方法写在main里面
    发送数据给对方,肯定是你点发送按钮的时候才操作的,所以这段代码应该放到  发送按钮的活动事件里,当你在TextArea里写数据,点击按钮就会将TextArea里面的内容发送出去
2.既然是聊天,那么不仅仅是发送消息,还需要接收消息,所以我觉得得在定义一个线程,用来专门接收消息,一旦接收到消息,就显示到聊天记录的TextArea里,它与发送互补干扰
3,看了你的代码,我觉得发送的方法就不必用线程了,你点击一次发送一次,这个是由你掌控的,而接收数据则是自动的,还有一点就是,如果你是自己在一台机上做一个聊天程序,应该只能算一个客户端,因为这样做出来之后只能自己发送出去,没有别人发送回来,所以应该再复制一份,模拟另一个客户端

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
⒈心只霸占沵 发表于 2014-4-18 16:51
1.我觉得你不应该把发送的方法写在main里面
    发送数据给对方,肯定是你点发送按钮的时候才操作的,所以 ...

首先还是很感谢你的回答,如果可以的话能把界面化的源码发给我吗,
1.我现在的问题就是想先做出个界面,聊天和发送的事件监听我都还没去写,只是先做出来一个Frame试验一下,结果就一直报错,程序运行先给我个窗口都不行啊
2.嗯,这个确实可以有,只是想先把视频所讲的界面化,毕竟还没学会走。。
3.把发送弄到主线程挺靠谱倒可以尝试一下,果然见解独到啊。。另外,我确实是将程序写了两份出来,甲在eclipse中运行,乙个在dos命令行运行,保证甲的发送端发送到端口10000,乙的接收端监听端口10000,对应的乙的发送端发送到端口10001,甲的接收端则监听端口10001.所以才有了图片上的情况,确实是模拟出了两个客户端,虽然ip是相同的,只要保证了端口不同就可以实现聊天的。
回复 使用道具 举报
http://pan.baidu.com/s/1hqxGf8S  传网盘里了,这个是地址
回复 使用道具 举报
⒈心只霸占沵 发表于 2014-4-18 19:01
http://pan.baidu.com/s/1hqxGf8S  传网盘里了,这个是地址

:lol3q,太感谢了,好好研究下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马