域名解析仿真 Pares Domain Name

本文介绍了如何通过Java设计一个简单的域名解析系统。该系统包括客户机类和服务器类,利用InetAddress类进行域名到IP地址的转换。客户端通过Socket与服务器通信,服务器接收域名请求并返回对应的IP地址。

一,总体设计

       当我们在访问某个网站时,诸如206.17.191.12之类的地址是很难被人们记住的,但如果换成www.baidu.com之类的域名(Domain name)就会很容易记忆。但是,电脑是无法通过这些域名访问网站的,这时,就需要通过域名解析(Pares Domain Name)将域名转换成机器可识别的IP地址。

       为了实现这一功能,我定义了两个类:客户机类(NetworkClient),和服务器类(NetworkServer)。当服务器端处于激活状态时,客户机连接服务器,并将要转换的域名发送给服务器端。当服务器端接收到域名后,就通过javaInetAddress类提供的方法,将查询到的IP地址返回给客户端。

示意图:


,详细设计

  1, Socket类:

             此类实现客户端套接字。套接字是两台机器间通信的端点。当服务器返回IP地址时,要先通过套接字中的端口号定位客户机的位置

            Socket类中的方法:    

 void

close() 
          关闭此套接字。

 void

connect(SocketAddress endpoint) 
          将此套接字连接到服务器。

 InputStream

getInputStream() 
          返回此套接字的输入流。

 OutputStream

getOutputStream() 
          返回此套接字的输出流。

        2,InetAddress类:

此类表示互联网协议地址(IP地址)

           InetAddress类中的方法:

 String

getHostAddress() 
          返回 IP 地址字符串(以文本表现形式)。

static InetAddress

getByName(String host) 
          在给定主机名的情况下确定主机的 IP 地址。

 
 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,输入要转换的域名



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值