Step By Step(Java 网络篇) (一)

2014-11-24 03:03:08 · 作者: · 浏览: 0

本篇为您介绍的是如何通过套接字(Socket)编写基于TCP/IP(IPv4)的网络应用程序。
在基于TCP的网络通讯中,每次进行数据传输之前,均需要在服务器端和客户端之间建立TCP连接,之后再在该连接通道上进行数据传输。然而在连接之前,我们还需要做哪些准备呢?很明显,如果我们是客户端,则需要预先知道待连接的服务器的IP地址和端口号。这就如同打电话,通话之前先拨号,拨号之前需要知道对方的电话号码。那么对于服务器而言又需要做什么呢?由于它是被动等待客户端发起连接的,因此服务器唯一需要准备工作是监听指定的IP地址和端口号。可以看出,无论是服务器还是客户端,在准备建立连接之前都是需要与IP地址和端口号打交道的。那么我们就从这里开始吧。
1. 套接字地址:
1) 如何通过Java的类库获取主机IP地址。
InetAddress类代表了一个网络目标地址,包括主机名和数字类型的地址信息。该类有两个子类,Inet4Address和Inet6Address,分别对应于目前IP地址的两个版本。InetAddress实例是不可变的,一旦创建,每个实例就始终指向同一地址。见如下示例:
1 public class MyTest {
2 public static void main(String[] args) {
3 //1. 通过NetworkInterface类枚举出当前主机的全部网络设备数据
4 try {
5 //1.1 返回当前主机每一个网络接口对应的实例
6 Enumeration interfaceList = NetworkInterface.getNetworkInterfaces();
7 if (interfaceList == null) {
8 System.out.println("--No interfaces found--");
9 } else {
10 while (interfaceList.hasMoreElements()) {
11 NetworkInterface iface = interfaceList.nextElement();
12 //1.2 iface.getName()方法返回的是设备的名称,通常由字母和数字联合构成。
13 System.out.println("Interface " + iface.getName() + ":");
14 //1.3 枚举出真正持有IP地址信息的对象
15 Enumeration addrList = iface.getInetAddresses();
16 if (!addrList.hasMoreElements())
17 System.out.println("\t(No Addresses for this interface.");
18 while (addrList.hasMoreElements()) {
19 InetAddress addr = addrList.nextElement();
20 //1.4 这里输出的就是我们通常所说的点分形式的IP地址,如192.163.1.1
21 if (addr instanceof Inet4Address)
22 System.out.println("\tAddress " + addr.getHostAddress());
23 }
24 }
25 }

26 } catch (SocketException e) {
27 System.out.println("Error getting network interfaces: " + e.getMessage());
28 }
29 //2. 根据指定主机名(host),获取该主机的全部网络设备信息。
30 String host = "Stephen-PC";
31 try {
32 System.out.println(host + ":");
33 //2.1 通过主机名称直接获取该主机的全部网络地址。
34 InetAddress[] addrList = InetAddress.getAllByName(host);
35 for (InetAddress addr : addrList) {
36 //2.2 getHostName()获取的是主机名,getHostAddress()获取的是点分形式的IP地址。
37 if (addr instanceof Inet4Address)
38 System.out.println("\t" + addr.getHostName() + "/" + addr.getHostAddress());
39 }
40 } catch (UnknownHostException e) {
41 System.out.println("\tUnable to find address for " + host);
42 }
43 }
44 }
45 /* 输出结果如下:
46 Interface lo:
47 Address 127.0.0.1
48 Interface net0:
49 (No Addresses for this interface.
50 Interface net1:
51 (No Addresses for this interface.
52 Interface net2:
53 (No Addresses for this interface.
54 Interface net3: