免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1950 | 回复: 2
打印 上一主题 下一主题

java学习笔记: 实现简易局域网聊天程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-19 23:20 |只看该作者 |倒序浏览
java学习笔记: 实现简易局域网聊天程序









Java代码
  1. /*  
  2. 使用UDP模式,编写一个聊天程序  
  3. 有发送和接收数据2部分,  
  4. 一个线程接收,一个线程发送  

  5. 由于发送和接收动作是不一致的,所以要使用2个run方法  
  6. 而且这两个方法要封装到不同的类中  

  7. 本程序忽略了部分异常的处理,也未加入UI组件  
  8. 这样比较简洁  

  9. 发送端口9998  
  10. 接受端口9999  
  11. 用的是局域网广播地址,所以自己发的消息自己也收到了  

  12. [示例]:简易控制台聊天程序  
  13. */  
  14. import java.net.*;   
  15. import java.io.*;   
  16. class Demo   
  17. {   
  18.   public static void main(String[] args) throws Exception   
  19.   {   
  20.     DatagramSocket sendSocket = new DatagramSocket(9998);  //发送端   
  21.     DatagramSocket receSocket = new DatagramSocket(9999);  //接收端   
  22.     new Thread(new MsgSend(sendSocket)).start();           //发送线程   
  23.     new Thread(new MsgRece(receSocket)).start();           //接受线程   
  24.   }   
  25. }   
  26.   
  27. class MsgSend implements Runnable     //发送   
  28. {   
  29.   private DatagramSocket dsock;   
  30.   public MsgSend(DatagramSocket dsock)   
  31.   {   
  32.     this.dsock= dsock;   
  33.   }   
  34.   
  35.   public void run()   
  36.   {   
  37.     BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));   
  38.     String lineStr = null;   
  39.     try  
  40.     {           
  41.       while(true)   
  42.       {   
  43.         lineStr = bufr.readLine();   
  44.         if(lineStr!=null)   
  45.         {   
  46.           if(lineStr.equals("over886"))   
  47.           {   
  48.             break;   
  49.           }   
  50.           else  
  51.           {   
  52.             byte[] dataBuf = lineStr.getBytes();   
  53.             DatagramPacket dataPack =   //数据打包   
  54.             new DatagramPacket( dataBuf,   
  55.                                 dataBuf.length,   
  56.                                 InetAddress.getByName("192.168.1.255"), //广播   
  57.                                 9999 //目标端口   
  58.                               );   
  59.             dsock.send(dataPack);   
  60.           }   
  61.         }   
  62.       }   
  63.       bufr.close();   
  64.       dsock.close();   
  65.     }   
  66.     catch(Exception e)   
  67.     {   
  68.       throw new RuntimeException("发送失败!");   
  69.     }   
  70.   }   
  71. }   
  72.   
  73. class MsgRece implements Runnable    //接收   
  74. {   
  75.   private DatagramSocket dsock;   
  76.   public MsgRece(DatagramSocket dsock)   
  77.   {   
  78.     this.dsock= dsock;   
  79.   }   
  80.   
  81.   public void run()   
  82.   {   
  83.     try  
  84.     {   
  85.       while(true)   
  86.       {   
  87.           byte[] dataBuf = new byte[1024];   
  88.           DatagramPacket dataPack = new DatagramPacket(dataBuf,dataBuf.length);   
  89.           dsock.receive(dataPack);  //将获取的数据保存到指定的数据包   
  90.           String ip = dataPack.getAddress().getHostAddress();   
  91.           String data = new String(dataPack.getData(),0,dataPack.getLength());   
  92.           int port = dataPack.getPort();   
  93.           System.out.println();   
  94.           System.out.println("来自ip为 "+ip+" <对方端口>: "+port+" 的消息");   
  95.           System.out.println(data);           
  96.       }   
  97.     }   
  98.     catch(Exception e)   
  99.     {   
  100.       throw new RuntimeException("接受失败!");   
  101.     }   
  102.     finally  
  103.     {   
  104.       dsock.close();   
  105.     }   
  106.   }   
  107. }  
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-01-19 23:20 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-01-23 21:16 |只看该作者
学习了。不错的。谢谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP