网络编程基础教程

上传人:hs****ma 文档编号:569458719 上传时间:2024-07-29 格式:PPT 页数:38 大小:143.50KB
返回 下载 相关 举报
网络编程基础教程_第1页
第1页 / 共38页
网络编程基础教程_第2页
第2页 / 共38页
网络编程基础教程_第3页
第3页 / 共38页
网络编程基础教程_第4页
第4页 / 共38页
网络编程基础教程_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《网络编程基础教程》由会员分享,可在线阅读,更多相关《网络编程基础教程(38页珍藏版)》请在金锄头文库上搜索。

1、第7章 网络编程 nJava号称Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易的开发常见的网络应用程序。nJava提供的网络类库,可以实现无痛苦的网络连接,连网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。17.1.1 网络基础 n网络编程的目的就是指直接或间接地通过网络协议与其它计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确地定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效地进行数据传输。n要想让处于网络中的主机互相通信,只是知道通信双方地址还

2、是不够的,还必须遵循一定的规则。有两套参考模型:OSI参考模型,TCP/IP参考模型(或TCP/IP协议)。由于OSI参考模型过于理想化,未能在因特网上进行广泛推广。这样,TCP/IP协议就成为事实上的国际标准。27.1.2 TCP/IP协议簇 nTCP/IP以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即网络接口层、IP层、传输层和应用层。下图表示了TCP/IP的分层结构和与OSI参考模型的对应关系。 37.1.3 TCP和和UDP这里只重点介绍T

3、CP/IP协议的运输层协议。运输层协议中有两个非常重要的协议:传输控制协议TCP(Transmission Control Protocol),用户数据报协议UDP(User Datagram Protocol)。传输控制协议TCP是面向连接的运输层协议。即应用进程(或程序)在使用TCP协议之前,必须先建立TCP连接,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程。另一个是客户进程。用户数据报协议UDP是面向无连接的运输层协议。即应用进程(或程序)在使用UDP协议之前,不必先建立连接。自然,发送数据结束时也没有连接需要释放。因此,减少了开销和发送数据之

4、前的时延。47.2 InetAdress类 Internet上的主机有两种方式表示地址: (1)域名 例如, (2)IP 地址 例如,202.108.35.210 包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址: 。 域名容易记忆,当你在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样我们才能和主机建立连接。 57.2 InetAdress类 1获取Internet上主机的地址 我们可以使用InetAddress类的静态方法: getByName(String s); 将一个域名或IP地址传递给该方法的参数s,获得一个 In

5、etAddress对象,该对象含有主机地址的域名和IP地 址,该对象用如下格式表示它包含的信息: 下面的例子:InetAddressTest.java. 分别获取域名是的主机域名及IP地址。6public class InetAddressTest public static void main(String args) try InetAddress address_1=InetAddress.getByName(“”);/InetAddress类需处 理异常 System.out.println(address_1.toString(); System.out.println(addres

6、s_1.getHostName();/取InetAddress对象所含的域名。 System.out.println(address_1.getHostAddress();/获取InetAddress对象所含的IP地址。 InetAddress address_2=InetAddress.getLocalHost();/对象含有本地机的域名和IP地址。 System.out.println(address_2.toString(); catch(UnknownHostException e) System.out.println(); 7使用InetAddressn调用上述方法获取InetAd

7、dress对象时,如果指定的主机名或IP地址不能被解析,将抛出UnknownHostException异常。例: try InetAddress address = InetAddress.getByName(); catch (UnknownHostException ex) System.out.println(Could not find ); n为了创建InetAddress对象,Java需要执行主机名和IP地址之间的相互解析工作,这对系统来说可能是一个耗时的开销,为了避免一些重复的解析工作,Java虚拟机内部采取了缓存机制。87.2 InetAdress类另外,InetAddress

8、类中含有两个实例方法: public String getHostName() 取InetAddress对象所含的域名。 public String getHostAddress() 获取InetAddress对象所含的IP地址。 2获取本地机的地址 我们可以使用InetAddress类的静态方法:getLocalHost();获得一个InetAddress对象,该对象含有本地机的域名和IP地址。例如: InetAddress address_2=InetAddress.getLocalHost(); System.out.println(address_2.toString(); 97.3

9、TCP程序设计 n客户端服务器模型是最常见的网络应用程序模型。当我们上网冲浪时,我们所使用的浏览器(例如IE)就是一个客户端软件,而提供网页的站点必需运行一个WEB服务器。一般而言,主动发起通信的应用程序属于客户端。而服务器则是等待通信请求,当服务器收到客户端的请求,执行需要的运算然后向客户端返回结果。10套接字Socket IP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号与IP地址的组合得出一个网络套接字。端口号被规定为一个16位的整数065535。其中,01023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们

10、需要访问这些特定服务,否则,就应该使用102465535这些端口中的某一个进行通信,以免发生端口冲突。 117.3 TCP程序设计n利用套接字(socket)接口开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。套接字能执行7种基本操作: 连接到远程机器。 绑定到端口。 接收从远程机器来的连接请求。 监听到达的数据。 发送数据。 接收数据。 关闭连接。127.3 TCP网络编程网络编程两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一段称为一个Socket (套接字)。Socket通常用来实现Client/Server连接。Java语言的基于套接字编程分为服

11、务器编程和客户端编程,其通信模型如图7.3.1所示。图图7.3.1基于基于TCP的的Socket通信通信137.3 基于基于Socket的的C/S程序程序l客户端客户端Socket的工作过程包含以下四个基本的步骤:的工作过程包含以下四个基本的步骤:(1)创建创建Socket。根据指定的。根据指定的IP地址或端口号构造地址或端口号构造Socket类对象。如类对象。如服务器端响应,则建立客户端到服务器的通信线路。服务器端响应,则建立客户端到服务器的通信线路。(2)打开连接到打开连接到Socket的输入的输入/出流。出流。 使用使用getInputStream()方法()方法获得输入流,使用获得输入

12、流,使用getOutputStream()方法获得输出流。()方法获得输出流。 (3)按照一定的协议对按照一定的协议对Socket进行读进行读/写操作。通过输入流读取服写操作。通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。息写入线程。 (4)关闭关闭Socket。断开客户端到服务器的连接,释放线路。断开客户端到服务器的连接,释放线路 14n对于服务器和客户机而言,将上述第一步改为构造对于服务器和客户机而言,将上述第一步改为构造ServerSocket类类对象,监听客户端的请求并进行

13、响应。对象,监听客户端的请求并进行响应。n(1) 调用调用ServerSocket(int port)创建一个服务器端套接字,并绑创建一个服务器端套接字,并绑定到指定端口上。定到指定端口上。n(2) 调用调用accept(),监听连接请求,如果客户端请求连接,则接受,监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。连接,返回通信套接字。n(3) 调用调用Socket类的类的getOutputStream和和getInputStream获取获取输出流和输入流,开始网络数据的发送和接收。输出流和输入流,开始网络数据的发送和接收。n(4) 最后关闭通信套接字。最后关闭通信套接字。服务器

14、程序的工作过程包含以下四个基本的步骤:服务器程序的工作过程包含以下四个基本的步骤:15图7.1 基于Socket的C/S通信167.3 TCP网络编程网络编程 (1)服务器建立ServerSocket对象 ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。n 17 当建立服务器套接字时可能发生IOException异常,因此要象下面那样建立接收客户的服务器套接字。 try ServerSocket ss=new ServerSocket(1880); Socket

15、socketAtServer = ss.accept(); catch(IOException e)注意:接收客户的套接字也可能发生IOException异常。所谓“接收”客户的套接字请求,就是accept()方法会返回一个Socket对象: socketAtServer,称作服务器端的套接字对象。 187.3 TCP网络编程网络编程ServerSocketServerSocket类的构造方法如下:类的构造方法如下:lServerSocket(int port)throws IOException:功能:创建绑定到特定端口的服务器套接字。lServerSocket(int port,int b

16、acklog)throws IOException功能:利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。backlog表示队列的最大长度。lServerSocket(int port,int backlog,InetAddress bindAddr)throws IOException功能:使用指定的端口、侦听backlog和要绑定到的本地 IP 地址创建服务器,bindAddr表示要将服务器绑定到的InetAddress。19(2)客户端创建Socke对象。客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造方法是:Soc

17、ket(String host,int port)throws UnknownHostException,IOException功能:向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。Socket(InetAddress address,int port)throws IOException功能:同上。只是根据InetAddress对象所表示的IP地址以及端口号port发起连接。20 创建Socket对象可能发生IOException异常,因此要象下面那样建立到服务器的套接字连接。 try Socket socketAtClient =n

18、ew Socket(“”,1880); catch(IOException e) 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求,如果服务器端相应的端口上有ServerSocket对象正在使用accept方法等待客户,那么双方的套接字对象socketAtClient和socketAtServer就都诞生了。 21 (3)流连接 客户端和服务器端的套接字对象诞生以后,还必须进行输入、输出流的连接。 服务器端的这个Socket对象socketAtServer使用方法getOutputStream()获 得 的 输 出 流 将 指 向 客 户 端 Socket对 象

19、socketAtClient 使 用 方 法 getInputStream()获 得 的 那 个 输 入 流 ; 同 样 , 服 务 器 端 的 这 个 Socket对 象socketAtServer使用方法getInputStream()获得的输入流将指向客户端Socket对象socketAtClient使用方法getOutputStream()获得的那个输出流。因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。 图7.3 套接字连接示意图客 户 端Socket输入流输出流服 务 器 端Socket输出流输入流 连接 连接22客户机向服务器发送信息的简单代码Pr

20、intWriter out=new PrintWriter(clientSocket.getOutputStream();String str=来自客户机的信息 ;out.println(str); /将要发送的信息写入out中out.flush(); /强制将out中的数据送出clientSocket.close();/关闭连接端口 C/S之间通讯代码服务器接收客户机信息的简单代码BufferedReader in=new BufferedReader(new InputStreamReader(serverSocket.getInputStream();/从Socket端口读入信息Stri

21、ng str = in.readLine();System.out.println(str);serverSocket.close();23套接字调用 close()可以关闭双方的套接字连接,只要一方关闭连接,就会导致对方发生IOException异常。 下面我们通过一个简单的例子说明上面讲的概念。 247.3 TCP通信程序通信程序【例例1 1】一个简单TCP通信程序,客户端程序向服务器程序发送任意的字符串,服务器程序收到后,显示收到的字符串。首先建立一个TCP服务器程序。在这个程序中,创建一个在8866端口上等待连接的ServerSocket对象。当接收到一个客户端的连接请求后,程序从与这

22、个客户建立连接的Socket对象中获得输入流对象。通过输入流读取客户端程序发送的字符串。 再建立TCP 客户端程序。由于是本地连接,TCP服务器的IP地址是127.0.0.1,客户端需要与通过服务器的8866端口建立连接完成通信,所以在客户端指定要与服务器连接的端口号为8866。同样,客户端利用创建的Socket对象来获得输出流对象。通过输出流向服务器端发送字符串。257.3 TCP通信程序通信程序运行上面的TCP客户服务器程序。首先在客户端文本框中输入字符串,按下回车键,这些字符串将显示在客户端的窗口上。并且,这些数据将发送给服务器端,服务器端接受到从客户端发送的字符串,将显示在窗口上,如图

23、7.3.3 、图7.3.4所示。图图7.3.3服服务务器端器端 图图7.3.4 客客户户端端267.3 TCP网络编程网络编程Socket类的常用方法如表13.1所示。方法功能InetAddress getLocalAddress()返回对方Socket中的IP的InetAddress对象int getLocalPort()返回本地Socket中的端口号InetAddress getInetAddress()返回对方Socket中IP地址int getPort()返回对方Socket中的端口号void close() throws IOException关闭Socket,释放资源InputSt

24、ream getInputStream() throws IOException获取与Socket相关联的字节输入流,用于从Socket中读数据。OutputStream getOutputStream() throws IOException获取与Socket相关联的字节输出流,用于向Socket中写数据。表表7.3.1 Socket类类的常用方法的常用方法277.3 TCP网络编程网络编程ServerSocket类的常用方法如表7.3.2所示。方法功能Socket accept() throws IOException 等待客户端的连接请求,返回与该客户端进行通信用的Socket对象voi

25、d setSoTimeout(int timeout) throws SocketException 设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效。void close()throws IOException关闭监听SocketInetAddress getInetAddress()返回此服务器套接字的本地地址i

26、nt getLocalPort()返回此套接字在其上监听的端口号SocketAddress getLocalSocketAddress()返回此套接字绑定的端点的地址表表7.3.2 ServerSocket类类的常用方法的常用方法287.3 TCP通信程序通信程序【例例1 1】一个简单TCP通信程序,客户端程序向服务器程序发送任意的字符串,服务器程序收到后,显示收到的字符串。首先建立一个TCP服务器程序。在这个程序中,创建一个在8866端口上等待连接的ServerSocket对象。当接收到一个客户端的连接请求后,程序从与这个客户建立连接的Socket对象中获得输入流对象。通过输入流读取客户端程

27、序发送的字符串。 再建立TCP 客户端程序。由于是本地连接,TCP服务器的IP地址是127.0.0.1,客户端需要与通过服务器的8866端口建立连接完成通信,所以在客户端指定要与服务器连接的端口号为8866。同样,客户端利用创建的Socket对象来获得输出流对象。通过输出流向服务器端发送字符串。297.3 TCP通信程序通信程序运行上面的TCP客户服务器程序。首先在客户端文本框中输入字符串,按下回车键,这些字符串将显示在客户端的窗口上。并且,这些数据将发送给服务器端,服务器端接受到从客户端发送的字符串,将显示在窗口上,如图7.3.3 、图7.3.4所示。图图7.3.3服服务务器端器端 图图7.

28、3.4 客客户户端端30lServer和一个客户的对话和一个客户的对话【例例12-3】基于基于Socket的单客户端程序的单客户端程序/客户端程序客户端程序import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import .*;public class ClientDemopublic static void main(String args)trySocket client=new Socket(127.0.0.1,4000);BufferedReader sin=new Buffer

29、edReader(new InputStreamReader(System.in);BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream();31PrintWriter os=new PrintWriter(client.getOutputStream();String msg;msg=sin.readLine();while(!msg.equals(bye)os.println(msg);os.flush();System.out.println(I SAY:+msg);System.

30、out.println(Server SAY:+is.readLine();msg=sin.readLine();System.out.println(The Talk End!);os.close();is.close();client.close();catch(IOException e)System.out.println(Error:+e);32lServer和多个客户的对话和多个客户的对话【例例12-4】基于基于Socket的多客户端程序的多客户端程序/多个客户服务端程序多个客户服务端程序import java.awt.*;import java.awt.event.*;impor

31、t javax.swing.*;import java.io.*;import .*;public class ServerToMultiDemostatic int intClient=1;public static void main(String args) throws IOExceptionServerSocket serversocket=null;tryserversocket=new ServerSocket(4000);System.out.println(Server is starting.);catch(IOException e)33System.out.printl

32、n(Error+e);while(true)ServerThread st=new ServerThread(serversocket.accept(),intClient);st.start();intClient+;class ServerThread extends ThreadSocket server;int intCounter;public ServerThread(Socket socket,int num)server=socket;intCounter=num;34public void run()tryString msg;BufferedReader sin=new B

33、ufferedReader(new InputStreamReader(System.in);BufferedReader is=new BufferedReader(new InputStreamReader(server.getInputStream();PrintWriter os=new PrintWriter(server.getOutputStream();System.out.println(Client +intCounter+:+is.readLine();msg=sin.readLine();while(!msg.equals(bye)os.println(msg);os.

34、flush();System.out.println(I:+msg);35System.out.println(Client +intCounter+:+is.readLine();msg=sin.readLine();System.out.println(The Talk End!);os.close();is.close();server.close();catch(IOException e)System.out.println(Error:+e);367.6小结 n计算机网络是指计算机通过通信介质相互连接的集合。网络由硬件和软件共同组成以提供各种服务。位于网络中的计算机具有唯一的IP地

35、址,这样不同的主机可以互相区分。为了便于人的记忆,为计算机赋予了不同主机名。在应用程序中,可以通过主机名指定计算机,而在网络层必须通过IP地址来指定计算机。n客户端服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话,UDP协议用于实现无连接的会话。nJava中有关网络方面的功能都定义在程序包中。Java用InetAdd

36、ress对象表示IP地址,该对象里有两个字段:主机名(String)和IP地址(int)。n类Socket和ServerSocket实现了基于TCP协议的客户端服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为TCP协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。n类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。DatagramPacket对象封装了UDP数据报,在数据报中包含了客户端的IP地址和端口号以及服务器的IP地址和端口号。

37、UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。n类URL和URLConnection提供了最高级网络应用。URL的网络资源的位置来同一表示Internet上各种网络资源。通过URL对象可以创建当前应用程序和URL表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。377.6小结 n计算机网络是指计算机通过通信介质相互连接的集合。网络由硬件和软件共同组成以提供各种服务。位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。为了便于人的记忆,为计算机

38、赋予了不同主机名。在应用程序中,可以通过主机名指定计算机,而在网络层必须通过IP地址来指定计算机。n客户端服务器是一种最常见的网络应用程序模型。服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话,UDP协议用于实现无连接的会话。nJava中有关网络方面的功能都定义在程序包中。Java用InetAddress对象表示IP地址,该对象里有两个字段:主机名(St

39、ring)和IP地址(int)。n类Socket和ServerSocket实现了基于TCP协议的客户端服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为TCP协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。n类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。DatagramPacket对象封装了UDP数据报,在数据报中包含了客户端的IP地址和端口号以及服务器的IP地址和端口号。UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。n类URL和URLConnection提供了最高级网络应用。URL的网络资源的位置来同一表示Internet上各种网络资源。通过URL对象可以创建当前应用程序和URL表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。38

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号