《java网络编程浅析》由会员分享,可在线阅读,更多相关《java网络编程浅析(46页珍藏版)》请在金锄头文库上搜索。
1、13.2.2 Java 网络编程技术Java 语言是在网络环境下诞生的,所以 Java 语言虽然不能说是对于网络编程的支持最好的语言,但是必须说是一种对于网络编程提供良好支持的语言,使用 Java 语言进行网络编程将是一件比较轻松的工作。和网络编程有关的基本 API 位于 包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。该包中既包含基础的网络编程类,也包含封装后的专门处理 WEB 相关的处理类。在本章中,将只介绍基础的网络编程类。首先来介绍一个基础的网络类 InetAddress 类。该类的功能是代表一个IP 地址,并且将 IP 地址和域名相关的操作方法包含在该类的内部。关于该类
2、的使用,下面通过一个基础的代码示例演示该类的使用,代码如下:package inetaddressdemo;import .*;/* 演示 InetAddress 类的基本使用*/public class InetAddressDemo public static void main(String args) try/使用域名创建对象InetAddress inet1 = InetAddress.getByName();System.out.println(inet1);/使用 IP 创建对象InetAddress inet2 = InetAddress.getByName(127.0.0.1
3、);System.out.println(inet2);/获得本机地址对象InetAddress inet3 = InetAddress.getLocalHost();System.out.println(inet3);/获得对象中存储的域名String host = inet3.getHostName();System.out.println(域名: + host); /获得对象中存储的 IPString ip = inet3.getHostAddress();System.out.println(IP: + ip);catch(Exception e)在该示例代码中,演示了 InetAdd
4、ress 类的基本使用,并使用了该类中的几个常用方法,该代码的执行结果是: InetAddress 对象代表 IP 地址的构造方法,当然,该类的使用不是必须的,也可以使用字符串来代表 IP 地址进行实现。13.2.3 TCP 编程按照前面的介绍,网络通讯的方式有 TCP 和 UDP 两种,其中 TCP 方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话( 多次传输数据)。这样方式在实际的网络编程中,由于传输可靠,类似于打电话,如果甲给乙打电话,乙说没有听清楚让甲重复一遍,直到乙听清楚为止,实际的网络传输也是这样,如果发送的一方发送
5、的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。在 Java 语言中,对于 TCP 方式的网络编程提供了良好的支持,在实际实现时,以 .Socket 类代表客户端连接,以 .ServerSocket 类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定 IP 地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了 Java 语言网络编程的难度,另外也使得使用 Java 语言进行网络编程时无法深入到网络的底层,所以使用 Java 语言进行网络底层系统编程很困难,具体点说,Java 语言无法实现
6、底层的网络嗅探以及获得 IP 包结构等信息。但是由于 Java 语言的网络编程比较简单,所以还是获得了广泛的使用。在使用 TCP 方式进行网络编程时,需要按照前面介绍的网络编程的步骤进行,下面分别介绍一下在 Java 语言中客户端和服务器端的实现步骤。在客户端网络编程中,首先需要建立连接,在 Java API 中以 .Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建 Socket 类型的对象,该对象代表网络连接,示例如下:Socket socket1 = new Socket(“192.168.1.103”,10000);Socket socket2 = new Socke
7、t(“”,80);上面的代码中,socket1 实现的是连接到 IP 地址是 192.168.1.103 的计算机的 10000 号端口,而 socket2 实现的是连接到域名是 的计算机的80 号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应” 模型进行网络数据交换,在 Java 语言中,数据传输功能由 Java IO 实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入
8、流中读取数据即可。示例代码如下:OutputStream os = socket1.getOutputStream(); /获得输出流InputStream is = socket1.getInputStream(); /获得输入流上面的代码中,分别从 socket1 这个连接对象获得了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了 IO 操作,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,然后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,当然这个数据交换过程可以多次进行。这里获得的只是最基本的输出流和输入流对象,还可以根
9、据前面学习到的IO 知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下:socket1.close();这就是最基本的网络编程功能介绍。下面是一个简单的网络客户端程序示例,该程序的作用是向服务器端发送一个字符串“Hello”,并将服务器端的反馈显示到控制台,数据交换只进行一次,当数据交换进行完成以后关闭网络连接,程序结束。实现的代码如下:package tcp;import java.io.*;import .*;/* 简单的 Socket 客户端* 功能
10、为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈*/public class SimpleSocketClient public static void main(String args) Socket socket = null;InputStream is = null;OutputStream os = null;/服务器端 IP 地址String serverIP = 127.0.0.1;/服务器端端口号int port = 10000;/发送内容String data = Hello;try /建立连接socket = new Socket(serverIP,port)
11、;/发送数据os = socket.getOutputStream();os.write(data.getBytes();/接收数据is = socket.getInputStream();byte b = new byte1024;int n = is.read(b);/输出反馈数据System.out.println(服务器反馈: + new String(b,0,n); catch (Exception e) e.printStackTrace(); /打印异常信息finallytry /关闭流和连接is.close();os.close();socket.close(); catch
12、(Exception e2) 在该示例代码中建立了一个连接到 IP 地址为 127.0.0.1,端口号码为 10000的 TCP 类型的网络连接,然后获得连接的输出流对象,将需要发送的字符串“Hello”转换为 byte 数组写入到输出流中,由系统自动完成将输出流中的数据发送出去,如果需要强制发送,可以调用输出流对象中的 flush 方法实现。在数据发送出去以后,从连接对象的输入流中读取服务器端的反馈信息,读取时可以使用 IO 中的各种读取方法进行读取,这里使用最简单的方法进行读取,从输入流中读取到的内容就是服务器端的反馈,并将读取到的内容在客户端的控制台进行输出,最后依次关闭打开的流对象和网
13、络连接对象。这是一个简单的功能示例,在该示例中演示了 TCP 类型的网络客户端基本方法的使用,该代码只起演示目的,还无法达到实用的级别。如果需要在控制台下面编译和运行该代码,需要首先在控制台下切换到源代码所在的目录,然后依次输入编译和运行命令:javac d . SimpleSocketClient.javajava tcp.SimpleSocketClient和下面将要介绍的 SimpleSocketServer 服务器端组合运行时,程序的输出结果为:服务器反馈:Hello介绍完一个简单的客户端编程的示例,下面接着介绍一下 TCP 类型的服务器端的编写。首先需要说明的是,客户端的步骤和服务器
14、端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为:ServerSocket ss = new ServerSocket(10000);该代码实现的功能是监听当前计算机的 10000 号端口,如果在执行该代码时,10000 号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的 Socket 连 接对象,从而释放客户端连接对于
15、服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就通知某某某, 然后就可以继续接待其它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。 实现获得连接的代码是:Socket socket = ss.accept();该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是 accept 和前面 IO 部分介绍的 read 方法一样,都是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket 类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来