《网络编程(二).pdf》由会员分享,可在线阅读,更多相关《网络编程(二).pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、网络编程(二)网络编程(二)窦窦 刚刚d d d 流式流式SocketSocketSocketSocket(TCPTCPTCPTCP)可实现准确通信,但占资源较多,在无需)可实现准确通信,但占资源较多,在无需实时通信的情况下并不恰当。实时通信的情况下并不恰当。数据报数据报SocketSocketSocketSocket(UDP)UDP)UDP)UDP)是无连接服务,数据以独立的包为单位发是无连接服务,数据以独立的包为单位发送,不保证传输顺序、路径和内容的准确性。但由于无需建立和送,不保证传输顺序、路径和内容的准确性。但由于无需建立和拆除连结,直接将信息打包传向指定目标,因此比流拆除连结,直接将
2、信息打包传向指定目标,因此比流SocketSocketSocketSocket简简单、速度快。单、速度快。第第1 1 1 1节节 数据报数据报通信通信TCP SocketTCP SocketTCP SocketTCP SocketserverserverserverserverclientclientclientclientUDP DatagramUDP DatagramUDP DatagramUDP Datagram数据报数据报serverserverserverserverclientclientclientclientUDPUDPUDPUDP在通信实例的两端各建立一个在通信实例的两端各建
3、立一个SocketSocketSocketSocket,但这两个,但这两个SocketSocketSocketSocket之间并没有之间并没有虚拟链路,只是用来发送、接收数据报,并虚拟链路,只是用来发送、接收数据报,并不知道将该数据报发送到哪里不知道将该数据报发送到哪里。数据报的每个数据包都要包含目的地址和端口号,进行寻址。数据报的每个数据包都要包含目的地址和端口号,进行寻址。JavaJavaJavaJava通过两个类实现通过两个类实现UDPUDPUDPUDP协议数据报:协议数据报:D D D DatagramPacketatagramPacketatagramPacketatagramPac
4、ket是数据容器是数据容器。DatagramSocketDatagramSocketDatagramSocketDatagramSocket是用来发送和接是用来发送和接收收DatagramPacketDatagramPacketDatagramPacketDatagramPacket的的工具工具。说明:说明:D D D DatagramPacketatagramPacketatagramPacketatagramPacket(信件):数据包,是(信件):数据包,是UDPUDPUDPUDP下进行传输数下进行传输数据的单位,数据存放在字节数组中。据的单位,数据存放在字节数组中。本类用于打包或拆包。
5、发本类用于打包或拆包。发送时打包:包由送时打包:包由数据数据、接收地址接收地址、端口号端口号组成;接收时拆包:组成;接收时拆包:取出包中的数据、接收地址、端口号。取出包中的数据、接收地址、端口号。D D D DatagramSocketatagramSocketatagramSocketatagramSocket(邮递员):对应(邮递员):对应SocketSocketSocketSocket概念,不可使用概念,不可使用输入输出流。输入输出流。发送时,用发送时,用send()send()send()send()方法发送数据;接收时,用方法发送数据;接收时,用receive()receive()r
6、eceive()receive()方法接收数据。方法接收数据。第第1 1 1 1节节 数据报数据报通信通信 1 1 1 1DatagramPacketDatagramPacketDatagramPacketDatagramPacket类类 DatagramPacketDatagramPacketDatagramPacketDatagramPacket类的构造方法有四种形式:类的构造方法有四种形式:第第2 2 2 2节节 UDP socket UDP socket UDP socket UDP socket public DatagramPacket(byte buf,int offset,in
7、t public DatagramPacket(byte buf,int offset,int public DatagramPacket(byte buf,int offset,int public DatagramPacket(byte buf,int offset,int length)length)length)length);public DatagramPacket(byte buf,int length)public DatagramPacket(byte buf,int length)public DatagramPacket(byte buf,int length)publi
8、c DatagramPacket(byte buf,int length);以以上两种形式用于创建接收数据报的上两种形式用于创建接收数据报的DatagramPacketDatagramPacketDatagramPacketDatagramPacket类对象,参类对象,参数数bufbufbufbuf为接收缓冲区,内容为空。为接收缓冲区,内容为空。lengthlengthlengthlength为准备接收的数据报长度为准备接收的数据报长度,offsetoffsetoffsetoffset为数据在为数据在bufbufbufbuf中存储的起始位置。中存储的起始位置。public DatagramPa
9、cket(byte buf,int offset,int public DatagramPacket(byte buf,int offset,int public DatagramPacket(byte buf,int offset,int public DatagramPacket(byte buf,int offset,int length,InetAddress address,int port);length,InetAddress address,int port);length,InetAddress address,int port);length,InetAddress add
10、ress,int port);public DatagramPacket(byte buf,int public DatagramPacket(byte buf,int public DatagramPacket(byte buf,int public DatagramPacket(byte buf,int length,InetAddress address,int port);length,InetAddress address,int port);length,InetAddress address,int port);length,InetAddress address,int por
11、t);以上两种形式用于发送数据的以上两种形式用于发送数据的DatagramPacketDatagramPacketDatagramPacketDatagramPacket类对象,参数类对象,参数bufbufbufbuf是是发送数据缓冲区,包括了要发送的数据。发送数据缓冲区,包括了要发送的数据。lengthlengthlengthlength参数是发送的字节数参数是发送的字节数,addressaddressaddressaddress参数是接收该数据报的主机地址,参数是接收该数据报的主机地址,portportportport为接收的端口号。为接收的端口号。由于由于UDPUDPUDPUDP是面向非
12、连接的,所以接收者并不知道每个数据报由谁发送过是面向非连接的,所以接收者并不知道每个数据报由谁发送过来,可以调用来,可以调用DatagramPacketDatagramPacketDatagramPacketDatagramPacket的如下方法来获取发送者的信息,以便的如下方法来获取发送者的信息,以便于进行信息反馈:于进行信息反馈:public synchronized InetAddress getAddress()public synchronized InetAddress getAddress()public synchronized InetAddress getAddress()
13、public synchronized InetAddress getAddress():返回收到返回收到的数据报的来源地址或发出的数据报的目的地址;的数据报的来源地址或发出的数据报的目的地址;public synchronized int getPort()public synchronized int getPort()public synchronized int getPort()public synchronized int getPort():返回收到的数据报的来返回收到的数据报的来源端口或发出的数据报的目的端口;源端口或发出的数据报的目的端口;public SocketAddre
14、ss getSocketAddress()public SocketAddress getSocketAddress()public SocketAddress getSocketAddress()public SocketAddress getSocketAddress():获取要将此包发获取要将此包发送到的或发出此数据报的远程主机的送到的或发出此数据报的远程主机的 SocketAddressSocketAddressSocketAddressSocketAddress(通常为(通常为 IP IP IP IP 地址地址 +端口号)。端口号)。public synchronized byte
15、getData()public synchronized byte getData()public synchronized byte getData()public synchronized byte getData():取数据报中的数据;取数据报中的数据;public synchronized int getLength()public synchronized int getLength()public synchronized int getLength()public synchronized int getLength():取数据报的长度。取数据报的长度。第第2 2 2 2节节 U
16、DP socket UDP socket UDP socket UDP socket 相应于上述相应于上述getgetgetget方法,还有一组方法,还有一组setsetsetset方法,分别用来设置地址、端方法,分别用来设置地址、端口、数据、长度:口、数据、长度:public synchronized void setAddress(InetAddress iaddr)public synchronized void setAddress(InetAddress iaddr)p public synchronized void setPort(int port)ublic synchroni
17、zed void setPort(int port)p public synchronized void setData(byte ibuf)ublic synchronized void setData(byte ibuf)p public synchronized void setLength(ilength)ublic synchronized void setLength(ilength)第第2 2 2 2节节 UDP socket UDP socket UDP socket UDP socket 2 2 2 2DatagramSocketDatagramSocketDatagramS
18、ocketDatagramSocket类类 DatagramSocketDatagramSocketDatagramSocketDatagramSocket类是用来发送和接收数据报的类是用来发送和接收数据报的SocketSocketSocketSocket,其构造,其构造方法有三种。方法有三种。public DatagramSocket()throws SocketExceptionpublic DatagramSocket()throws SocketExceptionpublic DatagramSocket()throws SocketExceptionpublic DatagramSo
19、cket()throws SocketException 创建一个创建一个DatagramSocketDatagramSocketDatagramSocketDatagramSocket类对象,使用本机默认类对象,使用本机默认IPIPIPIP地址和本机随机选择地址和本机随机选择的一个可用端口;的一个可用端口;public DatagramSocket(int port)throws SocketExceptionpublic DatagramSocket(int port)throws SocketExceptionpublic DatagramSocket(int port)throws S
20、ocketExceptionpublic DatagramSocket(int port)throws SocketException 创建一个创建一个DatagramSocketDatagramSocketDatagramSocketDatagramSocket类对象,使用本地主机指定端口;类对象,使用本地主机指定端口;public DatagramSocket(int port,InetAddress laddr)public DatagramSocket(int port,InetAddress laddr)public DatagramSocket(int port,InetAddre
21、ss laddr)public DatagramSocket(int port,InetAddress laddr)throws SocketExceptionthrows SocketExceptionthrows SocketExceptionthrows SocketException:创建一个创建一个DatagramSocketDatagramSocketDatagramSocketDatagramSocket类对象,使用指定主机地址和指定端口。类对象,使用指定主机地址和指定端口。第第2 2 2 2节节 UDP socket UDP socket UDP socket UDP sock
22、etDatagramSocketDatagramSocketDatagramSocketDatagramSocket类的常用方法有:类的常用方法有:public synchronized void receive(DatagramPacket public synchronized void receive(DatagramPacket public synchronized void receive(DatagramPacket public synchronized void receive(DatagramPacket p)throw IOExceptionp)throw IOExcep
23、tionp)throw IOExceptionp)throw IOException 接接收一个数据报。没有收到数据报时该方法阻塞。如果收到的数收一个数据报。没有收到数据报时该方法阻塞。如果收到的数据长度大于缓冲区长度,超出缓冲区的部分数据将被截去。据长度大于缓冲区长度,超出缓冲区的部分数据将被截去。public void send(DatagramPacket p)throw public void send(DatagramPacket p)throw public void send(DatagramPacket p)throw public void send(DatagramPack
24、et p)throw IOExceptionIOExceptionIOExceptionIOException 发发送一个数据报。送一个数据报。p p p public void close()ublic void close()ublic void close()ublic void close()关关闭该闭该SocketSocketSocketSocket。public InetAddress getLocalAddress()public InetAddress getLocalAddress()public InetAddress getLocalAddress()public Ine
25、tAddress getLocalAddress()获获取本地地址。取本地地址。public int getLocalPort()public int getLocalPort()public int getLocalPort()public int getLocalPort()获获取本地端口。取本地端口。第第2 2 2 2节节 UDP socket UDP socket UDP socket UDP socket第第3 3 3 3节节 建立建立UDPUDPUDPUDP通信通信 创建一个创建一个UDPUDPUDPUDP发送方程序的步骤:发送方程序的步骤:创建一个创建一个DatagramPack
26、etDatagramPacketDatagramPacketDatagramPacket (要发送的信息,包分组长要发送的信息,包分组长度,目的主机度,目的主机IPIPIPIP地址和目的端口号)。地址和目的端口号)。在在指定或可用的本机端口建立指定或可用的本机端口建立DatagramSocketDatagramSocketDatagramSocketDatagramSocket对象,对象,其中其中包含了发送方的包含了发送方的IPIPIPIP地址和端口号。地址和端口号。调用调用DatagramSocketDatagramSocketDatagramSocketDatagramSocket的的se
27、nd()send()send()send()方法方法发送数据发送数据。关关闭闭DatagramSocketDatagramSocketDatagramSocketDatagramSocket。bytebytebytebyte buf=buf=buf=buf=newnewnewnew bytebytebytebyte1024;1024;1024;1024;DatagramSocket datagramSocket=DatagramSocket datagramSocket=DatagramSocket datagramSocket=DatagramSocket datagramSocket=ne
28、wnewnewnew DatagramSocket(10000);DatagramSocket(10000);DatagramSocket(10000);DatagramSocket(10000);D D D DatagramPacket outputPackage=atagramPacket outputPackage=atagramPacket outputPackage=atagramPacket outputPackage=newnewnewnew DatagramPacket(buf,buf.DatagramPacket(buf,buf.DatagramPacket(buf,buf.
29、DatagramPacket(buf,buf.lengthlengthlengthlength,inetAddress,port);inetAddress,port);inetAddress,port);inetAddress,port);datagramSocket.send(outputPackage);datagramSocket.send(outputPackage);datagramSocket.send(outputPackage);datagramSocket.send(outputPackage);datagramSocket.close();datagramSocket.cl
30、ose();datagramSocket.close();datagramSocket.close();创建一个创建一个UDPUDPUDPUDP接收方程序的步骤:接收方程序的步骤:创建一个创建一个DatagramPacketDatagramPacketDatagramPacketDatagramPacket缓冲区缓冲区,用于存储发送方发送的数,用于存储发送方发送的数据及发送方的据及发送方的IPIPIPIP地址和端口号。地址和端口号。在指定或可用的本机端口建立在指定或可用的本机端口建立DatagramSocketDatagramSocketDatagramSocketDatagramSocket
31、对象,对象,其中指其中指定了接收方的定了接收方的IPIPIPIP地址和端口号。地址和端口号。在指定端口上监听。在指定端口上监听。调调用用DatagramSocketDatagramSocketDatagramSocketDatagramSocket的的receive()receive()receive()receive()方法方法接收数据接收数据。收到后,。收到后,将数据保存到缓冲区。将数据保存到缓冲区。关关闭闭DatagramSocketDatagramSocketDatagramSocketDatagramSocketbytebytebytebyte buf=buf=buf=buf=new
32、newnewnew bytebytebytebyte1024;1024;1024;1024;DatagramSocket datagramSocket=DatagramSocket datagramSocket=DatagramSocket datagramSocket=DatagramSocket datagramSocket=newnewnewnew DatagramSocket();DatagramSocket();DatagramSocket();DatagramSocket();D D D DatagramPacket inputPackage=atagramPacket input
33、Package=atagramPacket inputPackage=atagramPacket inputPackage=newnewnewnew DatagramPacket(buf,buf.DatagramPacket(buf,buf.DatagramPacket(buf,buf.DatagramPacket(buf,buf.lengthlengthlengthlength););););datagramSocket.receive(inputPackage);datagramSocket.receive(inputPackage);datagramSocket.receive(inpu
34、tPackage);datagramSocket.receive(inputPackage);datagramSocket.close();datagramSocket.close();datagramSocket.close();datagramSocket.close();第第3 3 3 3节节 建立建立UDPUDPUDPUDP通信通信 SendUDP.javaSendUDP.javaSendUDP.javaSendUDP.java:发送数据报,调试时在命令行指定目标主机:发送数据报,调试时在命令行指定目标主机的地址和端口,然后从键盘键入字符串,以的地址和端口,然后从键盘键入字符串,以#作
35、为结束符。作为结束符。ReceiveUDP.javaReceiveUDP.javaReceiveUDP.javaReceiveUDP.java:接收数据报的过程,调试时需在命令行:接收数据报的过程,调试时需在命令行指定监听的端口。指定监听的端口。可在同一台计算机上调试程序,分别在命令行输入:可在同一台计算机上调试程序,分别在命令行输入:java ReceiveUDP 1028java ReceiveUDP 1028java ReceiveUDP 1028java ReceiveUDP 1028 java SendUDP localhost 1028 java SendUDP localhost
36、 1028 java SendUDP localhost 1028 java SendUDP localhost 1028 端口号可指定为其他数值,只要发送和接收相同就可以了。如端口号可指定为其他数值,只要发送和接收相同就可以了。如果在不同的机器上调试,发送时指定目标果在不同的机器上调试,发送时指定目标 IPIPIPIP地址代替地址代替localhostlocalhostlocalhostlocalhost。综合实例综合实例 程序的服务器端使用循环读取程序的服务器端使用循环读取DatagramSocketDatagramSocketDatagramSocketDatagramSocket中的数中的数据报,可以接受无限个客户端发送过来的数据。每当读到据报,可以接受无限个客户端发送过来的数据。每当读到内容之后便向该数据报的发送者送回一条信息。内容之后便向该数据报的发送者送回一条信息。UdpClient.javaUdpClient.javaUdpClient.javaUdpClient.java UdpServer.javaUdpServer.javaUdpServer.javaUdpServer.java综合实例综合实例