1、1,2,网络编程,1 网络基础 2 创建和使用URL访问网上资源 3 使用TCP/IP的套接字进行通信 4 使用无连接的数据报(UDP)进行通信,3,1 网络基础,互联网上的计算机之间的通讯是通过TCP(Transport Control Protocol)或UDP(User Datagram Protocol)协议。如下图所示:,网络编程,4,1 网络基础,(1)TCP协议:定义: TCP是一个基于连接的协议,它能够提供两台计算机之间的可靠的数据流 . HTTP、FTP、Telnet等应用都需要这种可靠的通信通道 (2)UDP协议定义:UDP是从一台计算机向另一台计算机发送称为数据报的独立数
2、据包的协议,该协议并不保证数据报是否能正确地到达目的地。它是一个非面向连接的协议。,网络编程,5,1 网络基础,(3)端口(PORT) 在互联网上传输的数据都包含有用来识别目的地的IP地址和端口号。IP地址用来标识网络上的计算机,而端口号用来指明该计算机上的应用程序。,网络编程,6,1 网络基础,(3)端口(PORT)端口号范围为0-65536, 其中低于1024的端口号保留给那些已定义的服务,用户不能使用。如FTP为21,TELNET 为23,HTTP为80。(4)JDK中的网络类通过包中的类,java程序能够使用TCP或UDP协议在互联网上进行通讯。,网络编程,7,2 创建和使用URL访问
3、网上资源,(1). 什么是URL (2). 创建URL (3). 获得URL对象的各个属性 (4). 使用URL来获得网络资源 (5). 连接一个URL (6). 使用URLConnection读写网络资源,网络编程,2 创建和使用URL访问网上资源,(1). 什么是URL URL(Uniform Resource Locator)是对互联网上的资源的引用 一个URL 包括两个主要部分: 协议标识符:HTTP,FTP,Gopher,File和News 资源名字:主机名,文件名,端口号,引用 例如: http:/:80/docs/books/tutorial/index.html#DOWN,网络
4、编程,2 创建和使用URL访问网上资源,(2). 创建URL 可以创建表示URL地址的URL对象。 URL对象表示一个绝对URL地址 例如:http:/ new URL(“http:/ 创建和使用URL访问网上资源,(2). 创建URLURL对象也可用相对URL和部分URL构建。 例如:URL gamelan = new URL(“http:/ URL gamelanGames =new URL(gamelan, Gamelan.game.html“);new URL(“http“, ““, “/pages/index.html“); new URL(“http“, ““, 80, “page
5、s/work.html“);,网络编程,2 创建和使用URL访问网上资源,(2). 创建URLURL类有如下的构造函数: public URL(String str); public URL(URL context, String str) 使用这种相对URL还可以创建到网页内部某个标记的URL对象: 例如: URL gamelanNetworkBottom = new URL(gamelanNetwork, “#BOTTOM“);,网络编程,2 创建和使用URL访问网上资源,(2). 创建URL有些URL含有特殊字符,比如空格: http:/ world/ 这时的URL就必须进行编码:将空格
6、用%20替代: URL url = new URL(“http:/ 创建和使用URL访问网上资源,(2). 创建URL当URL中的特殊字符很多时,或者特殊字符数目不确定时,需使用.URI 类去自动完成编码: 如:URI uri = new URI(“http“, ““, “/hello world/“, “); 将URI转换成URL:URL url = uri.toURL();,网络编程,14,2 创建和使用URL访问网上资源,2. 创建URL如果创建失败: try URL myURL = new URL(. . .) catch (MalformedURLException e) . . .
7、/ exception handler code here. . . ,网络编程,15,3. 获得URL对象的各个属性 String getFile():获取此URL的资源名。 String getHost():获取此URL的主机名。 String getPath():获取此URL的路径部分。 int getPort():获取此 URL 的端口号。 String getProtocol():获取此 URL 的协议名称。 String getQuery():获取此 URL 的查询字符串部分。 见例题:ParseURL.java,网络编程,16,2 创建和使用URL访问网上资源,4. 使用URL来
8、获得网络资源 URLConnection openConnection():返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。 InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStream。见例题:URLReader.java,网络编程,2 创建和使用URL访问网上资源,5. 连接到一个URL 类URLConnection的功能是java程序与服务器上的URL建立通信连接。 try URL yahoo = new URL(“http:/ yahooConnection = yahoo.openConn
9、ection(); catch (MalformedURLException e) / new URL() failed. . . catch (IOException e) / openConnection() failed. . . ,18,2 创建和使用URL访问网上资源,6. 使用URLConnection读写网络资源1)使用URLConnection读信息使用getInputStream()方法见例题:URLConnectionReader.java,网络编程,19,使用InetAddress,InetAddress:用于标识网络上的硬件资源提供了描述、获取及使用网络资源的一系列方法
10、。InetAddress类没有构造函数,不能用new来构造一个InetAddress实例。通过提供的静态方法来获取:public static InetAddress getByName(String host) host可以是一个机器名、IP地址或一个DNS域名。public static InetAddress getLocalHost() public static InetAddress getAllByName(String host)三个方法通常会产生UnknownHostException例外,应在程序中捕获处理。,20,InetAddress类的几个主要方法:public by
11、te getAddress():获得本对象的IP地址(存放在字节数组中)。public String getHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。public String getHostName():获得本对象的机器名,21,例:如何根据域名自动到DNS上查找IP地址: public class getIP public static void main(String args) InetAddress pku = null;try pku = InetAddress.getByName(“”);catch(UnknownHostException e)
12、 System.out.println(pku); 例:通过InetAddress,获取本机的IP地址: public class getLocalHostTest public static void main() InetAddress myIP = null;try myIP = InetAddress.getLocalHost();catch(UnknownHostException e)System.out.println(myIP); ,22,例:如何显示本机的域名和IP地址。 import .*; public class DomainName public static voi
13、d main(String args)try InetAddress address = InetAddress.getLocalHost();String domainName=address.getHostName();String IPName= address.getHostAddress();System.out.println(domainName);System.out.println(IPName);catch(UnknownHostException e) ,23,3 使用TCP/IP的套接字(Socket) 进行通信,什么是Socket? 使用Socket进行网络通信的过程
14、 使用ServerSocket和Socket 实现服务器端和客户端的 Socket通信 实现服务器支持多个客户,网络编程,24,3 使用TCP/IP的套接字(Socket) 进行通信,什么是Socket?Socket是连接运行在网络上的两个程序间的双向通讯的端点。,网络编程,25,3 使用TCP/IP的套接字(Socket) 进行通信,2. 使用Socket进行网络通信的过程服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。 客户程序根据服务器程序所在的主机名和端口号发出连接请求。,网络编程,26,3 使用TCP/IP的套接字(Socket) 进行通信,2.
15、使用Socket进行网络通信的过程如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。 客户和服务器通过读、写套接字进行通讯。,网络编程,27,在Java中,基于TCP协议实现网络通信的类有两个:客户端的Socket类 在客户端通过规定一个主机和端口号创建 socket实例,将其连接到服务器上。服务器端的ServerSocket类。在服务器端通过指定一个用来等待连接的端口号创建一个 ServerSocket实例。 ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。,28,类Socket的构造方法:public Socket(String h
16、ost, int port) public Socket(InetAddress address, int port) public Socket(String host, int port, InetAddress localAddr, int localPort)public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 这些方法都将抛出例外IOException,程序中需要捕获处理。,29,Socket的输入/输出流管理 public InputStream getInputStre
17、am() public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput()抛出例外IOException,程序中需要捕获处理。 关闭Socket public void close() throws IOException 设置/获取Socket数据 public InetAddress getInetAddress()、public int getPort(), public void setSoTimeout(int timeout), 抛出例外SocketExcep
18、tion,程序中需要捕获处理。,30,类ServerSocket的构造方法: public ServerSocket(int port) public ServerSocket(int port, int backlog):支持指定数目的连接 public ServerSocket(int port, int backlog, InetAddress bindAddr) 将抛出例外IOException,程序中需要捕获处理。 类ServerSocket的主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket 设置获取S
19、ocket数据 public InetAddress getInetAddress()、public int getLocalPort(), public void setSoTimeout(int timeout),将抛出例外SocketException,程序中需要捕获处理。,31,3 使用TCP/IP的套接字(Socket) 进行通信,3. 使用ServerSocket和Socket实现服务器端和客户端的 Socket通信 总结: 1) 建立Socket连接 2) 获得输入/输出流 3) 读/写数据 4) 关闭输入/输出流 5) 关闭Socket,网络编程,32,3 使用TCP/IP的套
20、接字(Socket) 进行通信,3. 使用ServerSocket和Socket实现服务器端和客户端的 Socket通信,网络编程,33,Five steps to create a simple server in JavaServerSocket objectRegisters an available port and a maximum number of clientsEach client connection handled with Socket objectServer blocks until client connectsSending and receiving dat
21、aOutputStream to send and InputStream to receive dataMethods getInputStream and getOutputstreamUse on Socket objectProcess phaseServer and Client communicate via streamsClose streams and connections,用流套接字建立一个简单服务器,34,Four steps to create a simple client in Java Create a Socket object for the client
22、Obtain Sockets InputStream and Outputstream Process information communicated Close streams and Socket,用流套接字建立一个简单客户,35,Client/server 聊天应用 使用前面介绍的套接字 第1步 在服务器端建立ServerSocket : try ServerSocket server=new ServerSocket(4444); catch(IOException e) Socket socket = null; try socket = server.accept(); /等待客
23、户端连接 catch(IOException e) 在客户端建立Socket: try Socket client = new Socket(host, 4444); catch(IOException e),以流套接字形式实现客户/服务器交互,36,第2步:在客户端和服务器端同时打开输入/输出流 为了便于读写数据,应在返回的输入输出流对象上建立过滤流,如:DataInputStram/DataOutputStram、BufferedInputStream/ BufferedOutputStream、PrintStream;InputStreamReader/ OutputStreamWrit
24、er、BufferedReader/ BufferedWriter、PrintWriter等。 BufferedReader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); BufferedWriter = new BufferedWriter( new InputStreamWriter( socket.getOutputStream() ) ); 第3步:关闭输入输出流和Socket 在客户端和服务器端分别关闭输入/输出流和Socket:先关闭所有相关的输入/输出流,再关闭Socket。,3
25、7,38,简单的Client/Server,在本地机器上测试网络程序用回绕地址Socket socket = new Socket(“127.0.0.1”, 4444); 建立socket连接后,还应该建立输入输出数据流。 要控制好输入输出流和Socket关闭的时间。 如果网络的一端已经关闭,另一端读到null。 在运行时,服务器端程序一般应先行启动。,39,3 使用TCP/IP的套接字(Socket) 进行通信,使用ServerSocket和Socket实现服务器端和客户端的 Socket通信见例题: SimpleEchoServer.java SimpleEchoClient.java E
26、choServer.java EchoClient.java,网络编程,40,3 使用TCP/IP的套接字(Socket) 进行通信,4. 实现服务器支持多客户机通信 服务器端的程序需要为每一个与客户机连接的socket建立一个线程,来解决同时通信的问题。,网络编程,41,支持多Client,解决方案一: 只要端口号不同,在一台计算机上一次可启动多个服务器程序。 myserver1 myclient1 myserver2 myclient2,42,解决方案二: 将服务器写成多线程 不同的处理线程为不同的客户服务。 主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 /主线程 wh
27、ile (true) accept a connection ;create a thread to deal with the client ; ,43,Client之间通过Server通信,在服务器端将与各客户进行通信的Socket和线程管理起来,从而各客户之间可以在服务器端的协助下进行通信。,44,见例题: MultiEchoServer1.java MultiServerThread.java EchoClient.java,45,4 使用无连接的数据报(UDP) 进行通信,1.什么是Datagram?数据报是网上传输的独立数据包 ,数据报是否能正确地到达目的地,到达的时间,顺序,内容
28、的正确性均没有保障。 java 中Datagram是DatagramPacket类的对象。 DatagramSocket类利用UDP协议来实现客户与服务器的Socket. send():发送数据报 receive(): 接收数据报,网络编程,46,数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接。数据报在网上可以以任何可能的路径传往目的地。 在Java中,基于UDP协议实现网络通信的类: 用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket 用于广播通信的类MulticastSocket
29、。,47,类DatagramPacket的构造方法用于接收数据public DatagramPacket(byte buf, int length)public DatagramPacket(byte buf, int offset, int length)用于发送数据public DatagramPacket(byte buf, int length, InetAddress address, int port)public DatagramPacket(byte buf, int offset, int length, InetAddress address, int port)获取数据获
30、取接收报中的信息public InetAddress getAddress() public byte getData() public int getLength() /public int getOffset()/public int getPort(),48,设置数据设置发送报中的信息setAddress(InetAddress iaddr)、setPort(int iport)、 setData(byte buf)、setData(byte buf, int offset, int length) 、setLength(int length)类DatagramSocket的构造方法 p
31、ublic DatagramSocket() public DatagramSocket(int port):在指定的端口通信 public DatagramSocket(int port, InetAddress laddr):在指定的地址通信 将抛出例外SocketException,程序中需要捕获处理。,49,最主要的方法:发送与接收数据报 public void receive(DatagramPacket p) public void send(DatagramPacket p) 将抛出例外IOException,程序中需要捕获处理。 其他方法public void connect(
32、InetAddress address, int port):与指定的机器通信public void disconnect():关闭与指定机器的连接public void close():关闭Socket 例:发送数据包byte data=“近来好吗?”.getByte();InetAddress address=InetAddress.getName(“www.jlu. “);DatagramPacket data_pack= new DatagramPacket(data,data.length, address,1980);DatagramSoket mail_out= new Data
33、gramSocket();mail_out.send(data_pack);,50,4 使用无连接的数据报(UDP) 进行通信,2.利用UDP进行通信的过程,网络编程,51,4 使用无连接的数据报(UDP) 进行通信,2.利用UDP进行通信的过程QuoteServer.java QuoteServerThread.java QuoteClient.java,网络编程,52,4 使用无连接的数据报(UDP) 进行通信,3. 广播方式发送数据 服务器一端以一定的间歇广播发送数据,客户端被动接收。 java 的MulticastSocket类可以实现广播发送。 见例题: MulticastServer.java MulticastServerThread.java MulticastClient.java,网络编程,