JAVASE之面向网络编程

来源:互联网 发布:怎么改淘宝会员名手机 编辑:程序博客网 时间:2024/05/28 23:08

网络协议:

网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet protoal传输控制协议/英特网互联协议),他是一个包括TCP协议和IP协议,UDP(User Datagrammar Protocol)协议和其他一些协议的协议组.

以保证数据在传输过程中数据格式完全一致.TCP/IP协议的层次结构比较简单,共分为四层.应用层(HTTP,FTP,DNS),传输层(TCP,UDP),网络层(IP,ICMP,IGMP),链路层(驱动程序,接口).

TCP/IP协议中的四层分别是应用层,传输层,网络层和链路层,每层分别负责不同的通信功功能.

链路层: 链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如:针对光钎,网线提供的驱动.

网络层:网络层是整个TCP/IP协议的核心.他主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络

传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议.

应用层:主要负责应用程序的协议.例如:HTTP协议,FTP协议等.

 

IP地址和端口号:

在网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机,这种在TCP/IP协议中的标识号就是IP地址,可以唯一标识一台计算机,目前,IP地址广泛使用的版本是IPv4,是由4个字节大小的二进制数来表示,如:00001010000000000000000000000001由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号”.”分开,”192.168.1.110”

随着计算机网络规模的不断扩大,IP地址的需求也越来越多,IPv4这种用4个字节表示的IP地址面临枯竭,因此IPV6便应运而生,IPV6使用16个字节表示IP地址,他所拥有的地址容量约是IPV48×1028倍,达到2128个(算上全零的),这样就解决了网络地址资源数量不够的问题.

通过IP地址可以连接到指定计算机,但如果向访问目标计算机中的某个应用程序,还需要指定端口号.在计算机中,不同的应用程序是通过端口号区分的.端口号是用两个字节(16位的二进制数)表示的,他的取值范围是0-65535,其中,0-1023之间的端口号用于一些知名的网络服务和应用.用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用.

位于网络中一台计算机可以通过IP地址去访问另一台计算机,并通过端口号访问目标计算机中的某个应用程序.

 

InetAddress:

InetAddress类用于封装一个IP地址,并提供了一系列与IP地址相关的方法

 

Static InetAddress getByName(String host)在给定主机名的情况下确定主机的ip地址.

Static InetAddress getLocalHost()返回本地主机.

String getHostName()获取此IP地址的主机名.

String getHostAddress()返回IP地址字符串(以文本表现形式)

 

UDP协议:

UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据.

由于使用UDP协议消耗资源小,通信效率高.所以通常都会用于音频.视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响.

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性.因此在传输重要数据时不建议使用UDP协议,

 

DatagramPacket

UDP是一种面向无连接的协议.因此在通信时发送端和接收端不用建立连接.UDP通信的过程就像是货运公司在两个码头间发送货物一样.在码头发送和接收货物时都需要使用集装箱来装卸货物,UDP通信也是这样.发送和接收的数据也需要使用”集装箱”进行打包,此时使用jdkDatagramPacket,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据.

要想创建一个DatagramPacket对象,在创建发送端和接收端的DatagramPacket对象时,使用的构造方法不同,接收端的构造方法只接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号.

构造:

DatagramPacket(byte[] buf,int length)构造DatagramPacket,用来接收长度为length的数据包.

使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号.很明显,这样的对象只能用于接收接收端,不不能用于发送端.因为发送端一定要明确指出数据的目的地(ip地址和端口号),而接收端不需要明确知道数据的来源,只需要接收到数据即可.

DatagraPacket(byte[] buf ,int length ,InetAddress address,int port)构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号.

使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标ip地址(addr)和端口号(port).该对象通常用于发送端.因为在发送数据时必须指定接收端的ip地址和端口号,就好像发送货物的集装箱上面必须表名接受人的地址一样.

 

InetAddress getAddress()返回某台机器的IP地址,此数据报将要发往该及其或者是从该机器接收到的

Int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的.

Byte[] getData()返回数据缓冲区

Int getLength()返回将要发送或者接收到的数据的长度.

 

 

DatagramSocket:

DatagramPacket数据包的作用就如同是”集装箱”,可以将发送端或者接收端的数据封装起来.然而运输货物只用”集装箱”是不够的,还需要有码头.在程序中需要实现通信只有DatagramPacket数据包也同样不行.so DatagramaSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramaSocket数据包,

 

在创建发送端和接收端的DatagramaSocket对象时,使用的构造方法也有所不同,

构造:

DatagramaSocket();构造数据报套接字并将其绑定到本地主机上任何可用的端口.

该构造方法用于创建发送端的DatagramaSockett对象,在创建DatagramaSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其他网络程序所使用的端口号.

DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口.

该构造方法既可以用于创建接收端的DatagramaSocket对象,又可以创建发送端的DatagramaSocket对象,在创建接收端的DatagramSocket对象时,必须要指定还一个端口号,这样就可以监听指定的端口.

 

常用方法;

Void receive(DatagramPacket p) 从此套机字接收数据报包

Void send(DatagramaPacket p) 从此套接字发送数据报包.

 

 

TCP协议:

TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象.

区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意的发送数据.

TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接.

JDK中提供了两个类用于实现TCP程序,一个是ServerSocket,用于表示服务器端,一个是socket,用于表示客户端.

通信时,首先创建代表服务器端的serverSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信.

 

 

ServerSocket

在开发TCP程序时,首先需要创建服务器端程序.JDKjava.net包中提供了一个ServerSocket,该类的实例对象可以实现一个服务器端的程序.ServerSocket类提供了多种构造方法.

serverSocket(int port)创建绑定到特定端口的服务器套接字

使用该构造方法在创建serverSocket对象时,就可以将其绑定到一个指定的端口上(参数port就是端口号)

serverSocket常用方法:

Socket accept() 侦听并接受到此套接字的连接

InetAddress getInetAddress();返回此服务器套接字的本地地址.

ServerSocket对象负责监听某台计算机的某个端口号,在创建serverSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求.当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Socket对象用于和客户端实现通信,程序才能继续向下执行.

 

 

Socket

serverSocket对象可以实现服务器端程序看,但只实现服务器端程序还不能完成通信,此时还需要一个客户端程序与之交互,为此jdk提供了一个socket,用于实现TCP客户端程序.

 

Socket构造:

Socket(Srting  host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号.

使用该构造方法在创建socket对象时,会根据参数去连接在指定地址和端口上运行的服务器程序,其中参数host接收的是一个字符串类型的IP地址.

Socket(InetAddress address,int port) 创建一个流套接字并将其连接到指定IP地址的指定端口号.

参数address用于接收一个InetAddress类型的对象,该对象用于封装一个IP地址.

 

 

常用方法:

Int getPort() 该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号.

InetAddress getLocalAddress();该方法用于获取socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回.

Void close() 该方法用于关闭socket连接,结束本次通信.在关闭socket之前,应将与socket相关的所有的 输入/输出流全部关闭,这时因为一个良好的程序应该在执行完毕时释放所有的资源.

InputStream getInputStream()该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据

OutputStream getOutputStream()该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据.

 

socket类的常用方法中,getInputStream()getOutputStream()方法分别用于获取输入流和输出流,当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信.


通过一张图来描述服务器端和客户端的数据传输,如下图所示。