什么是TCPIP,什么是IPTCPIP:是TransmissionControlInternetProtocol缩写,即传输控制协议国际互联协议,它是Internet国际互联网络的基础。该
什么是TCP/IP,什么是IP
TCP/IP:是Transmission Control/Internet Protocol缩写,即传输控制协议/国际互联协议,它是Internet
国际互联网络的基础。
该组协议主要包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP和TFTP等。
TCP(Transmission Control Protocol)传输控制协议;
IP(Internet Protocol)网际协议;
UDP(User Datagram Protocol)用户数据协议;
ICMP(Internet Control Messaged Protocol)互联网控制信息协议;
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议;
SNMP(Simple Network manage Protocol)简单网络管理协议;
FTP(File Transfer Protocol)文件传输协议;
ARP(Address Resolation Protocol)地址解析协议;
TCP/IP通常被看成一个4层模式:应用层、传输层、网络层、网络接口层。
1应用层:向用户提供一组常用的应用程序;
2传输层:提供应用程序间的通信,包括格式化信息流和提供可靠传输等;
3网络层:TCP/IP协议族中非常关键的一层,负责相邻计算机之间的通信,主要定义了IP地址格式,
从而能够使得不同应用类型的数据在Internet上通畅地传输,IP协议就是一个网络层协议。
4网络接口层:TCP/IP软件的最底层,负责接收IP数据包并通过网络进行发送,或者从网络上接收
物理帧,抽出IP数据报,交给IP层。
什么是IP
IP协议又称互联网协议,是支持网间互连的数据报协议,它与TCP协议一起构成了TCP/IP协议族的核心。
它提供网间连接的完善功能,包括IP数据报规定互连网络范围内的IP地址格式。
TCP和UDP有什么区别
TCP(Transmission Control Protocol)是传输控制协议,UDP(User Datagram Protocol)是用户数据报协议。
TCP和UDP均属于传输层协议。
TCP对应的是可靠性要求高的应用,UDP对应的是可靠性要求低,传输经济的应用;
TCP支持的应用协议主要有Telnet、FTP、SMTP等;UDP支持的应用层协议主要有NFS(网络文件系统)、
SNMP(简单网络管理协议),DNS(主域名称系统)和TFTP(通用文件传输协议)等。
什么是HTTP,HTTP的工作原理如何
HTTP(Hypertext Transfer Protocol)被称为超文本传输协议,用于控制万维网服务器和本地浏览器
之间的超文本信息传送。
http://www.baidu.com/china/index.html:该地址就是URL(Uniform Resource Locator),即统一资源定位符。
http://代表访问服务器的协议;
www代表一个Web服务器;
baidu.com/代表Web服务器的域名,或者服务器站点的名称;
china/代表服务器上的一个子目录;
index.html代表China目录中的一个HTML文件。
HTTP工作原理及主要过程:
发送请求-响应请求-处理响应
HTPP请求和响应格式:
消息的格式:由一个起始行、一个或者多个头域、一个指示头域结束的空行和可选的消息组成。
HTTP头域包括:通用头、请求头、响应头和实体头4个部分。
每个头域由一个域名,冒号和域值3部分组成。
域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始
处,使用至少一个空格或制表符。
请求信息的格式:
GET http://download.microtool.de:80/somedata.exe
Host:download.microtool.dc
Accept:*/*
Pragma;no-cache
Cache-Control:no-cache
Referer:http://download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
GET:GET方式的请求
Host:头域执行请求资源所在的服务器或网关的位置;
Referer:头域允许客户端指定URI的资源源地址;
Range:头域可以请求实体的一个或者多个子范围;
User-Agent:头域的内容包含发出请求的用户信息。
响应消息的格式:
HTRP/1.0200OK
Date:Mon,31Dex200104:25:57GMT-响应时间
Server:Apache/1.3-服务器信息
Content-type:text/html-响应信息的格式及类型
Last-modified:Tue,17-上次修改时间
Content-length:234324-响应信息大小,以字节为单位
Content-range:bytes554554-40279979-响应信息的范围
在Socket通信时如何获取主机和客户机的IP地址
Java提供了一个java.netInetAddress类,该类用于表示互联网协议(IP)地址。
String getHostAddress():获取IP地址字符串
String getHostName():获取IP地址的主机名
InetAddress getLocalHost():获取本地主机的InetAddress对象
InetAddress getByName(String host):在给定主机名的情况下,返回InetAddress对象。
如何利用Socket实现基于TCP的通信
基于TCP协议实现两台计算机之间的通信:主要使用Socket和ServerSocket类。
Socket类用于实现客户端套接字,套接字是两台计算机之间的通信端点。
//创建一个流套接字并将其连接到指定主机上的指定端口号
public Socker(String host,int port)throws UnknownHostException,IOException
//返回套接字连接到的远程IP地址
public InetAddress getInetAddress()
//返回将字节写入此套接字的输出流
publi OutputStream getOutputStream() throws IOException
//返回从此套接字读取字节的输入流
public InputStream getInputStream() throws IOException
//关闭此套接字,与此套接字有关联的通道也将关闭
public void close() throws IOException
ServerSocket类用于实现服务器套接字,提供TCP服务。
//创建绑定到特定端口的服务套接字
public ServerSocket(int port) throws IOException
//侦听并接收到此套接字的连接,此方法在进行连接之前一直阻塞
public Socket accept() throws IOException
//关闭此套接字,与此套接字有关联的通道也将关闭
public void close() throws IOException
如何利用Socket传输中文字符
在网络中串递的信息为字节,因此发送的字符需要编码为字节。如果开发者不指定编码类型,将
采用默认的ISO-8859-1。
方法一:使用DataOutputStream的writeUTF()方法发送信息。
使用DataInputStream的readUTF()方法接受信息。
方法二:使用Writer字符流发送信息。
使用Reader字符流接收信息。
在使用字符刘发送和接收信息时,需要使用统一的编码。
如何在Socket读取数据时使用超时设置
Java1.4在Java API中加入了NIO技术,NIO支持非阻塞I/O(non-blocking I/O)操作。
首先需要创建一个Socket对象,然后通过setSoTimeOut()方法设置所期望的超时时间,单位是毫秒。
当设置超时后,输入流如果超过了指定的时间还读不到任何数据,程序将抛出一个java.io.Interrupt
edIOException异常,可以捕获该异常并决定是否尝试进行另一次读取操作。
如何利用Socket传递对象信息
在Socket通信时,可以用对象将传输的信息封装,然后以对象为单位在网络中进行传输。
注意:由于消息对象要在网络中传递,因此消息类必须实现序列化。
如何利用Socket实现文件传输
利用Socket传输文件与传输字符信息的过程非常相似,只不过在传输文件过程中添加了读写文件的操作。
如何利用Socket实现基于UDP的通信
基于UDP协议实现两台计算机之间的通信:蛀牙使用DatagramSocket和DatagramPacket类。
DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送和
接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
DatagramSocket总是启用UDP广播发送。为了接收广播包,应该将DatagramSocket绑定到通配符地址。
DatagramSocket类的重要方法:
//创建数据报套接字并将其绑定到本地主机上的指定端口
public DatagramSocket(int port) throws SocketException
//将套接字连接到此套接字的远程地址
//当套接字连接到远程地址时,包就只能从该地址发送或接收,默认情况下不连接数据报套接字
//如果套接字要连接的远程目标不存在或不可到达,那么可能会抛出PortUnreachableException
public void connect(InetAddress address,int port)
//从此套接字接收数据报包,此方法在接收到数据报前一直阻塞
public void receive(DatagramPacket p) throws IOException
//从此套接字发送数据报包
public void send(DatagramPacket p) throws IOException
//断开套接字的连接
public void disconnect()
DatagramPacket类的重要方法:
//创建数据报包,用来将长度为length的包发送到指定主机上的指定端口号
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
//返回将要发送或接收到的数据报中数据快得字节大小
public int getLength()
//得到接收数据报中的数据
public byte[] getData()
//为发送者提供一个InetAddress对象
public InetAddress getAddress()
//得到UDP端口
public int getPort()
如何获取Internet资源的大小
需要使用java.net包下的URL类和URLConnection类。
java.net.URL类代表一个统一资源定位符,它是指向互联网资源的指针。
java.net.URLConnection类代表应用程序和URL之间的通信链接。此类的实例可用于读写URL所引用的资源。
穿件一个到URL的连接的步骤:
通过在URL上调用openConnection()方法创建连接对象;
设置操作参数和一般请求属性;
使用connect()方法建立到远程对象的实际连接。
远程对象变为可用。远程对象的头字段和内容变为可访问。
如何实现Internet资源的单线程下载
URLConnection类可实现网络资源的读取和写入功能:
//打开与URL引用的资源的通信链接
public abstract void connect() throws IOException
//返回URL引用的资源的内容长度,如果内容长度未知,则返回-1
public int getConnectionLength()
//返回URL引用的资源的内容编码,或者如果编码为未知,则返回null
public String getContentEncoding()
//返回从此打开的连接读取的输入流
public InputStream getInputStream() throws IOException
//返回写入此连接的输出流
public OutputStream getOutputStream() throws IOException
URL如何通过proxy代理访问Internet资源
对于没有直接连接到Internet网络,不能直接用java.net.URL访问网络上资源。
在这种情况下,需要为java.net.URL指定代理服务器:
//获取系统属性集合
Properties prop = System.getProperties();
//设置代理服务的地址
prop.put("http.proxyHost","172.16.0.10");
//设置代理服务服务端口
prop.put("http.proxyPort","11080");
如何实现Internet资源下载的断点续传
断点续传原理:在每次发送请求时,将上次断点的位置通过"RANGE"参数设定,实现资源的继续访问。
如何实现Internet资源的多线程下载
多线程下载的示例由MultiDownload和DownThread两个类构成:
Downthread类:是一个下载线程,该线程在启动时需要指定下载文件的URL,下载起始点和下载结束点
等参数。下载过程中利用RandomAccessFile类将下载的内容写入目标文件,通过RandomAccessFile类
的seek()方法可以指定写入目标文件的起始位置。
MultiDownload类:获取下载文件的大小,并根据指定的线程数量计算出每一个线程应该下载的起始点
和结束点,然后创建并启动线程。
如何解析Internet网页内容
解析网页内容的重要思路:首先使用URL类和URLConnection类获取指定网页的流信息,然后使用字符
串切割或正则表达式技术将需要的信息获取。
注:本章的代码实例见原书,码起来太麻烦