210 likes | 411 Views
第 3 讲 Socket 编程概述. 教学目标 : 了解网络通信的基本原理与应用开发 掌握 Socket 类与 ServerSocket 类的应用 教学重点、难点: 1. 教学重点: 网络通信原理 客户机 / 服务器( C/S )模式的原理 URL 与 URLConnection 的区别 Socket 类与 ServerSocket 类的应用 2. 教学难点: Socket 类与 ServerSocket 类的应用. 3.1 网络通信的原理.
E N D
教学目标: • 了解网络通信的基本原理与应用开发 • 掌握Socket类与ServerSocket类的应用 • 教学重点、难点: • 1. 教学重点: • 网络通信原理 • 客户机/服务器(C/S)模式的原理 • URL与URLConnection的区别 • Socket类与ServerSocket类的应用 • 2.教学难点: • Socket类与ServerSocket类的应用
3.1 网络通信的原理 • 计算机之间的通信是要遵循一定规则的,通信协议就是计算机之间进行通信所要遵循的各种规则的集合。网络中的不同计算机之间要实现准确、迅速地传递信息,可以通过TCP/IP协议建立网络上的两台计算机(程序)之间的可靠连接,并进行双向通信。
(1)常见的几种通信协议 • IP协议 • 在Internet网络通信中主要使用的协议有使用于网络层的IP协议(IP协议使用IP地址使数据投递到正确的计算机上); • T CP、UDP协议 • 适用于传输层的T CP、UDP(TCP和UDP协议使用端口号PORT将数据投递到正确的应用程序)协议;
HTTP、FTP、SMTP、NNTP协议 • 适用于应用层的HTTP、FTP、SMTP、NNTP(主要用于解释数据内容)协议等。 • 例如Java语言中的套接字(Socket)编程就是网络通信协议的一种应用,Java语言将TCP/IP协议封装到Java.net包的Socket和ServerSocket类中。
(2) IP地址 • 网络中的每台计算机都必须有一个唯一的IP地址作为标识,这个数通常写作一组由“.”号分隔的十进制数,例如,思维论坛的服务器地址为218.5.77.187。正如所见IP地址均由4个部分组成,每个部分的范围都是0~255,以表示8位地址。 • (3) 端口号 • 端口号则是一个数字,其值一般在165535之间,其中11023一般保留用在知名的端口号或特定的UNIX服务,临时使用的端口号可取102465535之间的整数。端口号可以区分一台服务器上同时运行的不同种的服务程序。
常见的一些internet 服务对应的端口号 • 如下所示: (备注: NNTP---网络新闻传输协议)
(4) InetAddress类 • 在java.net包中,IP地址由一个称为InetAddress的特殊的类来描述。这个类提供了3个用来获得一个InetAddress类的实例的静态方法。 • getLocalHost() // 返回一个本地主机的IP地址 • getByName(String host) //返回对应于指定主机的IP地址 • getAllByName(String host) //对于某个主机有多个IP地址可用于得到一个IP地址数组。
例: 获取本机的IP地址。 • import java.net.*; • public class getLocalHostTest • { public static void main(String[] args) • { InetAddress myIP=null; • try { myIP=InetAddress.getLocalHost(); • // myIP=InetAddress.getByName(“www.pku.edu.cn”); • // 根据域名自动到DNS上查找IP地址 • } • catch{UnknowHostException e){} • System.out.println(myIP); • } • } • 注意:创建InetAddress类不用构造函数(不用new运算符),而是 • 通过InetAddress类直接调用其静态方法来获取IP地址。
3.2 URL类 • (1) URL(Uniform Resource Locator统一资源定位器),是三大网络功能中最高级的一种, 通过URL Java程序可以直接读入网络上的数据。 • URL的结构分为传输协议名和资源名称两部分,中间用“://”分隔开。在Internet上表示URL的典型传输协议有http、ftp、gopher和news等几种形式,例如:“http://www.263.net”和“ftp://www.bnu.edu.cn/pub”使用的分别是超文本传输协议和文件传输协议。
(2) URL类对象的创建 • URL(String str):使用完整的URL字符串直接创建一个URL对象。 • 例子:URL myurl=new URL(“http://www.edu.cn”); • URL(String protocal,String host,String file): 用分散的协议名、 主机名和文件名凑合成一个URL对象。 • 例子:URL myurl=new URL(“http”,“www.edu.cn”,“index.html”); • URL(String protocal,String host,String port,String file):用分 • 散的协议名、端口号、主机名和文件名组成一个URL对象。 • 例子:URL myurl=new URL(“http”,“www.edu.cn”,“80”,“index.html”);
URL(URL context,String spec):用给出的URL和基于该URL的一个相对路径构成一个URL对象。 • 常用于Applet小程序中。例如: • URL base_url=new URL(“http://www.bnu.edu.cn:8080/”) • URL url=new URL(base_url,”/java/java.html”); • 代表http://www.bnu.edu.cn:8080/java/java.html • 备注:若创建URL对象时有错误,则构造方法会输出MalformedURLException异常
(3) 通过URL读取WWW服务器上的数据 • /* 将URL位置的数据转成一个数据流,URL对象通过调用openStream()方法直接获取指定URL的输入流,从而读取文件中的原始数据。*/ • try{ URL url=new URL (“http://www.pku.edu.cn/index.html”); • DataInputStream data=new DataInputStream(url.openStream()); • while((line=data.readLine())!=null){ • textarea.append(line); } • data.close();} • catch(MalformedURLException me){} • catch(IOException ie){ • System.out.println("Error IO"); • }
(4) URL连接(URLConection) • 使用URL类可以很简便的获得信息,但是如果还需要向远程的计算机节点传送信息,就需要使用URLConnection类,URL类对象通过调用openConnection(),建立一个到达该URL的连接。其基本步骤如下: 建立连接 • URL url=new URL(“http://www.yahoo.com/”); • URLConnection con=url.openConnection(); 向服务器端发送数据 • PrintStream outStream=new PrintStream(con.getOutputStream()); • outStream.println(string_data);
从服务器读数据 • DataInputStream inStream=new • DataInputStream(con.getInputStream()); • inStream.readLine(); • 注意:URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。此外,使用PrintStream()可以自动为您进行字元转换的动作,它会使用作业系统的预设编码来处理对应的字元转换动作。
3.3 套接字 • (1) 什么是Socket? • 所谓Socket通常也称为”套接字”,由IP地址和端口号有两部分组成,应用程序通过“套接字”向网络发出请求或者应答网络请求。 • ServerSocket类和Socket类位于java.net包中ServerSocket类用于服务器建立监听套接字,Socket类用于客户机建立套接字对象进行通信。 • 例如,把套接字连接想象为一个电话呼叫,当呼叫完成后,谈话的任何一方都可以随时讲话。但是在最初建立呼叫时,必须有一方呼叫,而另一方则监听铃声。这样,呼叫的一方为“客户”,负责监听的一方是“服务器”。
(2) 客户机/服务器(C/S)模式的原理 • 客户机/服务器(C/S)模式是在网络应用程序中最常用的通信模式。 • 在C/S模式通信过程中主动发起通信的一方被称为客户机,而监听并接受请求进行通信的一方成为服务器。服务器使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,所以一般使用大于1024的端口),等待客户端连接请求,客户端连接后,会话产生,在完成会话后,关闭连接。
(3) 利用Socket方式进行数据通信与传输,大致有如下步骤: • 创建服务器端ServerSocket,设置建立连接的端口号。 • 创建客户端Socket对象,设置绑定的主机名或IP地址,指定连接端口号。 • ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求 • 客户机Socket发起连接请求。 • 建立连接 • 取得InputStream和OutputStream。 • 利用InputStream和OutputStream进行数据传输。 • 关闭Socket和ServerSocket。
定义数据成员 定义数据成员 1111 创建Socket实例 创建服务器(端口号) waiting for user 127.0.0.1 1111 服务器等待 网络连接 建立socket流 读socket流 (接收并显示) 建立socket流 connetcting client... login: 向用户发出一个字符串 送用户名给 服务器 java 读客户 端信息 User :java 读socket流 Login successful 提示用户登录成功 关闭流
(4) Socket类的示例: 程序的功能是客户机先向服务器发送一个字符串“你好!我是客户端,向你请求连接”,服务器发现客户机发的请求连接信息,则回应“你好!我是服务器,连接成功” 。 客户输入三角形三边的长度并发送给服务器,服务器把计算出的三角形面积返回给客户。 思路分析: 套接字连接中涉及到输入流和输出流操作,为了不影响我们做其他的事情,应把套接字连接放在一个单独的线程中去进行.另外,服务器端收到一个客户的套接字后,就应该启动一个专门为客户服务的线程.可以把计算量大的工作放在服务器端,客户负责计算量小的工作,实现客户/服务器交互计算,来完成此项任务.
教学总结: • 1. 实现网络功能靠URL类, URLConection类, Socket类和DatagramSocket类。 • 2. Socket适用于面向连接的,可靠性要求高的应用,Datagram • (数据报)适用于效率要求高的应用,但无法保证可靠性。 • 3. 网络上的数据传送是将网络连接转换成输入输出流,DataInputStream和DataOutputStream (PrintStream)是网间流 • 的载体.