java版本的飞鸽编写(一)

来源:互联网 发布:经营活动现金流量算法 编辑:程序博客网 时间:2024/04/29 00:51

终于给学生上完java了:)

但离考试还有三周时间(太长了):(

想了半天,是教学生JDBC还是网络编程了 :~

最终还是决定教网络编程好了,因为他们都在用“飞鸽”传文件或信息

*************飞鸽解释**************
一个在局域网中的传递信息的软件

因为那个软件是用C++做的

那么现在做一个用Java写的

***********************************

 

于是仔细的分析了一下,“飞鸽”的执行流程

当打开飞鸽的时候,就显示了在线的用户(当然对方也得打开飞鸽才能看到)

然后花了一天时间,就写了个大概的功能出来了

现在就开始分享我的设计子旅好了啊,哈哈。。。

首先分析了一下网络原理

决定用UDP来发送信息,

TCP来实现传文件

因传送任何消息之前要确定主机名----IP地址之间的对应关系

而获取对应的关系,只有通过DNS的方式,来获取

于是开始踏上了行程,例如某局域网的IP地址为172.16.6.71

那么地址的分配那么该局域网的IP地址应为172.16.6.1-----17.16.6.254

于是只有通过遍历来做,从1到254

但是发现速度太慢,因为用的是DNS每次都要去解析

后来决定开动20个thread

每一个thread负责一个IP段

例如第一个thread负责172.16.6.1--172.16.6.10

但是速度虽然有些提高,但是仍然不是满意的时间

所以决定换一个思路

用广播来做

那么该局域网的广播地址为172.16.6.255或172.16.255.255(要看具体的子网掩码地址是什么)

于是改网的每太机器必定会收到一个广播包,

收到广播包,就将自己的主机名称和本机IP地址组装成一个新的包,返回给信息发送者

那么必定要在每个机上打开一个端口,来接受广播包和回复操作

因为不知道用户什么时候发送广播,所以要用线程来做,要不断的监听广播端口

代码如下

//端口8888用来发送广播包和用户收到广播包的反馈信息
//端口8889用来接受广播包
//监听广播信息,如故收到信息则将自己的主机地址和IP地址反馈给发包者

import java.io.*;
import java.net.*;

class Listeningbroad extends Thread{
 
    DatagramSocket s;   //打开相应Socket的类
    DatagramPacket p;   //封装相应数据包的类
    InetAddress ip;     //封装IP地址的类(例如要得到已知IP地址对应的主机名,就需要要改类)
    byte[] data= new byte[5];

 
 Listeningbroad(){
  try{
      s=new DatagramSocket(8889);  //打开接收广播包的端口
      p=new DatagramPacket(data,5); //接受的广播包的大小为5Byte
     
     }catch(IOException e){
                          System.out.println (e.getMessage());
                        }
 
 
 }
 
 
 public void run(){
 
  while(true){
    //功能:收到用户的请求广播包后,将本机的主机名+IP地址发给请求者
    try{
        s.receive(p);  
        ip=InetAddress.getLocalHost();
            String temp=ip.getHostName()+"@"+ip.getHostAddress();
            data=temp.getBytes(); //因为数据包是以byte的形式构造和发送的,固必须转换
               p.setAddress(p.getAddress()); //从收到的UDP的包中,获取发送者的IP地址设计为包的接受地址
            p.setData(data);   //设置包的数据部分
            p.setPort(8888); //设置包到目的地址的哪个端口
               s.send(p); 
     }catch(IOException e){
                           System.out.println (e.getMessage());
                     }
  
     try{
        
                 Thread.sleep(300);  //尝试让线程休眠300毫秒,这样做可以降低CPU的使用率
      
     }catch(InterruptedException e){}
     
     
     
      }
   }
  
}

那么我们将在

下一篇中将讲诉如何发送一个广播的UDP数据包

希望大家看到这边贴子,能对大家有所提高

当然不明白的地方也可以在回复中留言

我会回答哟

 
原创粉丝点击