黑马程序员技术交流社区

标题: 图形化界面的局域网聊天工具,没有两台机测试,求指点 [打印本页]

作者: 杨天皓    时间: 2012-6-4 23:52
标题: 图形化界面的局域网聊天工具,没有两台机测试,求指点


  1. import java.net.*;
  2. import java.io.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.util.*;
  6. import java.text.*;


  7. class Send implements Runnable
  8. {
  9.          private DatagramSocket ds;
  10.          private String text;
  11.          Send(DatagramSocket ds,String text)
  12.          {
  13.          this.ds = ds;
  14.          this.text = text;
  15.          }

  16.          public void run()
  17.          {

  18.                   byte[] buf = text.getBytes();

  19.                   //封包
  20.                   try
  21.                   {
  22.                            DatagramPacket dp =
  23.                            new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.255"), 12005);
  24.                            ds.send(dp);
  25.                   }
  26.                   catch (Exception e)
  27.                   {
  28.                            throw new RuntimeException("接收端失败");
  29.                   }

  30.          }

  31. }

  32. class Rece implements Runnable
  33. {
  34.          private DatagramSocket ds;
  35.          private TextArea ta;
  36.          Rece(DatagramSocket ds,TextArea ta)
  37.          {
  38.                   this.ds = ds;
  39.                   this.ta = ta;
  40.          }

  41.          public void run() {
  42.                   try {

  43.                            while (true)
  44.                            {

  45.                                     byte[] buf = new byte[1024];
  46.                                     DatagramPacket dp = new DatagramPacket(buf, buf.length);

  47.                                     ds.receive(dp);//接收到数据就继续运行,没有就停在这了。

  48.                                     String ip = dp.getAddress().getHostAddress();
  49.                                     String data = new String(dp.getData(), 0, dp.getLength());
  50.                                     System.out.println(ip + " : " + data);
  51.                                     ta.append("("+ip+") "+Tools.getTime()+":\r\n"+data+"\r\n\r\n");
  52.                            }

  53.                   }catch (Exception e)
  54.                   {
  55.                            throw new RuntimeException("接收端失败");
  56.                   }
  57.          }
  58. }


  59. class ChatDemo
  60. {

  61.          private Frame f;

  62.          private TextArea sendText,receText;

  63.          private Button bt;

  64.          ChatDemo()
  65.          {
  66.                   init();
  67.          }

  68.          public void init()
  69.          {
  70.                   f = new Frame("简易聊天");
  71.                   f.setBounds(300,240,430,500);

  72.                   f.setLayout(new FlowLayout()) ;

  73.                   receText = new TextArea(18,50); //接收文本域
  74.                   sendText = new TextArea(7,50); //输入文本域
  75.                   receText.setEditable(false); //禁止输入

  76.                   bt = new Button("发送");


  77.                   f.add(receText);
  78.                   f.add(sendText);
  79.                   f.add(bt);

  80.                   f.setVisible(true);
  81.                   event();

  82.          }


  83.          public void event()
  84.          {
  85.                   //关闭窗口
  86.                   f.addWindowListener(new WindowAdapter()
  87.                   {
  88.                            public void windowClosing(WindowEvent e)
  89.                            {
  90.                                     System.exit(0);
  91.                            }
  92.                   });

  93.                   //发送
  94.                   bt.addActionListener(new ActionListener()
  95.                   {
  96.                            public void actionPerformed(ActionEvent e)
  97.                            {
  98.                                     try
  99.                                     {
  100.                                              if(!"".equals(sendText.getText()))
  101.                                              {
  102.                                                       DatagramSocket sendSocket = new DatagramSocket();
  103.                                                       new Thread(new Send(sendSocket,sendText.getText())).start();

  104.                                                       sendText.setText("");     //发送完后,把输入文本域中的内容清空。
  105.                                              }

  106.                                     }
  107.                                     catch (Exception ex)
  108.                                     {
  109.                                              throw new RuntimeException();
  110.                                     }
  111.                            }

  112.                   });
  113.          }

  114.          public static void main(String[] args) throws Exception
  115.          {
  116.                   ChatDemo cd = new ChatDemo();
  117.                   DatagramSocket receSocket = new DatagramSocket(12005);
  118.                   new Thread(new Rece(receSocket,cd.receText)).start();
  119.          }
  120. }




  121. class Tools
  122. {
  123.          //获取当前时间
  124.          public static String getTime()
  125.          {
  126.                   Date date =new Date();
  127.                   SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

  128.                   return sdf.format(date);
  129.          }
  130. }



复制代码
请各位兄弟,看看我这代码写的有没有问题,如果能有两台机测试一下最好了。。。

作者: 杜俊彪    时间: 2012-6-5 00:07
是不能输出数据?
作者: 杨天皓    时间: 2012-6-5 00:16
杜俊彪 发表于 2012-6-5 00:07
是不能输出数据?

可以输出数据,按照思路来写的,应该是没有问题。
就是不知道两台电脑连局域网进行聊天的时候,会不会有问题,毕竟没测试。

还有不知道我写的这个代码还有没有可以优化的地方。

作者: 杜俊彪    时间: 2012-6-5 00:19
这个我之前做过;   那你就发给自己也行啊!!!  把发送端改一下,    发给自己;
  1. //封包
  2.                   try
  3.                   {
  4.                            DatagramPacket dp =
  5.                            new DatagramPacket(buf, buf.length,InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()), 12005);
  6.                            ds.send(dp);
  7.                   }
  8.                   catch (Exception e)
  9.                   {
  10.                            throw new RuntimeException("接收端失败");
  11.                   }
复制代码

作者: 杨天皓    时间: 2012-6-5 00:23
杜俊彪 发表于 2012-6-5 00:19
这个我之前做过;   那你就发给自己也行啊!!!  把发送端改一下,    发给自己; ...

老毕不是说,192.168.1.255是一个特殊的IP地址,局域网内,这个是一个广播地址,可以让所有局域网内的都能接收到数据吗?
作者: 杜俊彪    时间: 2012-6-5 00:23
杨天皓 发表于 2012-6-5 00:23
老毕不是说,192.168.1.255是一个特殊的IP地址,局域网内,这个是一个广播地址,可以让所有局域网内的都 ...

嗯,,可以,   我试过了;   
作者: 刘蕴学    时间: 2012-6-5 00:28
127.0.0.1 本机地址
作者: 杜俊彪    时间: 2012-6-5 00:35
本帖最后由 杜俊彪 于 2012-6-5 00:36 编辑

我有点纳闷你的滚动条怎么加的?    没看到代码;  难道java.awt.TextArea  中自带的??  我用java.swing.JTextArea;
作者: 杨天皓    时间: 2012-6-5 00:50
杜俊彪 发表于 2012-6-5 00:35
我有点纳闷你的滚动条怎么加的?    没看到代码;  难道java.awt.TextArea  中自带的??  我用java.swing. ...

对啊。TextArea自带的。
swing里面的控件我还没试过捏。明天来试试。




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