1、1,Java网络编程,2,Java与网络,Java语言取得成功的领域之一就是网络(其他语言)数页代码-(Java)一条语句 TCP/IP(传输控制协议/网间协议)是internet的主要协议,定义了计算机和外设进行通信所使用的规则(应用层,传输层,网络层,链路层). 大多数基于internet的应用程序被看作TCP/IP协议的上一层. 如 : ftp, http, smtp, pop3, telnet, nntp等 IP地址:TCP/IP网络中的每台计算机都有唯一的地址-IP地址. 在Java中,有一个用来存储internet地址的类叫InetAddress.,3,网络层次,4层网络结构:,4
2、,传输层的两个基本协议,1 TCP协议:确保以发送时的顺序接受,丢包重新传递,数据对于连接太快TCP会调整速度等2UDP协议: 允许接受方检测被破坏的包,不保证这些包正确的顺序传输。实时的音频或视频应用程序经常使用。如果UDP有纠错功能一般由应用层来实现,如TFTP等。UDP本身没有此功能,5,Java网络编程,Java的网络编程是建立在传输层之上的,我们可以创建自己的应用层协议。Java仅支持TCP和UDP。(ICMP不支持) Java已经给我们提供好了基于传输层协议的类(Stream Socket和 Datagram Socket) Java不能直接发IP数据包,6,TCP协议的实现,So
3、cket是实现TCP协议的基本工具,Socket对程序员掩盖了网络底层实现的细节。如:纠错,重传,网络地址等 Socket是网络上运行的程序之间双向通信链路的最后终结点 IP与端口的组合得出一个套接字,可以完全分辨internet上运行的程序,7,Socket概念,端口号:TCP/IP协议为每种服务定义了一个端口,当一台计算机上运行不同服务器程序时,根据端口号不同提供相应的服务. 端口号不是计算机上的物理连接器,它只是具有软件意义的假想端口,8,Socket的功能,1连接远程机器 2发送数据 3接受数据 4关闭连接 5绑定端口 6监听入站数据 7在所绑定得端口上接受来自远程的连接,9,Sock
4、et类,Socket类用代码通过主机操作系统的本地TCP栈进行通信。 Socket为用户提供的接口是流。,10,Socket类,11,Socket类(续),程序员只需把传输内容转化为流,12,客户端Socket,构造函数: public Socket(String host,int port) throws unknownHostException,IOException Socket socket=new Socket(“time.nist.gov ”,80); 含义: 1 创建一个socket对象 2尝试连接主机 主机名不存在或服务器没运行unknownHostException 其他原因
5、抛: IOException,13,客户端Socket(续),14,时间协议的使用,使用Socket完成一些应用层的协议。,15,时间协议的使用,16,客户端Socket(续),Socket使用之后要注意关掉.一般来说socket确实会在两个流的一个关闭后或在被垃圾回收时自动关闭。但是对于敏感的程序,在垃圾回收介入之前,系统会很快到达能打开的socket上限。尤其是跟很多硬件设备打交道的软件系统。,17,客户端Socket(续),18,半关闭Socket,close()方法同时关闭Socket的输入和输出 但JDK提供了shutdownInput()和shutdownOutput的方法,19,
6、Socket异常,BindException没有权限使用Socket,想使用的端口被别的应用占用 ConnectException主机忙或没有监听该端口的进程 NoRouteHostException表示连接超时 ProtocolException表示网络接受的数据违反TCP/IP规范,20,ServerSocket,服务器Socket等待连接而客户端Socket发起连接。一旦ServerSocket建立起来连接,服务器就是用一个正常的Socket对客户端发送数据。,21,ServerSocket基本流程,22,ServerSocket的构造函数,构造函数: public ServerSock
7、et(int port)throws BindException,IOException ServerSocket socket=new ServerSocket (80); 含义: 创建一个server socket对象,服务的端口是80,如果port设为0或者null Java会随机选一个未占用的port 如果端口已经被其他应用程序占用抛出BindException,23,ServerSocket的构造函数(续),public ServerSocket(int port,int queueLength)throws BindException,IOException Queue表示入站连接
8、请求队列的长度,这个长度必须小于操作系统所允许的最大长度 public ServerSocket()throws IOException 没有端口创建是没有意义的,因为客户端不知道如何连接过去 ServerSocket ss=new ServerSocket(); SocketAddress http=new InetSocketAddress(80); ss.bind(http);,24,ServerSocket的监听方法,accept()监听客户端的连接。在未连接的时候accept()是阻塞的,他会停止执行流并等待,25,简单的日期时间服务器,26,UDP的实现,UDP的实现类Datagr
9、amPacket和DatagramSocket. DatagramPacket的作用:将应用层的数据字节准变为UDP的传输单位datagram,27,UDP的实现(续),DatagramSocket与TCP的Socket不同, UDP没有连接的概念,没有TCP那样的服务器Socket和客户端Socket的概念。DatagramSocket既可以发又可以收,可以面对多个DatagramSocket进行收发,不像TCP协议中的1 on 1的关系,服务器没有必要创建Socket与客户端Socket通讯。,28,TCP通讯与UDP通讯对比,29,TCP通讯与UDP通讯对比,30,DatagramPac
10、ket类,DaragramPacket转化成的Datagram已经与IP层的数据包非常接近,包含了目标地址 而TCP的数据片需要Socket告诉其目标地址,然后组成IP数据包。,31,DatagramPacket类,接受和发送数据包的构造函数是不同的: 1 接受数据包:public DatagramPacket(byte buffer,int length)两个参数1 byte buffer表示接受数据包的数组,length表示这个数组的长度。 2发送数据包:public DatagramPacket(byte data,int length,InetAddress destination,i
11、nt port) 除了包括接受的参数外还包括目标地址和端口,32,DatagramPacket类(续),创建一个DatagramPacket:,33,DatagramSocket类,与DatagramPacket类似发送与接受Socket只是构造函数不相同 发送Socket对象 DatagramSocket client=new DatagramSocket() 由于发送无需关心发送端口所以操作系统会自动分配一个端口发送时服务器的端口已经写在了DatagramPacket中了 接受Socket对象 DatagramSocket server=new DatagramSocket(port) 由
12、于需要监听客户端Socket所以必须指定port,34,DatagramSocket类(续),35,DatagramSocket类(续),36,DatagramSocket类(续),DatagramSocket的对象用完之后也是要关闭,如果等到垃圾回收关闭,有可能会造占满所有允许的Socket数。 TCP的Socket和UDP的Socket可以共用一个端口两种协议是毫不相干的且端口也只是个逻辑概念,37,组播Socket,与传统传播的区别:,38,组播的使用,采用MulticastSocket用法相近,但多了4个动作: 1加入组播组 2向组播组发送数据 3接受组播组的数据 4离开组播组,39,
13、组播接受实例:,40,有用的工具类InetAddress类,Java对于IP地址的高级表示。它包含了主机名和IP地址,我们知道了其中一个信息可以得到另一个信息。 3个构造函数: 1 public static InetAddress getByName(String hostName) throws UnknownHostException 2 public static InetAddress getAllByName(String hostName) throws UnknownHostException,41,InetAddress类(续),public static InetAddress getLocalhost(String hostName) throws UnknownHostException通过DNS得到IP地址和hostname的转换,42,InetAddress类应用,