您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第13章Java网络编程.
Java实用教程(第3版)第13章Java网络编程13.1网络程序设计基础13.2TCP网络编程13.3UDP网络编程13.4URL13.5综合实例Java实用教程(第3版)13.1网络程序设计基础13.1.1TCP和UDP要想让处于网络中的主机互相通信,只是知道通信双方地址还是不够的,还必须遵循一定的规则。有两套参考模型:OSI参考模型,TCP/IP参考模型(或TCP/IP协议)。由于OSI参考模型过于理想化,未能在因特网上进行广泛推广。这样,TCP/IP协议就成为事实上的国际标准。这里只重点介绍TCP/IP协议的运输层协议。运输层协议中有两个非常重要的协议:传输控制协议TCP(TransmissionControlProtocol),用户数据报协议UDP(UserDatagramProtocol)。传输控制协议TCP是面向连接的运输层协议。即应用进程(或程序)在使用TCP协议之前,必须先建立TCP连接,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程。另一个是客户进程。用户数据报协议UDP是面向无连接的运输层协议。即应用进程(或程序)在使用UDP协议之前,不必先建立连接。自然,发送数据结束时也没有连接需要释放。因此,减少了开销和发送数据之前的时延。Java实用教程(第3版)13.1.2端口和套接字一般情况下,两台主机上都会运行许多进程。当主机A上的进程A1向主机B上的进程B1发送数据时,IP协议根据主机B的IP地址,把进程A1发送的数据送达主机B。接下来传输层TCP需要决定把数据发送到主机中的哪个进程。TCP和UDP都采用端口来区分进程。端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区),也称为协议端口(protocolport)。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务,用于一些知名的网络服务和应用。例如,http使用80端口,FTP服务的端口号是21。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。Java实用教程(第3版)13.2TCP网络编程两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一段称为一个Socket(套接字)。Socket通常用来实现Client/Server连接。Socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用程序。Java语言的基于套接字编程分为服务器编程和客户端编程,其通信模型如图13.1所示。ServerServerSocket(intport)Socketaccept()OutputStreamSocker.getOutputStream()InputStreamSocker.gerInputSream()Socket.close()ClientSocket(InetAddressaddress,intport)OutputStreamSocket.getOutputStream()InputStreamSocket.getInputStream()Socker.close()图13.1基于TCP的Socket通信Java实用教程(第3版)13.2TCP网络编程服务器程序编写:(1)调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上。(2)调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。(3)调用Socket类的getOutputStream和getInputStream获取输出流和输入流,开始网络数据的发送和接收。(4)最后关闭通信套接字。客户端程序编写:(1)调用Socket()创建一个流套接字,并请求连接到服务器端。(2)调用Socket类的getOutputStream和getInputStream获取输出流和输入流,开始网络数据的发送和接收。(3)最后关闭通信套接字。Java实用教程(第3版)13.2TCP网络编程Socket类的对象表示一个Socket。客户端使用Socket类的构造方法,创建一个Socket对象,创建的同时会自动向服务器方发起连接。Socket类的构造方法如下:Socket(Stringhost,intport)throwsUnknownHostException,IOException:功能:向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。Socket(InetAddressaddress,intport)throwsIOException:功能:同上。只是根据InetAddress对象所表示的IP地址以及端口号port发起连接。Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOException:功能:创建一个套接字并将其连接到指定远程主机上的指定远程端口。Socket会通过调用bind()方法来绑定提供的本地地址及端口。host表示远程主机名,port表示远程端口号,localAddr表示要将套接字绑定到的本地地址,localPort表示要将套接字绑定到的本地端口。Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOException:Java实用教程(第3版)13.2TCP网络编程功能:创建一个套接字并将其连接到指定远程地址上的指定远程端口。Socket会通过调用bind()方法来绑定提供的本地地址及端口。Socket类的常用方法如表13.1所示。方法功能InetAddressgetLocalAddress()返回对方Socket中的IP的InetAddress对象intgetLocalPort()返回本地Socket中的端口号InetAddressgetInetAddress()返回对方Socket中IP地址intgetPort()返回对方Socket中的端口号voidclose()throwsIOException关闭Socket,释放资源InputStreamgetInputStream()throwsIOException获取与Socket相关联的字节输入流,用于从Socket中读数据。OutputStreamgetOutputStream()throwsIOException获取与Socket相关联的字节输出流,用于向Socket中写数据。表13.1Socket类的常用方法Java实用教程(第3版)13.2TCP网络编程服务器端需要创建监听特定端口的ServerSocket,ServerSocket等待客户端发起TCP连接,然后返回一个用于与该客户端进行TCP通信的Socket对象。ServerSocket类的构造方法如下:ServerSocket(intport)throwsIOException:功能:创建绑定到特定端口的服务器套接字。连接队列的最大长度是50,当连接队列已满,又有客户端发起连接请求时,服务器将拒绝该连接请求。(连接队列是指已完成TCP三次握手但还没有被accept()取走的TCP连接)ServerSocket(intport,intbacklog)throwsIOException功能:利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。backlog表示队列的最大长度。ServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException功能:使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器,bindAddr表示要将服务器绑定到的InetAddress。Java实用教程(第3版)13.2TCP网络编程ServerSocket类的常用方法如表13.2所示。方法功能Socketaccept()throwsIOException等待客户端的连接请求,返回与该客户端进行通信用的Socket对象voidsetSoTimeout(inttimeout)throwsSocketException设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效。voidclose()throwsIOException关闭监听SocketInetAddressgetInetAddress()返回此服务器套接字的本地地址intgetLocalPort()返回此套接字在其上监听的端口号SocketAddressgetLocalSocketAddress()返回此套接字绑定的端点的地址表13.2ServerSocket类的常用方法Java实用教程(第3版)13.2.1InetAddress类InetAddress类的对象用于表示IP地址,该类没有明确定义构造方法,常用的方法如表11.3所示。方法功能staticInetAddress[]getAllByName(Stringhost)throwsUnknownHostException返回主机名host所对应的所有IP,每一个IP用一个InetAddress对象表示,结果返回的是一个一维的InetAddress数组。staticInetAddressgetByName(Stringhost)throwsUnknownHostException返回主机名host所对应的一个IP。若该主机名对应多个IP,则随机返回其中一个IP,该IP用InetAddress对象表示。staticInetAddressgetLocalHost()throwsUnknownHostException返回本地主机的IP地址。该IP用InetAddress对象表示。publicbyte[]getAddress()返回组成该IP地址的四个字节。按网络字节存放,即最高字节放在getAddress()[0]中。staticInetAddressgetByAddress(byte[]addr)throwsUnknownHostException返回由该四个字节组成的IP地址的InetAddress对象。byte[]getAddress()返回IP地址的四个字节组成的数组。表13.3InetAddress类的常用方法Java实用教程(第3版)13.2.1InetAddress类【例13.1】返回域名相应的IP地址,若没有给出域名,则返回本地主机的IP地址。运行程序,在文本框中输入新浪的域名“”,则在列表框中显示新浪的IP地址信息,如图13.2所示。图13.2获取新浪的IP地址Java实用教程(第3版)13.2.2TCP通信程序【例13.2】一个简单TCP通信程序,客户端程序向服务器程序发送任意的字符串,服务器程序收到后,显示收到的字符串。首先建立一个TCP服务器程序。在这个程序中,创建一个在8866端口上等待连接的ServerSocket对象。当接收到一个客户端的连接请求后,程序从与这个客户建立连接的Socket对象中获得输入流对象。通过输入流读取客户端程序发送的字符串。再建立TCP客户端程序。由于是本地连接,TCP服务器的IP地址是127.0.0.1,客户端需要与通过服务器的88
本文标题:第13章Java网络编程.
链接地址:https://www.777doc.com/doc-2129524 .html