Java是 Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
直接或间接地通过网络协议与其它计算机进行通讯。
如何准确地定位网络上一台或多台主机找到主机后如何可靠高效地进行数据传输。
通信有一定的规则(有两套参考模型)
√ OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广.
OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
√TCP/川参考模型(或TCP/IP协议):事实上的国际标准。
TCP/IP参考模型采用4层的层级结构,,这4个层次分别是:网络接口层、网络层(IP层)、传输层(TCP层)、应用层。
TCP是面向连接的协议,因此每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”。
TCP关闭为四次挥手。
注意:握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
交互
try {
boolean s=InetAddress.getByName("www.bai.com").isReachable(timeOut);
//创建InetAddress对象
InetAddress inet=InetAddress.getByName("www.bai.com");
//域名+IP
System.out.println(inet);
//getHostName()获取域名
System.out.println(inet.getHostName());
//getHostAddress()IP
System.out.println(inet.getHostAddress());
//获取本机域称+IP
InetAddress inet1=InetAddress.getLocalHost();
System.out.println(inet1);
System.out.println(s);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
传输层协议中有两个非常重要的协议:
传输控制协议TCP(Transmission Control Protocol)
用户数据报协议UDP(User Datagram Protocol)。
TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。 IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信。
TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即物理链路层、IP层、传输层和应用层。
boolean status = InetAddress.getByName(ip地址).isReachable(timeOut); // 当返回值是true时,说明host是可用的,false则不可
通信的两端都要有Socket,是两台机器间通信的端点
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
方法 | 功能 |
---|---|
InetAddress getLocalAddress() | 返回对方Socket中的IP的InetAddress对象 |
int getLocalPort() | 返回本地Socket中的端口号 |
InetAddress getInetAddress() | 返回对方Socket中IP地址 |
int getPort() | 返回对方Socket中的端口号 |
void close() throws IOException | 关闭Socket,不可在以后的网络连接中使用,除非创建新的套接字 |
InputStream getInputStream() throws IOException | 获取与Socket相关联的字节输入流,用于从Socket中读数据。 |
OutputStream getOutputStream() throws IOException | 获取与Socket相关联的字节输出流,用于向Socket中写数据。 |
方 法 | 功 能 |
---|---|
Socket accept() throws IOException | 等待客户端的连接请求,返回与该客户端进行通信用的Socket对象 |
void setSoTimeout(int timeout) throws SocketException | 设置accept()方法等待连接的时间为timeout毫秒。若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效。 |
void close()throws IOException | 关闭监听Socket |
InetAddress getInetAddress() | 返回此服务器套接字的本地地址 |
int getLocalPort() | 返回此套接字在其上监听的端口号 |
SocketAddress getLocalSocketAddress() | 返回此套接字绑定的端点的地址 |
//创建Socket,指定ip,port
Socket socket = new Socket("127.0.0.1", 8989);
//获得键盘输入
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
//获得基于Socket的输入流和输出流
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String readline;
readline = sin.readLine();
//向服务器写数据
while (!readline.equals("exit")) {
os.println(readline);
os.flush();
readline = sin.readLine();
}
try {
ServerSocket server = null;
try {
//创建ServerSocket对象,指定端口是8989
server = new ServerSocket(8989);
System.out.println("服务器启动成功");
} catch (Exception e) {
System.out.println("服务器启动出错");
}
Socket socket = null;
try {
//调用ServerSocket的accept方法,可以接受客户端的请求
socket = server.accept();
} catch (Exception e) {
e.printStackTrace();
}
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达
。
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
1.DatagramSocket与DatagramPacket
2.建立发送端,接收端
3.建立数据包
4.调用Socket的发送、接收方法
5.关闭Socket
发送端与接收端是两个独立的运行程序
//创建DatagramSocket对象,绑定端口3456
DatagramSocket sendSocket = new DatagramSocket(3456);
//准备好要发送的数据,类型为byte[]
String string = "Hello,I come form ICSS!";
byte[] databyte = new byte[100];
databyte = string.getBytes();
//创建数据报,封装了要发送的数据,数据长度,服务器地址,以及服务器端口为5000
DatagramPacket sendPacket = new DatagramPacket(databyte,
string.length(), InetAddress.getByName("127.0.0.1"), 5000);
//使用DatagramSocket对象将数据报sendPacket发送到服务器
sendSocket.send(sendPacket);
System.out.println("发送数据:" + string);
//创建DatagramSocket对象,用来接收数据,端口为5000
DatagramSocket receiveSocket = new DatagramSocket(5000);
byte buf[] = new byte[1000];
DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);
System.out.println("startinig to receive packet");
while (true) {
//使用DatagramSocket接收数据报
receiveSocket.receive(receivePacket);
//解析数据报中的信息,获得主机名及端口、数据等
String name = receivePacket.getAddress().toString();
System.out.println("来自主机:" + name + "端口:"+ receivePacket.getPort());
String s = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("接收数据: " + s);
}
Java语言中使用数据报
(Datagram)进行基于UDP的网络编程;
数据报(Datagram)如同邮件系统,不能保证可靠的传输,而面向链接的TCP
就好比打电话,双方能肯定对方接受到了信息;
Java API中java.net包提供了DatagramSocket和DatagramPacket两个类,用来支持数据报通信
;
DatagramSocket
用于在程序之间建立传送数据报的通信连接;
DatagramPacket
则用来表示一个数据报;
用数据报方式进行网络编程时,无论客户端还是服务器端都要建立一个DatagramSocket对象,用来接收或发送数据报,
然后使用DatagramPacket类对象作为传输数据的载体;
URL(Uniform Resource Locator)
:统一资源定位符,它表示 Internet 上某一资源的地址。通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>
例如: http://192.168.1.100:8080/helloworld/index.jsp
方法 | 属性 |
---|---|
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的查询名 |
public static void main(String[] args) {
String urlAddress = "https://www.baidu.com/img/baidu_jgylogo3.gif?name=zhangsan&id=154";
URL url = null;
try {
url = new URL(urlAddress);
// 协议名
System.out.println("协议名:"+url.getProtocol());
// 主机号
System.out.println("主机号:"+url.getHost());
// 端口号
System.out.println("端口号:"+url.getPort());
// 文件路径
System.out.println("文件路径:"+url.getPath());
// 文件名
System.out.println(" 文件名:"+url.getFile());
// 文件相对位置
System.out.println("文件相对位置:"+url.getRef());
// 参数列表
System.out.println("查询名:"+url.getQuery());
} catch (MalformedURLException e) {
}
}
小结
位于网络中的计算机具有唯一的IP地址
,这样不同的主机可以互相区分。
客户端-服务器是一种最常见的网络应用程序模型。
Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress 对象表示 IP 地址,该对象里有两个字段:主机名(String) 和 IP 地址(int)。
类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。