Java程序设计:网络编程

上传人:大米 文档编号:570289464 上传时间:2024-08-03 格式:PPT 页数:31 大小:196.50KB
返回 下载 相关 举报
Java程序设计:网络编程_第1页
第1页 / 共31页
Java程序设计:网络编程_第2页
第2页 / 共31页
Java程序设计:网络编程_第3页
第3页 / 共31页
Java程序设计:网络编程_第4页
第4页 / 共31页
Java程序设计:网络编程_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《Java程序设计:网络编程》由会员分享,可在线阅读,更多相关《Java程序设计:网络编程(31页珍藏版)》请在金锄头文库上搜索。

1、网络通信网络通信Java与与InternetInetAddress与与URLSocket通信通信数据报通信数据报通信TCP/IP网络参考模型包括五个层次:网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物应用层、传输层、网络层、链路层、物理层。理层。大多数基于大多数基于Internet的应用程序被看作的应用程序被看作TCP/IP网络的最上层,网络的最上层,如:如:ftp,http,smtp,pop3,telnet等。等。Java与与Internet网络基本概念网络基本概念物理层物理层传输层传输层:在在TCP/IP网络中,不同的机器网络中,不同的机器之间进行通信时,数据的传输是由传输之

2、间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。器及应用程序、数据的质量控制等。TCP/IP网络中最常用的传输协议就是网络中最常用的传输协议就是TCP(TransportControlProtocol)和)和UDP(UserDatagramProtocol)。)。网络层网络层:对对TCP/IP网络中的硬件资源进网络中的硬件资源进行标识。连接到网络中的每台计算机行标识。连接到网络中的每台计算机(或其他设备)都有唯一的地址,这就(或其他设备)都有唯一的地址,这就是是IP地址。地址。IP地址实质上是一个地址实质上是一

3、个32位的位的整数,通常以整数,通常以“d.d.d.d”的形式表示,的形式表示,每个每个d是一个是一个8位整数。位整数。Java与与Internet网络基本概念网络基本概念物理层物理层传输层中传输层中两类传输协议两类传输协议nTCP (Transport Control Protocol )面向连接的能够提供面向连接的能够提供可靠的流式数据传输可靠的流式数据传输的协议。类似于的协议。类似于打打电话的过程电话的过程。URL, Socket, ServerSocket等类都使用等类都使用TCP协议进行网络协议进行网络通讯。通讯。nUDP (User Datagram Protocol )非面向连接

4、的提供非面向连接的提供不可靠的数据包式的数据传输不可靠的数据包式的数据传输的协议。类的协议。类似于从似于从邮局发送信件邮局发送信件的过程。的过程。DatagramPacket, DatagramSocket等类使用等类使用UDP协议进协议进行网络通讯。行网络通讯。 注注:当对所传输的数据具有时序性和可靠性等要求时,应使:当对所传输的数据具有时序性和可靠性等要求时,应使用用TCP协议;当传输的数据比较简单、对时序等无要求时,协议;当传输的数据比较简单、对时序等无要求时,UDP协议能发挥更好的作用。协议能发挥更好的作用。Java与与Internet网络基本概念网络基本概念 一台机器只通过一条链路连

5、接到网络上,但一台机器中一台机器只通过一条链路连接到网络上,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(要靠网络端口号(port)了)了。 端口号是一个标记机器的端口号是一个标记机器的逻辑通信信道的正整数逻辑通信信道的正整数,端口,端口号不是物理实体。号不是物理实体。IP地址和端口号组成了所谓的地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点是网络上运行的程序之间双向通信链路的最后终结点。网络服务网络服务httpftp其他服务23telnet端口端口2180客

6、户程序客户程序SocketIP,portIP与端口号组合与端口号组合而得出的而得出的Socket,可以完全分辨可以完全分辨Internet上运行的上运行的程序。程序。 端口号是用一个端口号是用一个16位的整数来表达的,其范围为位的整数来表达的,其范围为065535,其中,其中01023为系统所保留,专门给那些通用的服务(为系统所保留,专门给那些通用的服务(well-known services),如),如http服务的端口号为服务的端口号为80,telnet服务的服务的端口号为端口号为21,ftp服务的端口为服务的端口为23,因此,当我们编写通信程因此,当我们编写通信程序时,应选择一个大于序时

7、,应选择一个大于1023的数作为端口号,以免发生冲突。的数作为端口号,以免发生冲突。Java与与Internet端口号端口号ServerClientServiceshttp(80)SMTP(25)ftp(21)telnet(23)Java与与InternetJava中的网络支持中的网络支持针对网络通信的不同层次,针对网络通信的不同层次,Java提供的网络功能有四大类:提供的网络功能有四大类:InetAddress、URL、Socket、Datagram。nInetAddress面向的是面向的是IP层,用于标识网络上的硬件资层,用于标识网络上的硬件资源。源。nURL面向的应用层,通过面向的应用层

8、,通过URL,Java程序可以直接送程序可以直接送出或读入网络上的数据。出或读入网络上的数据。nSocket和和Datagram面向的则是传输层。面向的则是传输层。Sockets使用的使用的是是TCP协议,这是传统网络程序最常用的方式,可以想象协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。为两个不同的程序通过网络的通信信道进行通信。Datagram则使用则使用UDP协议,是另一种网络传输方式,它协议,是另一种网络传输方式,它把把数据的目的地纪录在数据包中数据的目的地纪录在数据包中,然后直接放在网络上。,然后直接放在网络上。类类InetAddress可以

9、用于标识网络上的硬件资源,它提可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。供了一系列方法以描述、获取及使用网络资源。InetAddress类实例通常是用它提供的静态方法来获取:类实例通常是用它提供的静态方法来获取:publicstaticInetAddressgetByName(Stringhost)host可以是一个机器名,也可以是一个形如可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的的IP地址或一个地址或一个DNS域名。域名。publicstaticInetAddressgetLocalHost()这两个方法通常会产生这两个方法通常会产生Un

10、knownHostException例例外,应在程序中捕获处理。外,应在程序中捕获处理。以下是以下是InetAddress类的类的几个主要方法:几个主要方法:publicStringgetHostAddress():获得本对象的获得本对象的IP地址地址“%d.%d.%d.%d”。publicStringgetHostName():获得本对象的机器名。获得本对象的机器名。使用使用InetAddress测试InetAddress类 import .InetAddress;public class InetAddressDemo public static void main(String args

11、) throws Exception / 所有异常抛出所有异常抛出InetAddress locAdd = null; / 声明声明InetAddress对对象象InetAddress remAdd = null; / 声明声明InetAddress对对象象locAdd = InetAddress.getLocalHost();/ 得到本地得到本地InetAddress对对象象remAdd = InetAddress.getByName(); / 取得取得远远程程InetAddressSystem.out.println(本机本机IP地址:地址: + locAdd.getHostAddress

12、();/ 得到本地得到本地IP地址地址System.out.println(“google的的IP地址:地址: + remAdd.getHostAddress();/ 得到得到远远程程IP地址地址Socket通信通信在在Java中,基于中,基于TCP协议实现网络通信的类有协议实现网络通信的类有两个:在客户端两个:在客户端的的Socket类和在服务器端类和在服务器端的的ServerSocket类。类。n在服务器端通过在服务器端通过指定一个用来等待的连接的端口号指定一个用来等待的连接的端口号创创建一个建一个ServerSocket实例。实例。n在客户端通过规定一个主机和端口号创建一个在客户端通过规

13、定一个主机和端口号创建一个socket实例,连到服务器上。实例,连到服务器上。nServerSocket类的类的accept方法使服务器处于阻塞状态,方法使服务器处于阻塞状态,等待用户请求。等待用户请求。创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流发送谈话信息发送谈话信息接收用户谈话信息接收用户谈话信息创建创建Socket实例实例定义数据成员定义数据成员建立建立socket流流发送谈话信息发送谈话信息接收服务器谈话信息接收服务器谈话信息关闭流关闭流accept()127.0.0.144444444结束谈话结束谈话(By

14、e.)结束谈话结束谈话(Bye.)关闭流关闭流服服务务器器端端客客户户端端类类Socket 构造方法:构造方法:publicSocket(Stringhost,intport)Socket的输入的输入/输出流管理输出流管理publicInputStreamgetInputStream()publicOutputStreamgetOutputStream()关闭关闭Socketpublicvoidclose()throwsIOException注:上述方法都将抛出例外注:上述方法都将抛出例外IOException,程序中需要捕程序中需要捕获处理。获处理。类类ServerSocket 构造方法:构

15、造方法:publicServerSocket(intport)主要方法主要方法publicSocketaccept():等待客户端的连接等待客户端的连接publicvoidclose():关闭关闭Socket注:这些方法都将抛出例外注:这些方法都将抛出例外IOException,程序中需要捕程序中需要捕获处理。获处理。Socket通信通信 无论一个无论一个Socket通信程序的功能多么齐全、程序多通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本么复杂,其基本结构都是一样的,都包括以下四个基本步骤:步骤:1、在客户方和服务器方创建、在客户方和服务器方创建Socket

16、/ServerSocket。2、打开连接到打开连接到Socket的输入的输入/输出流。输出流。3、利用输入利用输入/输出流,按照一定的协议对输出流,按照一定的协议对Socket进进行读行读/写操作。写操作。4、关闭输入、关闭输入/输出流和输出流和Socket。 通常,我们的主要工作是针对所要完成的功能在第通常,我们的主要工作是针对所要完成的功能在第3步进行编程,第步进行编程,第1、2、4步对所有的通信程序来说几乎步对所有的通信程序来说几乎都是一样的。都是一样的。Socket通信通信ServerServerSocket(port#)Socketsocket=ServerSocket.accept

17、()接收连接接收连接OutputStreamInputStreamCloseSocketClientSocket(host,port#)与服务器建立连接与服务器建立连接OutputStreamInputStreamCloseSocketsocketServer.java Client.javaServer1(1111)client(2222)Server2(2222)client(1111) Servern 解决方案一:解决方案一: 在一台计算机上一次启动多个服务器程序,只要端口号在一台计算机上一次启动多个服务器程序,只要端口号不同。不同。myserver1 myclient1myserver

18、2myclient2Socket通信通信支持多支持多Clientn 解决方案二:解决方案二:将服务器写成多线程的,将服务器写成多线程的,不同的处理线程为不同的客户服不同的处理线程为不同的客户服务务。主线程只负责循环等待,处理线程负责网络连接,接收客。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。户输入的信息。/主线程主线程while(true)acceptaconnection;createathreadtodealwiththeclient;Socket通信通信支持多支持多ClientServerclient1client2serverthread2serverthread

19、1Socket通信通信支持多支持多ClientserverSocket=newServerSocket(4444);while(listening)Socketsocket;socket=serverSocket.accept();/程序将在此等候客户端的连接程序将在此等候客户端的连接newMultiTalkServerThread(socket).start();serverSocket.close();classMultiTalkServerThreadextendsThreadpublicMultiTalkServerThread(Socketsocket)this.socket=soc

20、ket;publicvoidrun()Socket通信通信支持多支持多Client客户客户1客户客户2服务器服务器线程线程1()线程线程2()Computer_client.javaComputer_server.javaUDP协议是无连接的协议,它以数据报作为数据传输的载协议是无连接的协议,它以数据报作为数据传输的载体。体。数据报是一个在网络上发送的独立信息数据报是一个在网络上发送的独立信息,它的到达、到,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,限制的,每个数据报的大小限定在每个数据报的大小限定在64KB以内

21、以内。UDP协议无需在发送方和接收方建立连接。协议无需在发送方和接收方建立连接。数据报在网上数据报在网上可以以任何可能的路径传往目的地可以以任何可能的路径传往目的地。在在Java中,下面两个类是基于中,下面两个类是基于UDP协议实现网络通信的:协议实现网络通信的:用于表达通信数据的数据报类用于表达通信数据的数据报类DatagramPacket用于进行端到端通信的类用于进行端到端通信的类DatagramSocket数据报通信数据报通信datagramserverclient建立数据报建立数据报socket();建立一个数据报建立一个数据报packet等待请求报文等待请求报文建立数据报建立数据报s

22、ocket建立一个请求数据报建立一个请求数据报发出请求发出请求获得对方地址获得对方地址构成信息包构成信息包发送出去发送出去创建接收包创建接收包等待接收等待接收接收端接收端发送端发送端 构造方法构造方法publicDatagramPacket(bytebuf,intlength)上述方法用于接收数据上述方法用于接收数据publicDatagramPacket(bytebuf,intlength,InetAddressaddress,intport)上述方法用于发送数据上述方法用于发送数据获取数据获取数据获取接收报中的信息获取接收报中的信息publicInetAddressgetAddress()

23、publicintgetPort()publicbytegetData()publicintgetLength()设置数据设置数据设置发送报中的信息设置发送报中的信息setAddress(InetAddressiaddr)setPort(intiport)setData(bytebuf)setLength(intlength)数据报通信数据报通信类类DatagramPacket 构造方法构造方法publicDatagramSocket()/用来发送用来发送publicDatagramSocket(intport):在指定的端口通信在指定的端口通信/用来接收用来接收上述方法都将抛出例外上述方法都

24、将抛出例外SocketException,程序中需要捕获处程序中需要捕获处理。理。最主要的方法最主要的方法发送与接收数据报发送与接收数据报publicvoidreceive(DatagramPacketp)publicvoidsend(DatagramPacketp)这两个方法都将抛出例外这两个方法都将抛出例外IOException,程序中需要捕获处理。程序中需要捕获处理。数据报通信数据报通信类类DatagramSocket数据报通信数据报通信发送端发出数据报的标准步骤:发送端发出数据报的标准步骤:1.定义数据成员定义数据成员DatagramSocketsocket;DatagramPacke

25、tpacket;InetAddressaddress;(用来存放接收方的地址用来存放接收方的地址)intport;(用来存放接收方的端口号用来存放接收方的端口号)2.创建数据报创建数据报Socket对象对象trysocket=newDatagramSocket(4445);catch(.SocketExceptione)socket绑定到一个本地的可用端口,等待接收客户的请求。绑定到一个本地的可用端口,等待接收客户的请求。3.分配并填写数据缓冲区分配并填写数据缓冲区(一个字节类型的数组一个字节类型的数组)bytebuf=newbyte256;存放从客户端接收的请求信息。存放从客户端接收的请求信

26、息。4.创建一个创建一个DatagramPacketpacket=newDatagramPacket(buf,256);用来从用来从socket接收数据,它只需要两个参数。接收数据,它只需要两个参数。5.服务器阻塞服务器阻塞socket.receive(packet);在客户的请求数据报到来之前一直等待。在客户的请求数据报到来之前一直等待。数据报通信数据报通信6.从到来的包中得到地址和端口号从到来的包中得到地址和端口号InetAddressaddress=packet.getAddress();intport=packet.getPort();7.将数据送入缓冲区将数据送入缓冲区buf或来自文

27、件、或键盘输入或来自文件、或键盘输入8.建立报文包建立报文包,用来向用来向socket上发送信息上发送信息packet=newDatagramPacket(buf,buf.length,address,port);9.发送数据包发送数据包socket.send(packet);10.关闭关闭socketsocket.close();数据报通信数据报通信数据报通信数据报通信点到点通信点到点通信接收端接收数据报的标准步骤:接收端接收数据报的标准步骤:1.定义数据成员定义数据成员intport;InetAddressaddress;DatagramSocketsocket;DatagramPacke

28、tpacket;bytesendBuf=newbyte256;2.建立建立socket(用来发送数据报用来发送数据报)socket=newDatagramSocket();数据报通信数据报通信点到点通信点到点通信3.向服务器发出请求报文向服务器发出请求报文address=InetAddress.getByName(args0);port=parseInt(args1);packet=newDatagramPacket(sendBuf,256,address,port);socket.send(packet);这个数据报本身带有客户端的信息这个数据报本身带有客户端的信息4.客户机等待应答客户机等

29、待应答packet=newDatagramPacket(sendBuf,256);socket.receive(packet);如果没有到就一直等待,因此实用程序要设置时间限度如果没有到就一直等待,因此实用程序要设置时间限度5.处理接收到的数据处理接收到的数据Stringreceived=newString(packet.getData(),0,length);System.out.println(received);UDP客户端 UDPClient import .DatagramPacket;import .DatagramSocket;public class UDPClient pub

30、lic static void main(String args) throws Exception DatagramSocket ds = null;/ 声明声明DatagramSocket对对象象byte buf = new byte1024;/ 定定义义接收数据的字接收数据的字节节数数组组DatagramPacket dp = null;/ 声明声明DatagramPacket对对象象ds = new DatagramSocket(9000);/ 此客此客户户端在端在9000端口端口监监听听dp = new DatagramPacket(buf, 1024);/ 指定接收数据的指定接收数

31、据的长长度度为为1024System.out.println(等待接收数据。等待接收数据。) ;/ 输输出信息出信息ds.receive(dp);/ 接收数据接收数据String str = new String(dp.getData(), 0, dp.getLength() + from + dp.getAddress().getHostAddress() + : + dp.getPort();/ 接收数据接收数据System.out.println(str);/ 输输出数据出数据ds.close();/ 关关闭闭编写UDP发送的服务器端程序 UDPServer import .Datagr

32、amPacket;import .DatagramSocket;import .InetAddress;public class UDPServer public static void main(String args) throws Exception DatagramSocket ds = null;/ 声明声明DatagamSocket对对象象DatagramPacket dp = null;/ 声明声明DatagramPacket对对象象ds = new DatagramSocket(3000);/ 服服务务器端在器端在3000端口端口监监听听String str = hello w

33、orld ;/ 准准备备好要好要发发送的信息送的信息/ 实实例化例化DatagramPacket对对象,指定数据内容,数据象,指定数据内容,数据长长度,要度,要发发送的目送的目标标地址,地址,发发送端口送端口dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(localhost), 9000);/ 此此处处向客向客户户端所在的端所在的9000端口端口发发送信息送信息System.out.println(发发送信息。送信息。) ;/ 信息信息输输出出ds.send(dp);/ 发发送数据送数据报报ds.close();/ 关关闭闭数据报通信数据报通信点到点通信点到点通信Beijing_Frame.javaShanghai_Frame.java

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

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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