终于给学生上完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数据包
希望大家看到这边贴子,能对大家有所提高
当然不明白的地方也可以在回复中留言
我会回答哟