Java网络编程

Java使网络编程更方便、简洁。它提供了各种Socket类,读者只要了解这
些类的构造和相关的方法,就可以轻松的编写网络程序。而无论任何网络
程序都是运行在一定的协议体系中的,了解这些协议的基本内容对于更好
的理解各种Socket类和方法都很有帮助。下面将介绍在Internet中占主导
地位的TCP/IP协议。
14.1 TCP/IP协议
TCP/IP协议是整个网络通信的核心协议。其中TCP协议运行在客户终端上,
是集成在操作系统内的一套协议软件,它的任务是在网络上的两个机器之
间实现端到端的、可靠的数据传输功能。IP协议运行在组成网络的核心设
备路由器上,它也是集成在系统内的一层协议软件,负责将数据分组从源
端发送到目的端,通过对整个网络拓扑结构的理解为分组的发送选择路由
。值得注意的是TCP协议运行在客户的主机中,是操作系统的一个组件,一
般操作系统会默认安装给协议软件,而IP协议既运行在客户主机中也运行
在网络设备中,在我们的主机中,查看安装的TCP/IP协议软件如图主机中
的TCP/IP属性所示。
[img]http://www.itrenjia.org/attachment/201005/28/6_1275044851IOZ1.jpg[/img]
14.1.1 IP协议和IP地址
计算机网络中的每台运行了IP协议的主机,都具有一个IP地址,该地址标
示网络中的一台主机。IP地址采用点分十进制方法表示。如192.168.2.1,
IP地址是一个32位的二进制序列,点分的每个部分占一个字节,使用十进
制表达。显然每个部分的最大不超过255,因为二进制的8个1(11111111)
用十进制表达就是255。
IP地址由网络部分和主机部分,网络部分表示一个通信子网,给子网内的
主机可以不通过路由器而直接通信,如一个公司办公室的局域网,主机部
分标识该通信子网内的主机。
[img]http://www.itrenjia.org/attachment/201005/28/6_127504484691x2.jpg[/img]
14.1.2 TCP协议和端口
在整个网络中,分组的传输过程中会发生很多难以预料的故障,如主机
down机或系统问题、网络连线中断、网络交换设备掉电或网络拥塞,这些
为问题的出现都可能造成分组的丢失或损坏。那么保障分组可靠地到达目
的地是IP协议无法解决的。此时需要它的上层协议TCP来处理。
TCP协议实现可靠通信的基础是采用了握手机制实现了数据的同步传输,即
在通信的双方发送数据前首先建立链接,协商一些参数,如发送的数据字
节数量、缓冲区大小等。一旦链接建立再传送数据,并且对于收到的每一
个分组进行确认,这样很好的保证了数据的可靠传输。
14.1.3 客户/服务器通信模型
客户/服务器通信模型通常称为C/S模型(Client/Server模型)。在这种通
信模型中有两个软件主体,一个是客户程序,一个是服务器程序。我们通
常称为客户端和服务器端。通信的过程是客户端向服务器端发出请求,例
如访问FTP服务器下载文件,这个下载请求就由客户端发出,而服务器接收
到请求后处理请求,把数据返回客户端。完成一次通信过程。图所示模型
是简单的客户/服务器通信模型。该模型展示了概要的通信模式。
[img]http://www.itrenjia.org/attachment/201005/28/6_12750448193p33.jpg[/img]
14.2 UDP协议
UDP(User Datagram Protocol)协议称为用户数据报协议。该协议运行在
TCP/IP模型的传输层,该协议可以直接封装成IP分组,不需要事先建立链
接就可以发送这些封装好的IP分组。
一个UDP报文有两个端口即源机器端口和目的机器端口、UDP长度、UDP校验
和UDP净荷组成,通过目的端口目的主机的传输层就知道把该报文递交给那
个处理进程。而源端口值得从目标主机返回的UDP报文到达源主机后可以正
确的提交给上层进程处理。
[img]http://www.itrenjia.org/attachment/201005/28/6_1275044831ufTM.jpg[/img]
14.3 基于Java的客户/服务器程序
本章介绍的Java网络编程建立在TCP/IP协议基础上,使用Socket套接字编
写网络通信程序。使用套接字编程可使程序员把主要精力集中在应用层,
集中于需要解决的问题领域,而至于传输层和网络层,以及更底层的细节
则不用考虑,这些问题Socket套接字全部处理。也就是说使用套接字使程
序员看不到底层的通信细节,而只是在应用层使用Socket完成两个主机之
间的通信。
这里需要首先介绍一下Socket再回到我们要讨论的问题。
14.3.1 Socket及其原语
Socket概念来源于BerkeleyUNIX中使用的TCP socket(套接字),可以把它
看做一个通信实体,负责完成位于不同主机上的应用程序间通信。该套接
字提供了一组原语(一组最基本的操作)保证客户端和服务器端顺利地建
立通信链接并传输数据,最后释放链接。这组原语已经广泛应用在网络程
序设计中。理解了这组原语对于理解客户/服务器通信过程的建立和释放很
有帮助。表列出了8个原语。
[img]http://www.itrenjia.org/attachment/201005/28/6_12750448273DC0.jpg[/img]
14.3.2 创建服务器
创建服务器使得服务器同客户端传输数据需要三个基本步骤:
(1)创建ServerSocket对象。
(2)阻塞服务进程、启动监听。
(3)创建流并读、写数据。

14.3.3 创建客户端
创建客户端程序与创建服务器程序略有区别,显然服务器需要监听服务请
求,而客户端只需要启动链接请求,所以创建客户端关键是创建一个
Socket对象。下面代码是Client客户程序中创建Socket对象的过程。
private static String serverAddress=”localhost”;
private static int port = 8080;
Socket socket = new Socket (serverAddress,port);
[img]http://www.itrenjia.org/attachment/201005/28/6_12750448372H44.jpg[/img]
14.4 Socket类详解
Socket套接字在客户、服务器通信模型中扮演着十分重要的角色,它就如
服务器和客户端的代理,完成双方应用程序发送和接收数据的任务。客户
建立和服务器的链接而创建了Socket,服务器一旦接收客户的链接请求也
返回一个Socket,之后这两个Socket就可以收发数据了。
本章重点介绍如何创建一个Socket,这里主要讲解该类的几个构造函数,
并给出各自的实例代码,演示不同的Socket对象创建方法。同时介绍建立
Socket链接时的常见异常的相关分析,使得读者知道在使用中常见的链接
问题的性质。Socket含有丰富的信息,这些信息是建立链接的必要条件,
同时也是数据传输的前提,本章对Socket的几个getXXX()函数的介绍使得
读者充分认识Socket到底包含了什么。最后介绍关闭链接的方式和注意事
项。
14.4.1 创建Socket
Socket类的几种构造函数如下,其区别在于参数的不同,为用户创建
Socket对象提供了灵活性。
(1)Socket():该构造函数没有任何参数,创建没有建立链接的Socket对
象,该对象包含系统的默认属性。
(2)Socket(InetAddress address , int port) throws IOException
该构造函数创建一个流Socket,并且链接到指定IP地址的指定端口。
(3)Socket(String host, int port) throws UnknownHostException
IOException
该构造函数创建一个流Socket,并且链接到指定主机的指定端口。
(4)Socket(InetAddress address,int port,InetAddress localadd,int
localport) throws IOException
该构造函数创建一个Socket对象,链接到指定的远端地址的指定端口。
(5)Socket(String host,int port,InetAddress localadd,int
localport) throws IOException
该构造函数创建一个流Socket,并且链接到指定名字的主机的指定端口。
如果指定的主机名为null,相当于通过InetAddress.getByName(null)获得
的地址(即localhost),同时该方法绑定本地主机的IP地址和服务端口号

14.4.2 Socket类的getXX ()方法
Socket类提供了getXX()方法,使用这些方法可以获得Socket对象的丰富信
息,如建立Socket链接必须的主机IP地址和进程端口号。一旦建立了链接
,Socket提供了输入输出流方法来读取服务器的数据,接收从服务器返回
的数据。下面详细介绍经常使用个Socket类各种getXX()方法。
public InetAddress getInetAddress()
该方法返回建立了Socket链接的远端Socket的地址,如果没有建立链接则
返回null.
public InetAddress getLocalAddress()
该方法返回建立了Socket链接的本地地址。
public int getPort()
该方法返回建立了Socket链接的远端服务的端口号。
public int getLocalPort()
该方法返回建立了Socket链接的本地服务端口号。
publicInputStream getInputStream() throws IOException
该方法返回当前Socket的输入流
publicOutputStream getOutputStream() throws IOException
该方法返回当前Socket的输入流
14.4.3 Socket类的setXX ()方法
Socket类提供了丰富的各种set类型方法,这是传输时需要考虑的参数如发
送和接收数据缓冲区的大小,长时间等待关闭链接,是否处理紧急数据,
是否使用换成那个机制等。本节将详细介绍常用的set类型方法。读者需要
了解这些方法的功能,和使用时机,而方法本身的使用很简单,相信读者
看后很容易掌握。
14.4.4 关闭Socket
但建立Socket通信的双方一旦通信结束,需要及时关闭Socket,这样就可
以及时的释放链接占用的资源如端口号、绑定的IP地址。Socket对象调用
close()方法关闭Socket通信,此时对象的输入输入流不再进行输入输出操
作。
如果需要立即释放服务端口和IP地址,需要事先调用setReuseAddress
(boolean on)方法。如下代码所示。
socket.setReuseAddress(true);
如果需要立即抛弃未发送完毕的数据,需要事先调用setSoLinger(boolean
on,int time)方法。如下代码所示。
socket. setSoLinger(true,0);
14.5 SocketServer类
在11.3.1节我们学习了JDK的常用工具,其中在bin目录下的工具最为有用
,在计算机上编译和执行Java程序时需要知道编译和执行程序的工具。
14.5.1 创建SocketServer
Java提供了灵活的构造函数来创建SocketServer对象,该对象负责在服务
器端监听客户端请求。下面依次介绍构造函数和使用方式。
(1)public void ServerSocket() throws IOException
该构造函数创建一个不带参数的默认构造方法。显然该构造函数不与任何
断口绑定,这样创建的对象无法直接调用accept()方法类监听接入的访问
,必须绑定一个服务端口客户端程序才可以访问到服务器程序。
(2)public ServerSocket(int port ) throws IOException
该构造函数创建一个带端口参数的ServerSocket对象,默认的服务器地址
为本机的IP地址。
(3)public void ServerSocket(int port, int connectNumber) throws
IOExcepiton
该构造函数有两个参数,第一个参数指定服务器的服务端口,第二个参数
指定服务器管理链接请求的的数量。
14.5.2 SocketServer类的两个重要方法
SocketServer类的两个重要方法如下所示。
(1)SocketServer 类accept()方法
当客户端向服务器发出请求时,该请求保存在服务器主机操作系统维护的
请求队列中,accept()方法负责从该请求队列中取出一个最早的请求,该
方法返回一个Socket对象,服务器通过该对象实现与客户端的双向可靠通
信。
(2)SocketServer类close()方法
该方法关闭当前服务器和客户端的所有链接,释放链接占用的资源如服务
端口,一般情况下不需要显示的调用该方法,服务器程序退出时,操作系
统回自动释放端口资源。显示关闭SocketServer对象的方式如下所示。
ServerSocket serverSocket = New ServerSocket(8080);
serverSocket.close();
14.5.3 读取SockerServer信息
ServerSocket类提供了一系列的get方法来获得 ServerSocket的信息。如下
所示。
public InetAddress getInetAddress()
该方法返回建立了Socket链接的远端 Socket的地址,如果没有建立链接则
返回null。
public InetAddress getLocalAddress()
该方法返回建立了Socket链接的本地地址。
public int getPort()
该方法返回建立了Socket链接的远端服务的端口号。
public int getLocalPort()
该方法返回建立了Socket链接的本地服务端口号。
14.5.3 读取SockerServer信息
publicInputStream getInputStream() throws IOException
该方法返回当前Socket的输入流。
publicOutputStream getOutputStream() throws IOException
该方法返回当前Socket的输入流。
其中常用的两个方法如下所示:
Public InetAddress getInetAddress()
该方法返回该服务器绑定的IP地址,如果创建 ServerSocket对象时采用默
认的地址,则是服务器的本地地址,如果在创建对象时显示指定了服务器
地址,则getInetAddress()方法返回的是指定的地址。
Public int getLocalPort();
该方法返回服务端口,如果用户没有显示设置该端口,则操作系统会随即
分配一个端口,否则返回用户指定的端口。
14.6 数据报通信
在TCP/IP协议族中,UDP协议与TCP协议都是处在传输层。而UDP协议是一种
无链接协议,即在建立通信的双方无须事先建立联系,只要需要发送数据
只管发送,不需要考虑对方是否接受或网络是否可靠。它发送的每个数据
报称为UDP报文,称为UDP数据报。每个数据报相互独立,各自包含完整的
目的地地址,源地址和相应的端口号。数据报在网络的传输路径取决于网
络自身的状况,至于能否到达目的地或到达后报文的正确性都难以保证。
在对方收到UDP报文后也不会作出任何反馈告诉发送方当前的状态。显然这
种方式无法保证数据的正确性,也无法处理丢失报文的情况。
14.6.1 数据报通信简介
基于Java的数据报通信主要依靠两个类来完成,一个是
java.net.DatagramSocket类,一个是java.net.DatagramPacket类。其中
DatagramPacket表示要发送或接受的数据报,而DatagramSocket负责接收
和发送数据报,如下代码所示。
1 //创建一个数据报
2 DatagramPacket packet = new DatagramPacket(new byte
[1024],1024);
3 //等待接收数据报, 如果没有接收到数据,进程阻塞。
4 socket.receive(packet);
5 // 创建要发送的数据报
6 DatagramPacket Packet = new DatagramPacket(outputData,
7
outputData.length,remoteIP,8080);
8 //发出数据报
9 socket.send(Packet);
14.6.2 DatagramPacket类简介
(1)构造函数
使用UDP协议发送和接收数据,需要在程序中表示数据报以调用
DatagramSocket的receive()和send()方法来接收和发送数据报,
DatagramPacket对象就是程序中的数据报,该类通过构造函数创建不同的
数据报。其构造函数分为两类,一类创建用于发送的数据报,一类用于接
收的数据报。
(2)DatagramPacket类的连个重要方法
14.6.3 DatagramSocket类简介
DatagramSocket类负责接收和发送数据报,每个 DatagramSocket对象会绑
定一个服务端口,这个端口可以是显示设置的,也可以采用匿名端口,匿
名端口由操作系统随机分配。UDP数据报在两个DatagramSocket的对象实体
间传输。
编写数据报方式的客户、服务器程序时,首先需要在客户方和服务器方建
立一个DatagramSocket对象,用来接收或发送数据报。接收和发送的数据
报由DatagramPacket类构造。
14.6.4 实现数据报通信
在学习过了数据报通信的机制,以及java.net.DatagramSocket类和
java.net.Datagram
类之后。我们通过一个具体里的基于UDP协议的客户服务器程序说明
DatagramSocket类来发送和接收数据的过程。
服务器程序的主机地址为本机地址,服务端口号为8080,程序启动后等待
接收数据而阻塞,直到接收到UDP数据报才终止阻塞状态。接收到数据后,
显示在控制台,并且把收到的数据再发送会客户端。服务器程序如代码所
示。
[img]http://www.itrenjia.org/attachment/201005/28/6_1275044842mbr6.jpg[/img]
14.7 本章习题
(1)学完本章中,读者需要回答:
简述IP 协议的作用,ip协议工作在OSI参考模型的那一个层
TCP 协议的的作用?什么是一个网络链接。
简述客户/服务器通信模型。
如何通过Socket类创建客户端程序
如何通过 SocketServer类实现服务器端程序。
解释什么是数据报通信。
如何通过DatagramPacket类创建数据报
如何通过DatagramSocket类实现数据报通信。
(2)注意事项。
1.本章的基本通信模型是C/S模型,在继续学习客户端/服务器应用程序设
计前首先要理解该通信模型。
2.本章读者一定要掌握最简单的通过Socket类SocketServer类实现客户端
/服务器应用程序的设计开发。
3.掌握数据报通信的原理和具体实现方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值