一,总体设计
当我们在访问某个网站时,诸如206.17.191.12之类的地址是很难被人们记住的,但如果换成www.baidu.com之类的域名(Domain name)就会很容易记忆。但是,电脑是无法通过这些域名访问网站的,这时,就需要通过域名解析(Pares Domain Name)将域名转换成机器可识别的IP地址。
为了实现这一功能,我定义了两个类:客户机类(NetworkClient),和服务器类(NetworkServer)。当服务器端处于激活状态时,客户机连接服务器,并将要转换的域名发送给服务器端。当服务器端接收到域名后,就通过java中InetAddress类提供的方法,将查询到的IP地址返回给客户端。
示意图:
二,详细设计
1, Socket类:
此类实现客户端套接字。套接字是两台机器间通信的端点。当服务器返回IP地址时,要先通过套接字中的端口号定位客户机的位置
Socket类中的方法:
void | close() |
void | connect(SocketAddress endpoint) |
getInputStream() | |
getOutputStream() |
2,InetAddress类:
此类表示互联网协议地址(IP地址)
InetAddress类中的方法:
getHostAddress() | |
static InetAddress |
3,源代码及注释
//客户机端
package xxj.network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import ComputerNetwork.Server;
public class NetWorkClient {
private int port;
public NetWorkClient(int port) {
this.port = port;
}
public static void main(String[] args) {
NetWorkClient nwc = new NetWorkClient(9999);
nwc.createClient();
}
public void createClient(){
try {
Socket socket = new Socket("localhost", port);
System.out.println("成功连接到服务器!");
InputStream is = socket.getInputStream();
//BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
Scanner sc = new Scanner(System.in);//创建获取控制台输入信息的对象
System.out.println("请输入要查询的域名(例如:www.baidu.com):");
String domainName = sc.nextLine();//读取输入的域名
System.out.println("获取到的域名为"+domainName);
os.write(domainName.length());//发送域名长度
os.write(domainName.getBytes());//发送域名
//bw.write(domainName+"\r\n");//将消息写给服务器
System.out.println("等待服务器返回消息");
//String ip = br.readLine();//等待服务器返回IP地址
int length = is.read();//读取ip地址长度
byte [] b = new byte[length];//根据ip长度创建字节数组
is.read(b);//读取IP地址
String ip = new String(b);//将字节书转换为字符串
System.out.println(domainName+"对应的ip地址为"+ip);
//bw.close();
//br.close();
os.close();
is.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
<span style="font-size:18px;">//服务器端
package xxj.network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class NetWorkServer {
private int port;
public static void main(String[] args) {
NetWorkServer nws = new NetWorkServer(9999);
nws.createServer();
}
public NetWorkServer(int port){
this.port = port;
}
public void createServer(){
try {
ServerSocket server = new ServerSocket(port);
System.out.println("启动服务器成功,等待客户机连接......");
Socket client = server.accept();
System.out.println("客户机成功连接到服务器!"+client.getRemoteSocketAddress());
InputStream is = client.getInputStream(); //获取输入流
//BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = client.getOutputStream();
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
System.out.println("等待客户机发送消息过来!");
//System.out.println(is.read());
//System.out.println(br.ready());
int length = is.read();//读取域名地址长度
byte [] b = new byte[length];//根据域名长度创建字节数组
is.read(b);//读取域名
String domainName = new String(b);//将字节转换为字符串
//读取客户機发送过来的消息
//String domainName = br.readLine();//读取客户机发送过来的域名
System.out.println("客户发送过来的域名为:"+domainName);
InetAddress myServer = InetAddress.getByName(domainName);//根据客户机发送的域名来创建IntentAddress对象
String ip = myServer.getHostAddress();//获取域名对应的IP地址
System.out.println("根据"+domainName+"域名解析到的IP地址为:"+ip);
//bw.write(ip+"\r\n");//将IP地址发送给客户机
os.write(ip.length());//发送IP长度
os.write(ip.getBytes());//发送IP
//bw.close();
//br.close();
os.close();
is.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}</span><span style="font-size:24px;">
</span>
四,运行结果
1,启动服务器
2,输入要转换的域名