黑马程序员技术交流社区

标题: 新人写了个局域网聊天工具,请大神给指错优化 [打印本页]

作者: 栗新岩    时间: 2015-2-1 11:09
标题: 新人写了个局域网聊天工具,请大神给指错优化
新人看了毕老师的基础教程,写了个局域网聊天工具。倒是能正常运行,估计会有很多没检查出来的错,请老师大神给优化指正。
还存在写问题:1,两个Socket服务该什么时候关闭
2,怎样设置,使软件在运行时,让光标默认在发送端的文本框里
代码如下:
  1. /*
  2. 制作局域网聊天工具 思路:
  3. 1,创建Frame窗体,设置边界式布局
  4. 2,添加两个TextArea,接收端在上,发送端在下
  5. 3,给窗体添加监听事件(关闭窗体)
  6. 4,在发送端添加键盘监听,当按Enter时,将文本通过UDP Socket服务发送到局域网广播ip
  7. 5,在接收端创建Socket服务来接收数据,通过数据包方法解析数据,追加到接收端文本框
  8. 6,创建两个线程,运行发送端和接收端
  9. */
  10. import java.awt.*;
  11. import java.awt.event.*;
  12. import java.io.*;
  13. import java.net.*;
  14. class  ChatDemo
  15. {
  16.        
  17.         public static TextArea tas = new TextArea();
  18.         public static TextArea tar = new TextArea();//创建两个文本框对象

  19.         public static void main(String[] args) throws Exception
  20.         {
  21.                 //创建Frame窗体,设置边界式布局:
  22.                 Frame f = new Frame("聊天工具");//创建一个窗体
  23.                 f.setBounds(400,200,500,400);//设置窗体位置和大小
  24.                 f.setLayout(new BorderLayout());//设置窗体为边界式布局
  25.                 f.add(tar,BorderLayout.NORTH);
  26.                 f.add(tas,BorderLayout.SOUTH);//设置发送端文本框在下,接收端文本框在上
  27.                 tar.setEditable(false);//设置接收端文本框用户不可编辑
  28.                 f.setVisible(true);//使窗体可见
  29.                 //添加监听机制,按“叉”退出
  30.                 f.addWindowListener(new WindowAdapter(){
  31.                         public void windowClosing(WindowEvent e){
  32.                                 System.exit(0);
  33.                         }
  34.                 });



  35.                 //创建两个线程,启动发送端和接收端
  36.                 DatagramSocket receSocket = new DatagramSocket(10000);//给接收端设置端口
  37.                 DatagramSocket sendSocket = new DatagramSocket();//建立udp的socket服务
  38.                 new Thread(new UdpRece(receSocket)).start();
  39.                 new Thread(new UdpSend(sendSocket)).start();

  40.         }
  41. }

  42. //发送端线程:
  43. class  UdpSend implements Runnable
  44. {
  45.         private DatagramSocket ds;
  46.         public UdpSend(DatagramSocket ds)
  47.         {
  48.                 this.ds = ds;
  49.         }
  50.         public void run()//覆盖run()方法
  51.         {
  52.                
  53.                         ChatDemo.tas.addKeyListener(new KeyAdapter()//添加键盘监听
  54.                                 {
  55.                                         public void keyPressed(KeyEvent e)
  56.                                                 {
  57.                                                         if (e.getKeyCode()==KeyEvent.VK_ENTER)//如果按下Enter键,则执行
  58.                                                         {
  59.                                                                 try
  60.                                                                 {
  61.                                                                 String localIp = InetAddress.getLocalHost().getHostAddress();//获取本机ip
  62.                                                                 String[] ipx = localIp.split("\\.");//将本地ip用“.”切割,不可以使用localIp.split("."),split方法用的是正则表达式,"."会跟所有字符匹配,以至于什么都分割不出来
  63.                                                                 String line = ChatDemo.tas.getText();//获取发送端文本框的内容
  64.                                                                 //使用DatagramPacket把要发送的数据封装到该对象包中
  65.                                                                 byte[] buf =line.getBytes();
  66.                                                                 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(ipx[0]+"."+ipx[1]+"."+ipx[2]+".255"),10000);
  67.                                                                 ds.send(dp);        //通过udp的socket服务将数据包发送出去,使用send方法
  68.                                                                 }
  69.                                                                 catch (Exception ex)
  70.                                                                 {
  71.                                                                         throw new RuntimeException("发送端失败");
  72.                                                                 }
  73.                                                         }
  74.                                                 }
  75.                                 });
  76.                
  77.                
  78.         }
  79.        
  80. }

  81. //接收端线程:
  82. class  UdpRece implements Runnable
  83. {
  84.         private DatagramSocket ds;
  85.         public UdpRece(DatagramSocket ds)
  86.         {
  87.                 this.ds = ds;
  88.         }
  89.         public void run()
  90.         {
  91.                 try
  92.                 {
  93.                         while (true)
  94.                         {
  95.                         //创建数据包
  96.                         byte[] buf =new byte[1024];
  97.                         DatagramPacket dp = new DatagramPacket(buf,buf.length);
  98.                         //使用接收方法将数据存储到数据包中(阻塞式)
  99.                         ds.receive(dp);
  100.                         //通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容
  101.                         String ip = dp.getAddress().getHostAddress();
  102.                         String data = new String(dp.getData(),0,dp.getLength());
  103.                         int port = dp.getPort();
  104.                         ChatDemo.tar.append("来自:"+ip+"--端口为:"+port+"\r\n"+data+"\r\n");//将数据追加到接收端文本框,换行
  105.                         ChatDemo.tas.setText("");//并将发送端文本框内容清空,以便再次输入
  106.                         }
  107.                 }
  108.                 catch (Exception e)
  109.                 {
  110.                         throw new RuntimeException("接收端失败");
  111.                 }
  112.         }
  113. }
复制代码




作者: 栗新岩    时间: 2015-2-1 14:47
哈喽?老师和大神们咧?自顶~~~
作者: 王震阳老师    时间: 2015-2-2 10:03
赞一个!
作者: 栗新岩    时间: 2015-2-2 12:57
王震阳老师 发表于 2015-2-2 10:03
赞一个!

谢谢老师,请问这个代码存在的这两个问题该怎么解决啊??




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