Java就业培训教程第十一章 网络编程
java网络编程
Socket主要方法
Socket主要方法
public InetAddress getInetAddress() 返回套接字所连接的远程主机地址。 public InputStream getInputStream() throws IOException 返回该套接字的输入流。 public InetAddress getLocalAddress() 返回套接字连接的本地主机地址。 public int getLocalPort() 返回套接字所连接的本地主机端口。 public OutputStream getOutputStream() throws IOException 返回该套接字的输出流。 public int getPort() 返回套接字所连接的远程主机端口。
Socket编程
服务器端
ServerSocket ss = new ServerSocket(9001); System.out.println("等待连接..."); Socket socket = ss.accept();//等待客户端连接 System.out.println("已连接");
本章回顾
了解包 掌握套接字相关类的使用 掌握Web相关类的使用
客户端
//客户端向服务器发送一个连接请求 Socket socket = new Socket("127.0.0.1",9001);
获取流
获取网络输入输出流
//得到输入流 Scanner in = new Scanner(socket.getInputStream()); //建立网络输出流 PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
11第十一章:网络编程
《JAVA程序设计》课程
11.1 网络编程的基本概念
案例11-2:通过IP地址获取InetAddress对象并输出相应的IP地址和域名
import .InetAddress; import .UnknownHostException; public class InetAddressTestByIP {
《JAVA程序设计》课程
11.1 网络编程的基本概念
服务端和客户端数据传输的方式如图11.1所示
Server
2、接受要求 3、传递数据
Internet
4、接收数据 1、提出要求
Client
《JAVA程序设计》课程
图11.1:Client-Server结构图
11.1 网络编程的基本概念
(2)TCP/IP协议簇
《Java 程序设计》课程 第十一章 网络编程
主讲人: 谢先伟
2017年3月
Java程序设计
主要内容
1、网络的概念和网络模型 2、IP地址和端口号 3、UDP和TCP通信协议 4、基于UDP协议的SOCKET通信
《JAVA程序设计》课程
Java程序设计
主要内容
5、基于TCP协议的SOCKET通信 6、URL、URLConnetion和HttpURLConnection
11.1 网络编程的基本概念
案例11-3:获取域名为“”的主机对应的IP列表 提醒:若要通过域名获取对应该域名的所有的映射IP地址,可以通过方法 getAllByName(“主机域名”)实现。
代码如下所示:
import .InetAddress; import .UnknownHostException; public class InetAddressTest {
JAVA第11章
ServerSocket s = new ServerSocket(8888);
// 循环运行监听程序,以监视连接请求
7.
while (true) {
// 监听端口请求,等待连接
8.
Socket s1 = s.accept( );
// 得到与socket相连接的数据流对象
9. 10.
OutputStream os = s1.getOutputStream(); DataOutputStream dos = new DataOutputStream(os);
URL的基本结构为:
protocol:// host_name:port_number/file_name
1. protocol指示所要获取资源的传输协议,如:
http,ftp,gopher,file等;
2. host_name指示资源所在的主机。
3.
port_number:指示连接时所使用的通 信端口号;
URL的构造方法
URL对象是通过定义在 包中的URL类进行构造的。
URL的构造方法
1.
public URL(String spec): 最为直接的一种,只要将整个URL的名称直 接以字符串的形式作为参数传入即可; 示例:
URL url1=new URL("");
服务器 ServerSocket(port#)
ServerSocket.accept()
注册 服务 等待 连接
Socker() OutputStream InputStream Socket.close()
客户机 Socket(host,port#) (attempt to connect) OutputStream InputStream Socket.close()
第11章-Java网络编程
提纲
• 一、网络地址InetAddress
• 二、UDP数据报
• 三、TCP连接
– – – – – – 3.1 连接 3.2 套接字Socket 3.3 Socket连接到服务器 3.4 ServerSocket实现服务器 3.5 服务器多线程处理套接字连接 3.6 Socket关闭与半关闭
• 四、URL链接
提纲
• 一、网络地址InetAddress
• 二、UDP数据报 – 2.1 端口与数据报套接字 – 2.2 发送UDP数据报 – 2.3 接收UDP数据报
• 三、TCP连接
• 四、URL链接
2.1 端口与数据报套接字
• UDP(User Datagram Protocol)数据报协议:一种面向无连接的、不可
3.4 ServerSocket实现服务器
【例6】时间服务器的服务端和客户端 (2/5)
try { Socket theSocket = new Socket(hostname, 13); InputStream timeStream = theSocket.getInputStream(); StringBuffer time = new StringBuffer(); int c; while ((c=timeStream.read())!=-1) time.append((char) c); String timeString = time.toString().trim(); System.out.println("It is " + timeString + " at " + hostname); } catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) { System.err.println(e); } }
扣丁学堂_Java_11_网络编程
课程大纲1、网络编程基本概念2、网络编程TCP协议3、TCP ECHO实现程序4、服务器与多客户端通信5、多客户端之间的通信6、网络编程UDP协议7、URL1、网络编程基本概念网络编程基本概念1、什么是计算机网络把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
2、计算机网络的主要功能资源共享信息传输与集中处理均衡负荷与分布处理(/综合信息服务(www/综合业务数字网络ISDN)等1、网络编程基本概念网络编程基本概念3、网络通信协议要使计算机连成的网络能够互通信息,需要对数据传输速率、传输代码、代码结构、传输控制步骤、出错控制等制定一组标准,这一组共同遵守的通信标准就是网络通信协议,不同的计算机之间必须使用相同的通讯协议才能进行通信。
网络通信接口为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。
接口包括两部分:(1)硬件装置:实现结点之间的信息传送(2)软件装置:规定双方进行通信的约定协议1、网络编程基本概念网络编程基本概念4、TCP/IPTCP/IP:传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
IP地址:网络中每台计算机的一个标识号,本地IP:127.0.0.1 localhost端口号(PORT):端口号的范围:0~65535之间,0~1023之间的端口数是用于一些知名的网络服务和应用()端口号的范围之间之间的端口数是用于些知名的网络服务和应用网络编程基本概念1、网络编程基本概念5、程序开发结构网络编程主要是指完成C/S程序的开发,程序的开发结构有两种:∙C/S(客户端/服务器)开发两套程序,两套程序需要同时维护,例如:QQ。
java习题及答案第11章 习题参考答案
习题11 课后习题答案1.常见网络端口有哪些?答案:在计算机中操作系统内部使用1-1024保留端口号,所以设计应用程序时需选择除此之外的端口。
如:20文件传输协议(默认数据口) ,80全球信息网超文本传输协议(www)。
2.如何连接和读取URL中的资源?答案:(1)通过URLConnection连接WWW:用URL的openStream()方法从网络上读取数据,若要输出数据,用类URLConnection,与URL建立连接,然后对其进行读/写操作。
(2)用URL读取WWW数据资源:在取得一个URL对象后,通过使用URL的openStream()方法,可以获得所需的特定的WWW 资源。
3.什么是套接字?有哪几种套接字?答案:套接字Socket是网络通信的应用程序接口,可以实现客户机与服务器之间的通信。
常用的TCP/IP协议的3种套接字类型有:流套接字(SOCK_STREAM);数据包套接字(SOCK_DGRAM);原始套接字(SOCK_RAW)。
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。
数据包套接字提供了一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。
因此,如果要访问其他协议发送数据必须使用原始套接字。
4.简述TCP套接字的实现过程?答案:实现TCP套接字基本步骤分为服务器端和客户端两部分。
(1)服务器端步骤创建套接字;绑定套接字;设置套接字为监听模式,进入被动接收连接请求状态;接收请求,建立连接;读/写数据;终止连接。
(2)客户端步骤创建套接字;与远程服务器程序连接;读/写数据;终止连接。
第11章 Java网络编程
返回与这个URL对象相关的协议的缺 省端口号 获取URL对象在文件中的相对位置, 返回URL对象的引用(锚)。
方法 public String getAuthority( )
public int getDefaultPort( ) public String getRef( )
后就可以完成各种各样的操作。
11.2 基于URL的网络编程
看如下程序段: try{ URL netChinaJavaWorld=new URL(“/index.shtml”); URLConnection uc= netChinaJavaWorld.openConnection(); }catch(MalformedURLException e){ //创建URL()对象失败 … }catch(IOException e){ //openConnection()失败 … }
以上在类URLConnection中,提供了很多设置 或获取连接参数的方法,其中,最常使用的是 获得输入流的方法getInputStream()和获得输出 流的方法getOutputStream(),定义如下:
方法 getInputStream() getOutputStream() 描述 返回该URLConnection对应的输入流,用于获取 URLConnection响应的内容 返回该URLConnection对应的输出流,用于向 URLConnection发送请求参数
11.2 基于URL的网络编程
【例11-1】:生成一个URL对象,并获取它的各 个属性 代码:11-1.txt 运行结果输出URL地址的个属性值,因为URL没 有参考点,输出为null。
11.2 基于URL的网络编程
Java语言基础课件网络编程
1. mysql: 3306 2. oracle: 1521 3. web: 80 4. tomcat: 8080
网络编程三要素之协议(掌握)
案例:UDP数据传输+键盘和循环(了解)
案例:UDP数据传输+键盘和循环+双线程实现(了解)
案例:TCP数据传输
client socket1
监听客户端9999连接 开启线程接收数据Socket1
服务端
发送网络请求
客户端
socket
通信管道 响应网络请求
socket
服务器
Socket-TCP通信原理图解(了解)
Socket-UDP通信原理图解(了解)
1. 将数据及源和目的封装成数据包中,不 需要建立连接
2. 每个数据报的大小限制在64K之内 3. 因为无需连接,因此是不可靠协议 4. 不需要建立连接,速度快
Socket概述(了解)
➢ Socket套接字概述: ➢ 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。 ➢ 通信的两端都有Socket。 ➢ 网络通信其实就是Socket间的通信。 ➢ 数据在两个Socket间通过IO流传输。 ➢ Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
Socket-发送方
IP+Port+内容
Socket-接收方 IP:192.168.2.228 Port:5288
案例:UDP数据传输(了解)
JAVA第11章 网络编程
Socket so = new Socket(InetAddress.getByName(""), 80);
这两种Socket的创建方式会在创建的时候一直阻塞, 直到有连接响应。具体使用哪种方式创建套接字,可按 实际情况进行选择。
11.2.2 ServerSocket
创建时指定封装的数据、数据的偏移量、封装数据的大小、
buf, int offset, int length, 指定数据包的IP地址和端口号,用于数据发送方
InetAddress addr, int prot)
返回DatagramPacket对象的IP地址,如果是发送方,则返
InetAddress getAddress() 回接收方的IP地址,如果是接收方,则返回发送方的IP地址
DatagramSocket对象专用于发 送和接收使用DatagramPacket打包 后的数据。两者分工明确,前者负 责接收和发送经过后者打包的数据, 后者则专门负责数据的打包工作。
DatagramSocket中常用的方法 如表11-2所示。
表11-2 DatagramSocket中常用的方法
方法声明
套接字(Socket)是TCP/IP中的基本概念,负责将 TCP/IP包发送到指定的IP地址。可以看作是两个程序通 信连接中的一个端点,一个用于将数据写入Socket中,该 Socket将数据发送到另一个Socket中,使得该数据能够 传送给其他程序。
URL(Uniform Resource Locator )统一资源定位 符是对可以从互联网上得到的资源的位置和访问方法的一 种简洁的表示,是互联网上标准资源的地址。互联网上的 每个文件都有一个唯一的URL,它包含的信息指出文件的 位置以及浏览器应该怎么处理它。
Java程序设计基础教程 第11章 网络编程
第11章 网络编程
11.1 网络通信协议 11.2 TCP通信 11.3 UDP通信 11.4 任务:对点聊天室
Java基础教程
第11章 TCP和UDP
(1)TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫做网络通信协议;
总结
Java基础教程
Java基础教程
第11章 网络编程
11.2 TCP通信
socket创建的两种方式
Socket so = new Socket(); SocketAddress saddr = new InetSocketAddress(InetAddress.getByName(""), 80); so.connect(saddr, 3000);
Socket so = new Socket("", 80); // 或者 Socket so = new Socket(InetAddress.getByName(""), 80);
Java基础教程
第11章 网络编程
socket通信模型
11.2 TCP通信
(2)对于服务端,同客户客户端类似,需要同时兼有发送数据包和接收数据包的功能,同时,服务 端还要实现向所有已经注册的用户发送它收到的信息,为了实现该功能,则客户端需要将自己的监听端 口告诉服务端,同时服务端能够存储这些信息并向客户端广播消息。
Java基础教程
第11章 网络编程
网络通信协议
TCP通信 UDP通信
Java基础教程
第11章 网络编程
UDP通信处理类
java教材源代码第11章 网络编程
第11章网络编程【例11-1】通过使用openStream()方法获取到URL ://baidu/index.html的输入流,该流基础上创建一个BufferedReader,通过对BufferedReader流的读取操作,获取该URL中的数据并显示。
import .*;import java.io.*;public class URLReader {public static void main(String[] args) throws Exception {URL baidu = new URL("://baidu/index.html");BufferedReader in = new BufferedReader(new InputStreamReader(baidu.openStream()));String inputLine;while ((inputLine = in.readLine()) != null)System.out.println(inputLine);in.close();}}【例11-2】利用URLConnection类的对象读取://baidu页面信息。
import .*;import java.io.*;public class URLConnectionReader {public static void main(String[] args) throws Exception {URL baidu = new URL("://baidu/");URLConnection bd = baidu.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(bd.getInputStream()));String inputLine;while ((inputLine = in.readLine()) != null)System.out.println(inputLine);in.close();}}【例11-3】利用TCP协议socket通讯的客户方实现。
Java网络编程
protocol=http host = filename=/tutorial.intro.html port=-1 ref=DOWNLOADING query=null path=/tutorial.intro.html UserInfo=null Authority=
1 网络基础
1、IP地址和InerAddress类 为了进行网络通信,通信双方必须遵守通信协议。 目前使用最广泛的是TCP/IP协议,它是Internet中各方所 遵守的公共协议。 TCP是一种传输控制协议 IP是一种网际协议 TCP/IP是两种协议的结合。
IP地址用于指明因特网上一台计算机在网络中的地址,用32位二 进制代码表示网络地址。 地址用A B C D E五类。 A(1.0.0.0—126.255.255.255)0开头,7位网络号,24主机号 B(128.0.0.0—191.255.255.255)10开头,14位网络号,16主机号 C(192.0.0.0—233.255.255.255)110开头,21位网络号,8主机号
创建服务器端 try{ ServerSocket socket=new ServerSocket(4700);
}catch(IOException e){ System.out.println("Error:"+e); }
服务端程序在指定的窗口监听,当收到Client程序发出的 服务请求时,创建一个套接字对象与该端口对应的Client 程序通信。 例如:建立服务器套接字对象,确立对象serverSocket后, 可以使用accept()方法,,得到Socket对象,接受来自 Client程序的信息。
9.2.4 解析URL
一个URL对象生成后,其属性是不能被改变的,但是我们可 以通过类URL所提供的方法来获取这些属性: public String getProtocol() 获取该URL的协议名。 public String getHost() 获取该URL的主机名。 public int getPort() 获取该URL的端口号,如果没有设置 端口,返回-1。 public String getFile() 获取该URL的文件名。 public String getRef() 获取该URL在文件中的相对位置。 public String getQuery() 获取该URL的查询信息。 public String getPath() 获取该URL的路径 public String getAuthority() 获取该URL的权限信息 public String getUserInfo() 获得使用者的信息 public String getRef() 获得该URL的锚(引用)
Java大学实用教程第11章 Java 中的网络编程
注:ServerSocket对象可以调用setSoTimeout(int timeout)方法设置超时值(单位是 毫秒),timeout是一个正值。当ServerSocket对象调用accept()方法堵塞的时间一 11 旦超过timeout时,将触发SocketTimeoutException 。
4
11.3 显示URL资源中的HTML文件
在上面的例11-1中, 的主页的内容显示 在文本区中 ,但有时候我们想看到网页的运行效果。 javax.swing 包 中的JEditorPane类可以解释执行html文件。也就是说,如果把html文 件 读 入 到 JEditorPane, 该 html 文 件 就 会 被 解 释 执 行 , 显 示 在 JEditorPane中,这样程序就看到了网页的运行效果。
◆ IP(Internet Protocol)地址:IP地址是用于惟一标识连接到Internet的计算机的数字 地 址 是 由 32 位 二 进 制 数 组 成 , 如 202.199.28.6 。 没 有 IP 地 址 就 不 能 区 分 连 在 Internet上不同的计算机。 ◆ 域 名 : 用 字 符 形 式 表 示 连 接 到 Internet 的 计 算 机 的 数 字 地 址 。 如 域 名 “”和IP“202.108.35.210”是一个主机的两种表示法。 ◆域名服务器(DNS):负责将域名与IP地址的转化。 ◆ URL(Uniform Resource Locator,统一资源定位符):标识了计算机上的资源。一个URL通常 包含一些重要的信息 , 如 /hotlink.html 包含了如下信息:
Java程序设计教程-电子教案 第11章 Java网络编程
本章内容提要
1 3 2 3
网络通信方式 套接字通信
数据报通信
11.1 网络编程基本知识
1.网络通信方式 网络的通信形式在传输层中主要有两种,即面向 连接的通信方式和面向无连接的通信方式。 面向连接的通信方式指双方通信前需要首先建立 连接,然后再进行数据的传递,所有数据以包的形 式按照一定的顺序发送和接收,直到关闭连接,通 信结束为止。 面向无连接的通信方式指双方通信前不需要建立 连接,双方直接利用数据报来发送和接收相互的数 据,是一种非可靠的无连接投递报文的通信方式。
11.1 网络编程基本知识
通信协议实际上就是计算机和网络设备之 间进行通信时需要遵守的一组规定和约定的集 合。针对网络通信方式的不同,网络上主机之 间的应用程序在传输层进行的通信协议也有两 种:TCP(传输控制协议)和UDP(用户数据报 协议)。
11.1 网络编程基本知识
(1) TCP TCP是一种面向连接的保证可靠传输的通信协议, 由于其连接的建立需要通过三次协商完成,因此也被 称为“三次握手”协议。 (2) UDP UDP是一种无连接的通信传输层协议,每个数据报 都封装在一个独立的IP分组里,包括完整的源地址和 目的地址,在到达目的地时,到达顺序以及内容的正 确性都是不能保证的。
11.2 套接字通信
套接字是IP地址和端口号的组合,其中用IP地址标识被访 问的计算机,端口号被规定为一个0~65535之间的整数 (0~1023已被操作系统预定),用于标识正在计算机上运行的 一个网络程序(IP地址就像某栋建筑物的地址,端口号就像某 栋建筑物中的房间号)。 套接字通信以TCP协议为基础,通信双方首先利用套接字建 立连接,因此需要分别设计两个程序位于通信两端,由一端发 出连接请求,另一端接受请求并建立连接,然后进行通信。此 时,请求方被称为客户端,接受方被称为服务器端。这种需要 分别设计客户端(Client)和服务器端(Server)的程序结构 被称为客户/服务器(C/S)结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第11章网络编程有人说,20世纪最伟大的发明并不是计算机,而是计算机网络。
还有人说,如果你买了计算机而没有联网,就等于买了电话机却没有接电话线一样。
计算机网络就是实现了多个计算机互联的系统,相互连接的计算机之间彼此能够进行数据交换。
正如城市道路系统总是伴随着城市交通规则来使用的道理,计算机网络总是伴随着计算机网络协议一起使用的。
网络协议规定了计算机之间连接的物理、机械(网线与网卡的连接规则)、电气(有效的电平范围)等特性以及计算机之间的相互寻址规则、数据发送冲突的解决、长的数据如何分段传送与接收等。
就象不同的城市可能有不同的交通规则一样,目前的网络协议也有多种,其中,TCP/IP协议就是一个非常实用的网络协议,它是Internet所遵循的协议,是一个“既成事实”的标准,已广为人知并且广泛应用在大多数操作系统上,也可用于大多数局域网和广域网上。
网络应用程序,就是在已实现了网络互联的不同的计算机上运行的程序,这些程序相互之间可以交换数据。
编写网络应用程序,首先必须明确网络程序所要使用的网络协议,TCP/IP是网络应用程序的首选协议,大多数网络程序都是以这个协议为基础,本章关于网络程序编写的讲解,都是基于TCP/IP协议的。
11.1 网络编程的基础知识11.1.1 TCP/IP网络程序的IP地址和端口号要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送数据的计算机,在TCP/IP协议中,这个标识号就是IP地址,目前IP地址在计算机中用四个字节,也就是32位的二进制数来表示,称为Ipv4。
为了便于记忆和使用,我们通常取用每个字节的十进制数,并且每个字节之间用圆点隔开的文本格式来表示IP地址,如192.168.8.1。
随着计算机网络规模的不断扩大,用四个字节来表示IP地址已越来越不敷使用,人们正在实验和定制使用16个字节表示IP地址的格式,这就是Ipv6。
由于Ipv6还没有投入使用,现在网络上用的还都是Ipv4,我们这里的知识也只围绕着Ipv4来展开。
因为一台计算机上可同时运行多个网络程序,IP地址只能保证把数据送到该计算机,但不能保证把这些数据交给哪个网络程序,因此,每个被发送的网络数据包的头部都包含有一个称为"端口"的部分,它是一个整数,用于表示该数据帧交给哪个应用程序来处理。
我们还必须为网络程序指定一个端口号,不同的应用程序接收不同端口上的数据,同一台计算机上不能有两个使用同一端口的程序运行。
端口数范围为0-65535之间。
0-1023之间的端口数是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数,从而避免端口号已被另一个应用或系统服务所用。
如果我们的一个网络程序指定了自己所用的端口号为3150,那么其他网络程序发送给这个网络程序的数据包中必须指明接收程序的端口号为3150,当数据到达第一个网络程序所在的计算机后,驱动程序根据数据包中的3150这个端口号,就知道要将这个数据包交给这个网络程序。
11.1.2 UDP与TCP在TCP/IP协议栈中,有两个高级协议是我们网络应用程序编写者应该了解的,它们是"传输控制协议"(Transmission Control Protocol,简称TCP)和"用户数据报协议"(User Datagram Protocol,简称UDP)。
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。
应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。
这个连接一旦建立,两台计算机之间就可以317把数据当作一个双向字节流进行交换。
就像我们打电话一样,互相能听到对方的说话,也知道对方的回应是什么。
UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。
简单地说,如果一个主机向另外一台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否已准备接收数据。
如果另外一台主机收到了数据,它不会确认收到与否。
就像传呼台给用户发信息一样,传呼台并不知道你是否能收到信息(为了避免丢失用户信息,他们常常将一条信息发送两遍)。
TCP、UDP数据包(也叫数据帧)的基本格式如图11.1所示。
图11.111.1.3 Socket大家不要生硬和孤立地去理解什么是Socket,就象我们不要让一个从来没有见到过大米与米饭的人去理解什么是“rice”一样的道理,任何一个事物和概念都得有个代名词,大家只有先理解和事物和概念本身,就自然理解了它的代名词。
同样Socket是网络驱动层提供给应用程序编程的接口和一种机制,大家先掌握和理解了这个机制,自然就明白了什么是Socket。
大家可以认为Socket是应用程序创建的一个港口码头,应用程序只要把装着货物的集装箱(在程序中就是要通过网络发送的数据)放到港口码头上,就算完成了货物的运送,剩下来的工作就由货运公司去处理了(在计算机中由驱动程序来充当货运公司)。
对接收方来说,应用程序也要创建的一个港口码头,然后就一直等待到该码头的货物到达,最后从码头上取走货物(发给该应用程序的数据)。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的Ip和Port。
此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送出去。
计算机从网络上收到与该Socket绑定的IP+Port相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。
网络应用程序就是这样通过Socket进行数据的发送与接收的。
作者用下面的两个图例来帮助读者理解应用程序、Socket、网络驱动程序之间的数据传送过程与工作关系。
1.数据发送过程如图11.2所示:318图11.22.数据接收过程如图11.3所示:图11.3Java分别为UDP和TCP两种通信协议提供了相应的编程类,这些类存放在 包中,与UDP对应的是DatagramSocket,与TCP对应的是ServerSocket(用于服务器端)和Socket(用于客户端)。
网络通信,更确切的说,不是两台计算机之间在收发数据,而是两个网络程序之间在收发数据,我们也可以在一台计算机上进行两个网络程序之间的通信,这两个程序要使用不同的端口号。
11.2 Java编写UDP网络程序31911.2.1 DatagramSocket编写UDP网络程序,我们首先要用到.DatagramSocket类,通过查阅JDK文档资料,看到DatagramSocket类的构造函数主要有如下几种形式:public DatagramSocket() throws SocketExceptionpublic DatagramSocket(int port) throws SocketExceptionpublic DatagramSocket(int port,InetAddress laddr) throws SocketException用第一个构造函数创建DatagramSocket对象,没有指定端口号,系统就会为我们分配一个还没有被其他网络程序所使用的端口号。
用第二个构造函数创建DatagramSocket对象,我们就可以指定自己想要的端口号。
用第三个构造函数创建DatagramSocket对象,我们除了指定自己想要的端口号外,还可以指定相关的IP地址,这种情况适用于计算机上有多块网卡和多个IP的情况,我们可以明确规定我们的数据通过哪块网卡向外发送和接收哪块网卡收到的数据。
如果在创建DatagramSocket对象时,我们没有指定网卡的IP地址,在发送数据时,底层驱动程序会为我们选择其中一块网卡去发送,在接收数据时,我们会接收到所有网卡收到的与程序端口一致的数据,对于我们一般只有一块网卡的情况,我们就不用专门指定了,发送和接收时肯定都是它了。
其实,对于只有一块网卡的情况,在这里指定了IP地址,反而会给我们的程序带来很大的不方便,你的这个网络程序只能在具有这个IP地址的计算机上运行,而不能在其他的计算机上运行。
当我们编写发送程序时,用哪个构造函数呢?我们在创建时DatagramSocket对象时,不指定端口号,系统就会为我们分配一个端口号,因此,我们可以用第一个构造函数,这样就相当于你给别人打电话时,你的电话可以是任意的,最好不要固定,如果你非要用某个电话,那当别人正在用这个电话时,你就只有干等的份了。
但作为接收程序,我们必须自己指定一个端口号,而不要让系统随机分配,我们可以用第二个构造函数,否则,我们就不能在程序运行前知道我们的端口号,并且每一次运行所分配的端口号都不一样,就象有朋友让你给他打电话,可他的电话号码不确定是不行的。
如果我们的程序不再使用某个Socket,我们应该调用DatagramSocket.close()方法,关闭这个Socket,通知驱动程序释放为这个Socket所保留的资源,系统就可以将这个Socket所占用的端口号重新分配给其他程序使用。
在发送数据时,我们用Datagram.send()方法,其完整的格式如下:public void send(DatagramPacket p) throws IOException在要接收数据时,我们用Datagram.receive(…)方法,其完整的格式如下:public void receive(DatagramPacket p) throws IOExceptionDatagram.send()和Datagram.receive()方法都需要我们传递一个DatagramPacket类的实例对象,如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是我们发送和接收数据的集装箱。
11.2.2 DatagramPacket查阅JDK文档,DatagramPacket类的构造函数主要有如下几种形式:public DatagramPacket(byte[] buf,int length)public DatagramPacket(byte[] buf,int length,InetAddress address,int port)用第一个构造函数创建的DatagramPakcet对象,只指定了数据包的内存空间和大小,相当于只定义了集装箱的大小。
用第二个构造函数创建的DatagramPacket对象,不仅指定了数据包的内存空间和大小,而且指定了数据包的目标地址和端口。
在接收数据时,我们是没法事先就知道哪个地址和端口的Socket会给我们发来数据,就象我们要准备一个集装箱去接收发给我们的货物时,是不用标明发货人或是收货人的地址信息的,所以我们应该用第一个构造函数来创建接收数据的320DatagramPakcet对象。