1第十三章Java网络编程基础2主要内容1、协议2、端口号3、Socket基本概念4、TCPSocket程序设计5、UDPSocket程序设计6、URL程序设计31、协议•1.1.IP协议•1.2.TCP协议•1.3.UDP协议4协议的基本概念•协议:通过internet传输,交换数据,必须有一套共同遵循的规则,这些规则,就是协议,定义了关于数据格式,语义,流控制,错误检验等相关内容。•应用软件可以运用一些支持共同协议的网络软件,来达到通过网络共享数据,传输数据的目的。51.1IP协议•IP协议用于管理客户端和服务器端之间的报文传送。IP协议是所有Internet协议的基石,IP协议提供了无连接的、不可靠的、IP数据报的传输服务,IP协议已经成为世界上最重要的网络协议。61.2.TCP协议传输控制协议(TCP)提供了可靠的报文流传输和对上层应用的连接服务,TCP使用顺序的应答,能够按需重传报文。TCP在两个或多个主机之间建立面向链接的通信。TCP支持多数据流操作,提供数据流控制和错误控制,甚至完成对乱序到达报文的重新排序。71.3.UDP协议用户数据报协议(UDP)是IP协议的另一个主机到主机层协议。UDP提供了一种基本的、低延时的称为数据报的传输。UDP的简单性使UDP不适合于一些应用,但对另一些更复杂的、自身提供面向链接功能的应用却很适合。其它可能使用UDP的情况包括:转发路由表数据交换、系统信息、网络监控数据等的交换。这些类型的交换不需要流控、应答、重排序或任何TCP提供的功能82、端口在网络技术中,端口(Port)大致有两种:•(1)物理意义上的端口。比如,ADSLModem、集线器、交换机、路由器用于连接其它网络设备的接口,如RJ-45端口、SC端口等等。•(2)逻辑意义上的端口。一般是指TCP/IP协议中的端口,端口号的范围从0到65535。比如,用于浏览网页服务的80端口,用于FTP服务的21端口等等。93、套接字Java网络编程在很大程度上就是套接字(Socket)编程。套接字是让用户与网络通信的一种对象,它并不是物理设备,可以将其理解为网络连接的端点。10•Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和端口号。•此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送出去。•计算机从网络上收到与该Socket绑定的IP和端口号相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。•网络应用程序就是这样通过Socket进行数据的发送与接收的。如下图11应用程序驱动程序Socket2314调用bind将Socket的信息通知给驱动程序产生Socket应用程序将要发送的数据传给Socket驱动程序从Socket取出数据并通过网卡发送出去124、TCP程序设计(Socket)•客户端-服务器模型是最常见的网络应用程序模型。当我们上网冲浪时,我们所使用的浏览器(例如IE)就是一个客户端软件,而提供网页的站点必需运行一个WEB服务器。其他telnet和ftp应用都存在客户端和服务器。一般而言,主动发起通信的应用程序属于客户端。而服务器则是等待通信请求,当服务器收到客户端的请求,执行需要的运算然后向客户端返回结果。13•在设计客户端-服务器软件时,程序员必须在两种交互模型中做出选择:面向连接的风格和无连接的风格。–面向连接的程序选择TCP/IP协议族中的TCP协议;–无连接的程序选择UDP协议。面向连接和无连接的区别需要足够的考虑,通常依赖于应用要实现的可靠性和支撑网络所能提供的可靠性。•我们来了解使用Java开发面向连接的使用TCP协议的网络应用程序,分客户端和服务器两个部分分别讲解。14Socket通信在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。–在服务器端通过指定一个用来等待的连接的端口号创建一个ServerSocket实例。–在客户端通过规定一个主机和端口号创建一个socket实例,连到服务器上。–ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求15•类Socket•构造方法:–publicSocket(Stringhost,intport)–publicSocket(InetAddressaddress,intport)–publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)–publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,–intlocalPort)•在JDK1.1以前,Socket类可同时用于TCP/UDP通信:–publicSocket(Stringhost,intport,booleanstream)–publicSocket(InetAddresshost,intport,booleanstream)•这些方法都将抛出例外IOException,程序中需要捕获处理。16•类Socket•Socket的输入/输出流管理–publicInputStreamgetInputStream()–publicvoidshutdownInput()–publicOutputStreamgetOutputStream()–publicvoidshutdownOutput()•这些方法都将抛出例外IOException,程序中需要捕获处理。•关闭Socket–publicvoidclose()throwsIOException•设置/获取Socket数据–publicInetAddressgetInetAddress()、publicintgetPort(),…–publicvoidsetSoTimeout(inttimeout),…•这些方法都将抛出例外SocketException,程序中需要捕获处理。17•类ServerSocket•构造方法:–publicServerSocket(intport)–publicServerSocket(intport,intbacklog):支持指定数目的连接–publicServerSocket(intport,intbacklog,InetAddressbindAddr)•这些方法都将抛出例外IOException,程序中需要捕获处理。•主要方法–publicSocketaccept():等待客户端的连接–publicvoidclose():关闭Socket•设置/获取Socket数据–publicInetAddressgetInetAddress()、publicintgetLocalPort(),…–publicvoidsetSoTimeout(inttimeout),…•这些方法都将抛出例外SocketException,程序中需要捕获处理。18•无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤:–1、在客户方和服务器方创建Socket/ServerSocket。–2、打开连接到Socket的输入/输出流。–3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。–4、关闭输入/输出流和Socket。•通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的19ServerServerSocket(port#)Socketsocket=ServerSocket.accept()接收连接OutputStreamInputStreamCloseSocketClientSocket(host,port#)与服务器建立连接OutputStreamInputStreamCloseSocketsocket20•1、建立Socket–在客户端:•try{•Socketclient=newSocket(host,4444);•}catch(IOExceptione){}–在服务器端:•try{•ServerSocketserver=newServerSocket(4444);•}catch(IOExceptione){}•Socketsocket=null;•try{•socket=server.accept();//等待客户端连接•}catch(IOExceptione){}212、在客户端和服务器端同时打开输入/输出流类Socket提供了方法getInputStream()和getOutputStream()来得到Socket对应的输入/输出流以进行数据读写操作,它们分别返回InputStream对象和OutputStream对象。•为了便于读写数据,应在返回的输入/输出流对象上建立过滤流,如DataInputStram/DataOutputStram、BufferedInputStream/BufferedOutputStream、PrintStream;InputStreamReader/OutputStreamWriter、BufferedReader/BufferedWriter、PrintWriter等。22•BufferedReader=newBufferedReader(•newInputStreamReader(socket.getInputStream()));•BufferedWriter=newBufferedWriter(•newInputStreamWriter(socket.getOutputStream()));•3、关闭输入/输出流和Socket•在客户端和服务器端分别关闭输入/输出流和Socket:先关闭所有相关的输入/输出流,在关闭Socket。23创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流发送谈话信息接收用户谈话信息创建Socket实例定义数据成员建立socket流发送谈话信息接收服务器谈话信息关闭流accept()4444结束谈话(Bye.)结束谈话(Bye.)关闭流服务器端客户端24看看这个谈话程序的运行效果:1、服务器端SingleTalkServer.java2、客户端SingleTalkClient.java25简单的Client/Server•在本地机器上测试网络程序用回绕地址Socketsocket=newSocket(“127.0.0.1”,4444);•建立socket连接后,还应该建立输入输出数据流。•要控制好输入/输出流和Socket关闭的时间。•如果网络的一端已经关闭,另一端读到null。•在运行时,服务器端程序一般应先行启动。26支持多Client•解决方案一:在一台计算机上一次启动多个服务器程序,只要端口号不同。–myserver1--------myclient1–myserver2--------myclient2Server1(1111)client(2222)Server2(2222)client(1111)Server27•解决方案二:•将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。•//主线程•while(true)•{•acceptaconnection;•createathreadtodealwiththeclient;•}endwhileServerclient1client2serverthread2serverthread1……28•serverSocket=newServerSocket(4444);•while(listening)•{•Socketsocket;•socket=serverSocket.accept();//程序将在此等候客户端的连接•newMultiTalkServerThread(soc