第十讲 网络通信 1、网络基本概念 2、Java与Internet 3、使用InetAddress 4、使用URL 5、Socket通信

Slides:



Advertisements
Similar presentations
7.1 内置对象概述及分类 JSP 视频教学课程. JSP2.2 目录 1. 内置对象简介 1. 内置对象简介 2. 内置对象分类 2. 内置对象分类 3. 内置对象按功能区分 3. 内置对象按功能区分 4. 内置对象作用范围 4. 内置对象作用范围.
Advertisements

NAT与ICMP交互.
计算机网络课程总结 一、计算机网络基础 计算机网络定义和功能、基本组成 OSI/RM参考模型(各层的功能,相关概念, 模型中数据传输 等)
第十五章 网络编程.
网络程序设计 第二章 客户端Socket用法详解.
第9章 网络通信 1.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
目标 运用File类进行文件操作 理解流,标准输入/输出流的概念
实验4 基于Socket的C/S程序开发 实验目的
在PHP和MYSQL中实现完美的中文显示
Java语言程序设计 清华大学出版社 第9章 网络通信.
Hadoop I/O By ShiChaojie.
例外處理(Exception Handling)
第14章 Java网络编程 Java语言提供了强大的网络编程功能,能够处理各种网络资源以及进行网络通信。java.net包定义了Java语言网络编程的主要工具类。其中,包括代表网络IP地址的InetAddress类;与URL有关的URL类和URLConnection类;与网络通信有关的Socket类和ServerSocket类。本章包括以下知识点。
1、了解TCP和UPD的特点和区别 2、了解TCP的连接传输数据过程 3、能够用TCP建立数据连接和传输数据
第二讲 搭建Java Web开发环境 主讲人:孙娜
TCP/IP Protocol Suite TCP/IP協定 第二組 投影片製作by簡嘉宏 綦凱宏 林睿敏 滕孟哲.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计 c# programming 网络编程 C#程序设计课程组.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
第11章 Java网络编程 本章要点 11.1 网络基础 11.2 InetAddress编程 11.3 URL编程
西南科技大学网络教育系列课程 高级语程序设计(Java) 第十一章 Java 中的网络编程.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
大学计算机基础 典型案例之一 构建FPT服务器.
SQL Injection.
走进编程 程序的顺序结构(二).
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
考试题型 填空题(30) 选择题(20) 名词解释(10) 问答题(24) 计算题(16) 附加题(30) 成绩核算:
实用组网技术 第一章 网络基础知识.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
Windows网络操作系统管理 ——Windows Server 2008 R2.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
1、能够使用java进行数据库连接和SQL查询操作
Chapter 11:Java网络编程 授课教师:赵小敏 浙江工业大学 软件学院
4、按钮事件.
第十一章 Java的网络功能.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第 8 章 网络程序设计.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Web Server 王宏瑾.
5.3 简单的tcp通讯 信息工程系 向模军 Tel: QQ:
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
第四章 团队音乐会序幕: 团队协作平台的快速创建
DQMClientDim.cxx及双光子练习
实验七 安全FTP服务器实验 2019/4/28.
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
项目二:HTML语言基础.
2019/5/3 JAVA Socket(UDP).
JSP实用教程 清华大学出版社 第2章 JSP运行环境和开发环境 教学目标 教学重点 教学过程 2019年5月7日.
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
Internet课程设计 教师:陈 妍 朱海萍 西安交通大学计算机系
第十二章 Java网络编程 1.URL编程 2.Socket网络编程 3.Datagram网络编程.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
本章提要 ◆ 客户/服务器模型 ◆ Java编写客户应用程序 ◆ Java编写服务器应用程序
Presentation transcript:

第十讲 网络通信 1、网络基本概念 2、Java与Internet 3、使用InetAddress 4、使用URL 5、Socket通信 6、数据报通信

1、网络基本概念 物理层 TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)是Internet的主要协议,定义了计算机和外设进行通信所使用的规则。TCP/IP网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。 ISO/OSI网络参考模型则包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层。

1、网络基本概念 大多数基于Internet的应用程序被看作TCP/IP网络的最上层——应用层, 如:ftp,http,smtp,pop3,telnet,nntp等。 网络层对TCP/IP网络中的硬件资源进行标识。连接到TCP/IP网络中的每台计算机(或其他设备)都有唯一的地址,这就是IP地址。IP地址实质上是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,每个d是一个8位整数。 在TCP/IP网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。 TCP/IP网络中最常用的传输协议就是TCP(Transport Control Protocol)和UDP(User Datagram Protocol)。

1、网络基本概念 一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。 端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。 网络服务 http ftp 其他服务 23 telnet 端口 21 80 客户程序 Socket IP,port IP与端口号组合而得出的Socket,可以完全分辨Internet上运行的程序。

1、网络基本概念 端口号是用一个16位的整数来表达的,其范围为0~65535,其中0~1023为系统所保留,专门给那些通用的服务(well-known services),如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口为23,…因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。

1、网络基本概念 传输层通常以TCP和UDP协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的,Socket是由IP地址和端口号组成的。 传输控制协议(TCP)是在端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据印记了序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,数据在需要时可以重新发送,因此整个字节流到达接收端时完好无缺。这与两个人打电话的情形是相似的。 TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。

1、网络基本概念 与TCP协议不同,用户数据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。

1、网络基本概念

1、网络基本概念 TCP协议和UDP协议各有各的用处。当对所传输的数据具有时序性和可靠性等要求时,应使用TCP协议;当传输的数据比较简单、对时序等无要求时,UDP协议能发挥更好的作用,如ping、发送时间数据等。

2、Java与Internet ——Java中的网络通信 网络应用是Java语言取得成功的领域之一,它已经成为现在Internet上最流行的一种编程语言。Java语言在网络编程方面提供了许多方便,其他语言往往需要数页代码才能完成的事情,在Java中可能只需要一条语句就可以。 Java的网络通信分为三个层次: 最高一级的网络通信就是我们上一讲中所涉及到的从网络上下载Applet。客户端浏览器通过HTML文件中的<applet>标记来识别Applet,并解析Applet的属性,通过网络获取Applet得字节码文件。(由浏览器提供) 上一讲中所涉及到的声音播放和图象显示,其中声音文件和图象文件的获取是次一级的通信。通过类URL的对象指明文件所在位置,并从网络上下载声音和图象文件。(由Java开发环境提供) 最低一级的通信是利用java.net包中提供的类直接在程序中实现网络通信。(由Java语言开发包提供)

2、Java与Internet ——Java中的网络支持 针对网络通信的不同层次,Java提供的网络功能有四大类:InetAddress 、URLs、Sockets、Datagram。 InetAddress面向的是网络层(IP层),用于标识网络上的硬件资源。 URL面向的应用层,通过URL,Java程序可以直接送出或读入网络上的数据。 Sockets和Datagram面向的则是传输层。Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上。

2、Java与Internet ——Java中的网络支持 java.net包中的主要的类和可能产生的例外包括: 面向IP层的类:InetAddress (Inet4Address,Inet6Address) 面向应用层的类:URL、URLConnection 面向网络层的类: TCP协议相关类:Socket、ServerSocket UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket 可能产生的例外: BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException

3、使用InetAddress 类InetAddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。 InetAddress类没有构造函数,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取: public static InetAddress getByName(String host) :host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。 public static InetAddress getLocalHost() public static InetAddress[] getAllByName(String host) public static InetAddress getByAddress(String host, Byte[] addr) 这些方法通常会产生UnknownHostException例外,应在程序中捕获处理。 以下是InetAddress类的几个主要方法,通过上述方法获得InetAddress类的实例后就可以使用: public byte[] getAddress():获得本对象的IP地址(存放在字节数组中)。 public String getHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。 public String getHostName():获得本对象的机器名。

3、使用InetAddress 下面的例子演示Java如何根据域名自动到DNS(域名服务器)上查找IP地址(与DNS服务器的连接减至一行): public class getIP { public static void main(String args[]) InetAddress pku = null; try{ pku = InetAddress.getByName(“www.pku.edu.cn”); }catch(UnknownHostException e) {} System.out.println(pku); } getIP.java

3、使用InetAddress 通过InetAddress,可以获取本机的IP地址: getLocalHostTest.java public class getLocalHostTest { public static void main() InetAddress myIP = null; try{ myIP = InetAddress.getLocalHost(); }catch(UnknownHostException e){} System.out.println(myIP); } getLocalHostTest.java

4、使用URL URL是统一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图象文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。 通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。

4、使用URL 一个URL包括两部分内容:协议名称和资源名称,中间用冒号隔开: Protocol:resourceName 如:http://gis.pku.edu.cn 协议名称指的是获取资源时所使用的应用层协议,如http,ftp,file等;资源名称则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个应用。当然,并不是所有的URL都必须包含这些内容。 http://www.pku.edu.cn http://gis.pku.edu.cn/javaCourse/index.html ftp://gis.pku.edu.cn/javaCourse/Techdoc/ch1.ppt http://www.abc.com:8080/java/network.html#UDP

4、使用URL ——在Java中构造URL 在java.net包中,提供了类URL来表示URL。类URL提供了很多构造方法来生成一个URL对象: public URL(String spec) public URL(URL context, String spec) public URL(String protocol, String host, String file) public URL(String protocol, String host, int port, String file) 以下是一些具体的构造实例: URL url1 = new URL(“http://gis.pku.edu.cn/map/index.html”); URL base = new URL(“http://gis.pku.edu.cn”); URL url2 = new URL(base, “mywork1.html”); URL url3 = new URL(base, “mywork2.html”); URL url4 = new URL(“http”, “gis.pku.edu.cn”,“/~lyw/test.html”); URL url5 = new URL(“http”, “www.abc.com”, 8080, “/java/network.html”); 另外还有两种稍微复杂些的构造方法(参见JDK文档)。

4、使用URL ——在Java中构造URL 当创建URL时发生错误,系统会产生例外MalformedURLException,这是非运行时例外,必须在程序中捕获处理。 URL url1,url2,url3; try{ url1 = new URL(“file:/D:/image/example.gif”); url2 = new URL(“http://gis.pku.edu.cn/map/”); url3 = new URL(url2, “test.gif”); }catch(MalformedURLException e) { DisplayErrorMessage(); }

4、使用URL ——URL的基本方法 一个URL对象生成后,其属性是不能被改变的(与String对象相似),但可以通过它给定的方法来获取这些属性: public String getProtocol():获取该URL的协议名 public String getHost() :获取该URL的主机名 public String getPort() :获取该URL的端口号 public String getPath() :获取该URL的文件路径 public String getFile() :获取该URL的文件名 public String getRef() :获取该URL在文件中的相对位置 public String getQuery() :获取该URL的查询名 ParseURL.java

4、使用URL ——通过URL读取www信息 通过URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 public final InputStream openStream() 方法openStream()与指定的URL建立连接并返回一个InputStream对象,将URL位置的资源转成一个输入数据流。通过这个InputStream对象,就可以读取资源中的数据。 URL Java 程序 InputStream

4、使用URL ——通过URL读取www信息 URLReader.java import java.net.*; import java.io.*; public class URLReader { public static void main (String args[]) try{ URL gis = new URL("http://gis.pku.edu.cn/test.htm"); BufferedReader in = new BufferedReader( new InputStreamReader( gis.openStream() ) ); String line; while( (line = in.readLine()) != null ) System.out.println(line); } in.close(); }catch(Exception e){ System.out.println(e); URLReader.java

4、使用URL ——URL和InetAddress的联合使用 Applet中的网络通信需要将URL和InetAddress联合使用来得到相关的IP地址。 通过类Applet的getCodeBase()方法获得提供它的主机的URL实例 利用类URL的getHost()方法得到主机名 利用类InetAddress的getByName()得到该主机的IP地址 通过IP地址,就可以进行网络通信(TCP, UDP) URL url = getCodeBase(); String host = url.getHost(); Try{ InetAddress address = InetAddress.getByName(host); }catch(Exception e){} DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(buf, length, address, port); socket.send(packet); AppletURLReader.java

4、使用URL ——URL连接 通过URL类提供的方法openConnection(),就可以获得一个URL连接(URLConnection)对象。 public URLConnection openConnection() 通过URL的方法openStream(),只能从网络上读取资源中的数据。通过URLConnection类,可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据。URLConnection类表示了应用程序和URL资源之间的通信连接。 try{ URL url = new URL(“http://gis.pku.edu.cn”); URLConnection uc = url.openConnection(); }catch(MalformedURLException e1){ … }catch(IOException e2){ }

4、使用URL ——URL连接 通过getInputStream() 方法,应用程序就可以读取资源中的数据。 事实上,类URL的方法openStream()就是通过URLConnection类来实现的,它等价于: openConnection().getInputStream(); URLConnection中最常用的两个方法是: public InputStream getInputStream() public OutputStream getOutputStream() public class URLConnectionReader { public static void main (String args[]) try{ URL gis = new URL("http://gis.pku.edu.cn/test.htm"); URLConnection uc = gis.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ); String line; while( (line = in.readLine()) != null ) System.out.println(line); } in.close(); }catch(Exception e){ System.out.println(e); URLConnectionReader.java

4、使用URL ——URL连接 通过URLConnection对象获取的输入流和输出流(不是所有的资源都可以获得有效的输出流),可以与现有的CGI程序进行交互。URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。 URL url = new URL("http://gis.pku.edu.cn/~lyw/cgi-bin/test.cgi"); URLConnection uc = url.openConnection(); uc.setDoOutput(true); PrintStream out = new PrintStream(uc.getOutputStream()); BufferedReader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ); 客户端 java程序 OutputStream InputStream CGI程序 STDIN STDOUT 服务器 connection getchar() putchar()

4、使用URL ——其他URL类 URLConnection类的其他方法以及其他URL相关的类(URLClassLoader,URLDecoder,URLEncoder,URLStreamHandler,HttpURLConnection,JarURLConnection,ContentHandler)的使用,大家在以后的实践中去学习。

5、Socket通信 在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。 ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。

5、Socket通信 ——类Socket 构造方法: 在JDK1.1以前,Socket类可同时用于TCP/UDP通信: public Socket(String host, int port) //远程服务器IP及响应端口 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) //在指定的机器上的指定端口上运行 在JDK1.1以前,Socket类可同时用于TCP/UDP通信: public Socket(String host, int port, boolean stream) public Socket(InetAddress host, int port, boolean stream) 这些方法都将抛出例外IOException,程序中需要捕获处理。

5、Socket通信 ——类Socket Socket的输入/输出流管理 这些方法都将抛出例外IOException,程序中需要捕获处理。 public InputStream getInputStream() 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),… 这些方法都将抛出例外SocketException,程序中需要捕获处理。

5、Socket通信 ——类ServerSocket 构造方法: 这些方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public ServerSocket(int port) public ServerSocket(int port, int backlog) //支持指定数目的连接 public ServerSocket(int port, int backlog, InetAddress bindAddr) //在指定的机器上运行 这些方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket 设置/获取Socket数据 public InetAddress getInetAddress()、public int getLocalPort(),… public void setSoTimeout(int timeout),… 这些方法都将抛出例外SocketException,程序中需要捕获处理。

5、Socket通信 无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤: 1、在客户方和服务器方创建Socket/ServerSocket实例。 2、打开连接到Socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。 4、关闭输入/输出流和Socket。 通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。

5、Socket通信 Server端程序 ServerSocket(port #) Socket socket = ServerSocket.accept() 接收连接 OutputStream InputStream Close Socket Client端程序 Socket(host, port #) 与服务器建立连接 socket

5、Socket通信 1、建立Socket 在客户端: 在服务器端: try{ Socket client = new Socket(host, 4444); }catch(IOException e){} 在服务器端: ServerSocket server = new ServerSocket(4444); Socket socket = null; socket = server.accept(); //等待客户端连接

5、Socket通信 2、在客户端和服务器端同时打开输入/输出流 类Socket提供了方法getInputStream()和getOutputStream()来得到Socket对应的输入/输出流以进行数据读写(传输)操作,它们分别返回InputStream对象和OutputStream对象。 为了便于读写数据,应在返回的输入/输出流对象上建立过滤流,如DataInputStram/DataOutputStram、BufferedInputStream/ BufferedOutputStream、PrintStream;InputStreamReader/ OutputStreamWriter、BufferedReader/ BufferedWriter、PrintWriter等。 BufferedReader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); BufferedWriter = new BufferedWriter( new InputStreamWriter( socket.getOutputStream() ) );

5、Socket通信 3、关闭输入/输出流和Socket

服务器端 客户端 创建服务器(端口号) 定义数据成员 服务器等待 网络连接 建立socket流 发送谈话信息 接收用户谈话信息 接收服务器谈话信息 关闭流 accept() 127.0.0.1 4444 4444 结束谈话(Bye.) 服务器端 客户端

5、Socket通信 看看这个谈话程序的运行效果: 1、服务器端 SingleTalkServer.java 2、客户端 SingleTalkClient.java

5、Socket通信 ——简单的Client/Server 在本地机器上测试网络程序用回绕地址 Socket socket = new Socket(“127.0.0.1”, 4444); 建立socket连接后,还应该建立输入输出数据流。 要控制好输入/输出流和Socket关闭的时间。 如果网络的一端已经关闭,另一端读到null。 在运行时,服务器端程序一般应先行启动。

5、Socket通信 ——支持多Client 解决方案一: 在一台计算机上一次启动多个服务器程序,只要端口号不同。 myserver1 <-------->myclient1 myserver2<-------->myclient2 Server(1111) client(2222) Server(2222) client(1111) Server

5、Socket通信 ——支持多Client 解决方案二: 将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 //主线程 while (true) { accept a connection ; create a thread to deal with the client ; }end while Server client1 client2 serverthread2 serverthread1 ……

5、Socket通信 ——支持多Client serverSocket = new ServerSocket(4444); while (listening) { Socket socket; socket = serverSocket.accept(); //程序将在此等候客户端的连接 clientNumber++; //记录客户数目 new MultiTalkServerThread(socket, clientNumber).start(); //创建一个新线程处理此客户请求 } serverSocket.close(); class MultiTalkServerThread extends Thread { public MultiTalkServerThread(Socket socket, int clientNumber) this.socket = socket; this.clientNumber = clientNumber; } public void run() …

5、Socket通信 ——支持多Client 客户1 客户2 服务器 线程1( ) 线程2( ) MultiTalkServer.java

5、Socket通信 ——Client之间通过Server通信 服务器 (4444) accept socket 客 户 2 IP1 client1 线程1 1 IP2 client2 线程2

6、数据报通信 UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。 在Java中,基于UDP协议实现网络通信的类有三个: 用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket 用于广播通信的类MulticastSocket。 datagram server client

6、数据报通信 ——数据报:类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) //这两个方法用于发送数据报 获取数据——获取接收数据报中的信息 public InetAddress getAddress() public byte[] getData() public int getLength() public int getOffset() public int getPort() 设置数据——设置发送数据报中的信息 setAddress(InetAddress iaddr)、setPort(int iport)、setData(byte[] buf)、setData(byte[] buf, int offset, int length) 、setLength(int length)

6、数据报通信 ——点到点通信:类DatagramSocket 构造方法 最主要的方法——发送与接收数据报 其他方法 public DatagramSocket() public DatagramSocket(int port) //在指定的端口通信 public DatagramSocket(int port, InetAddress laddr) //在指定的地点运行 这三个方法都将抛出例外SocketException,程序中需要捕获处理。 最主要的方法——发送与接收数据报 public void receive(DatagramPacket p) public void send(DatagramPacket p) 这两个方法都将抛出例外IOException,程序中需要捕获处理。 其他方法 public void connect(InetAddress address, int port) //与指定的机器通信,有连接 public void disconnect() //关闭与指定机器的连接 public void close() //关闭Socket

接收端(客户端) 发送端(服务器端) 建立数据报socket 建立一个接收数据报 建立一个请求数据报(发送) 发出请求 等待请求报文 获得对方地址(通过接收数据报) 构成发送数据报 发送出去 创建接收数据报 等待接收 接收端(客户端) 发送端(服务器端)

6、数据报通信 ——点到点通信 看看这个点到点通信程序的运行效果: 1、服务器端(发送端) SingleUDPServer.java 2、客户端(接收端) SingleUDPClient.java

6、数据报通信 ——点到点通信 发送端(服务器端)发出数据报的标准步骤: 1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;(用来存放接收方的地址) int port; (用来存放接收方的端口号) 2. 创建数据报Socket对象 try{ socket = new DatagramSocket(4445); }catch(java.net.SocketException e) {} socket 绑定到一个本地的可用端口,等待接收客户端的请求。

6、数据报通信 ——点到点通信 3.分配并填写数据缓冲区(一个字节类型的数组) byte[] buf = new byte[256]; 存放从客户端接收的请求信息。 4.创建一个接收数据报DatagramPacket packet = new DatagramPacket(buf, 256); 用来从socket接收数据,它只需要两个参数。 5. 服务器阻塞(等待接收数据) socket.receive(packet); 在客户的请求数据报到来之前一直等待。

6、数据报通信 ——点到点通信 6. 从到来的接收数据报中得到客户端的地址和端口号 InetAddress address = packet.getAddress(); int port = packet.getPort(); 7. 准备需要发送的数据:将数据送入缓冲区buf 或来自文件、或键盘输入 8. 建立发送数据报,用来从socket向客户端发送信息 packet = new DatagramPacket(buf, buf.length, address, port); 9. 发送数据包 socket.send(packet); 10.关闭socket socket.close();

6、数据报通信 ——点到点通信 接收端(客户端)接收数据报的标准步骤: 1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte[] sendBuf = new byte[256]; 2. 建立socket socket = new DatagramSocket(); 无须指定端口号,它会自动获得一个可用的端口号。

6、数据报通信 ——点到点通信 3. 向服务器端发出请求数据报(发送数据报) address = InetAddress.getByName(args[0]); port = parseInt(args[1]); //获得服务器端的IP和端口号 packet = new DatagramPacket(sendBuf, 256, address, port); socket.send(packet); 这个数据报本身会带有客户端的信息 4. 客户端等待服务器端的应答(通过接收数据报接收数据) packet=new DatagramPacket(sendBuf, 256); socket.receive(packet); 如果没有到就一直等待,因此实用程序要设置等待时间限度 5. 处理接收到的数据 String received=new String(packet.getData(), 0); System.out.println(received);

6、数据报通信 ——广播通信 DatagramSocket只允许数据报发往一个目的地址。java.net类包中提供了类MulticastSocket,允许将数据报以广播的方式发送到某个端口的所有客户。 类MulticastSocket是在客户端(接收端)使用,监听服务器端广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。

6、数据报通信 ——广播通信 类MulticastSocket:从DatagramSocket继承而来 构造方法 主要方法 public MulticastSocket() public MulticastSocket(int port) :在指定的端口通信 这两个方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public void joinGroup(InetAddress mcastaddr):加入一个广播组 public void leaveGroup(InetAddress mcastaddr):离开一个广播组 public void setTimeToLive(int ttl):指定数据报离开时间 public void send(DatagramPacket p, byte ttl):在指定的时间内将数据报发送出去 这四个方法都将抛出例外IOException,程序中需要捕获处理。 继承DatagramSocket的方法 public void receive(DatagramPacket p):接收数据 public void send(DatagramPacket p):发送数据 public void connect(InetAddress address, int port):与指定的机器通信 public void disconnect():关闭指定的连接 public void close():关闭Socket

6、数据报通信 ——广播通信 客户端 MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group); … //receive datagram socket.leaveGroup(group); socket.close(); 服务器端 InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet);

6、数据报通信 ——广播通信 广播组的IP地址是一类特殊的IP地址,它们没有分配给网上的硬件资源使用,而是专门保留下来作为广播通信使用的(就像127.0.0.1是专门用来描述本机IP一样)。这一类地址的范围是从224.0.0.0到239.255.255.255,其中地址 224.0.0.0又被保留不能被一般应用程序所使用。 当前,广播通信只能在应用程序中使用,不能在Applet中使用。

6、数据报通信 许多防火墙和路由器可以配置为不允许UDP数据报进入。因此,如果想在这种环境下提供UDP网络服务,就需要请求系统管理员重新配置防火墙和路由器,以允许UDP数据报进入。

小结 实现网络功能要靠URL类、URLConection类、Socket类和DatagramSocket类。 网络上的数据传送是将网络连接转换成输入输出流。 DataInputStream和DataOutputStream (PrintStream)是网间流的载体。 URL适用于Web应用,如访问http服务器,是高层服务。 URLConection的另一边通常是CGI程序。

小结 回绕地址(127.0.0.1)可用于在本地机器上调试网络程序。 Socket适用于面向连接的,可靠性要求高的应用。 Datagram适用于效率要求高的应用。 Socket是由IP和端口构成的一种网上通信链路的一端。 Socket通信要分别运行服务器和客户程序。 服务器程序是多线程的,可处理多个客户的请求。

下一讲:JDBC JDBC基础 JDBC驱动程序 JDBC编程 示例