赞
踩
IP
唯一
的编号IP地址分类方式一
IPv4
:是一个32位的二进制数,通常被分为4个字节a.b.c.d
的形式,以点分十进制
表示,例如192.168.65.100
2011年初已经用尽
IPv6
:为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,共16个字节ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
IP地址分类方式二
DNS
,Domain Name System,域名系统)负责将域名转化成IP地址
简单理解:
IP地址
可以唯一标识网络中的设备
,那么端口号
就可以唯一标识设备中的进程
(应用程序)端口号
:用两个字节表示的整数,它的取值范围是0~65535
网络通信协议
:在计算机网络中,这些连接和通信的规则
被称为网络通信协议
TCP/IP协议中的四层介绍:
应用层
:应用层决定了向用户提供应用服务时通信的活动。主要协议有:HTTP协议、FTP协议、SNMP(简单网络管理协议)、SMTP(简单邮件传输协议)和POP3(Post Office Protocol 3的简称,即邮局协议的第3个版)等传输层
:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。TCP(Transmission Control Protocol)协议,即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务网络层
:网络层是整个TCP/IP协议的核心,支持网间互连的数据通信。它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。而IP协议是一种非常重要的协议。IP(internet protocal)又称为互联网协议。IP的责任就是把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求物理+数据链路层
:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动java.net
包中提供了两种常见的网络协议的支持:
建立TCP连接
,形成基于字节流的传输数据通道可靠的
重发机制
,当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体确认信息大数据量的传输
释放已建立的连接,效率低
不需要建立连接
不可靠的
64K
内无需释放资源,开销小,通信效率高
三次交互
,以保证连接的可靠
客户端请求连接
)服务端收到
)客户端知道服务端收到了
)客户端请求关闭
)服务端收到
)服务端请求关闭
)客户端收到
)public class TestInetAddress {
public static void main(String[] args) throws Exception {
//1. 获取本机的InetAddress 对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//DESKTOP-S4MP84S/192.168.12.1
//2. 根据指定主机名 获取 InetAddress对象
InetAddress host1 = InetAddress.getByName("DESKTOP-S4MP84S");
System.out.println("host1=" + host1);//DESKTOP-S4MP84S/192.168.12.1
//3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println("host2=" + host2);//www.baidu.com / 110.242.68.4
//4. 通过 InetAddress 对象,获取对应的地址
String hostAddress = host2.getHostAddress();//IP 110.242.68.4
System.out.println("host2 对应的ip = " + hostAddress);//110.242.68.4
//5. 通过 InetAddress 对象,获取对应的主机名/或者的域名
String hostName = host2.getHostName();
System.out.println("host2对应的主机名/域名=" + hostName); // www.baidu.com
}
}
IP地址
和端口号
组合在一起构成唯一能识别的标识符套接字(Socket
)IO
传输TCP
提供可依赖的字节流服务UDP
提供“尽力而为”的数据报服务通信模型
开发步骤
服务端:
ServerSocket(int port)
:创建一个服务器端套接字ServerSocket,并绑定到指定端口上。用于监听客户端的请求accept()
方法:监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象Socket客户端:
Socket(InetAddress address, int port)
:根据指定服务端的IP地址
和端口号
构造Socket类对象
例子:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端
服务端:
多个Socket
[多个客户端连接服务器的并发]阻塞
, 等待连接@Test
public void server() throws IOException {
// 1. 创建ServerSocket
int port = 9090;
ServerSocket serverSocket = new ServerSocket(port);
// 2. 接收来自于客户端的socket:accept()
Socket socket = serverSocket.accept();
// 3. 通过Socket获取一个输入流
InputStream is = socket.getInputStream();
// 4. 创建File类的实例、FileOutputStream的实例
File file = new File("pic_copy2.jpg");
FileOutputStream fos = new FileOutputStream(file);
// 5. 读写过程
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("数据接收完毕");
// 6. 服务端发送数据给客户端
OutputStream os = socket.getOutputStream();
os.write("你的图片很漂亮,我接收到了".getBytes());
// 7. 关闭相关的Socket和流
os.close();
fos.close();
is.close();
socket.close();
serverSocket.close();
}
客户端:
socket.shutdownOutput()
:客户端表明不再继续发送数据,否则对方读操作会一直处于阻塞状态@Test
public void client() throws IOException {
// 1. 创建Socket
// 指明对方(即为服务器端)的ip地址和端口号
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9090;
Socket socket = new Socket(inetAddress, port);
// 2. 创建File的实例、FileInputStream的实例
File file = new File("pic.jpg");
FileInputStream fis = new FileInputStream(file);
// 3. 通过Socket,获取输出流
OutputStream os = socket.getOutputStream();
// 4. 读写数据
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
System.out.println("数据发送完毕");
// 客户端表明不再继续发送数据,否则对方读操作会一直处于阻塞状态
socket.shutdownOutput();
// 5. 接收来着于服务器端的数据
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer1 = new byte[5];
int len1;
while ((len1 = is.read(buffer1)) != -1) {
baos.write(buffer1, 0, len1);
}
System.out.println(baos.toString());
// 6. 关闭Socket和相关的流
baos.close();
is.close();
os.close();
fis.close();
socket.close();
}
通信模型
开发步骤
发送端:
接收端:
例子:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端
发送端:
@Test
public void sender() throws Exception {
// 1. 创建DatagramSocket的实例
DatagramSocket ds = new DatagramSocket();
// 2. 将数据、目的地的ip,目的地的端口号都封装在DatagramPacket数据报中
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 9090;
byte[] bytes = "我是发送端".getBytes(StandardCharsets.UTF_8);
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, inetAddress, port);
// 发送数据
ds.send(packet);
ds.close();
}
接收端:
@Test
public void receiver() throws IOException {
// 1. 创建DatagramSocket的实例
int port = 9090;
DatagramSocket ds = new DatagramSocket(port);
// 2. 创建数据报的对象,用于接收发送端发送过来的数据
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
// 3. 接收数据
ds.receive(packet);
// 4.获取数据,并打印到控制台上
String str = new String(packet.getData(), 0, packet.getLength());
System.out.println(str);
ds.close();
}
资源的地址
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
public final InputStream openStream()
:读取资源的数据@Test
public void test1() throws MalformedURLException {
URL url = new URL("http://localhost:8080/examples/myTest.txt");
System.out.println("协议 :" + url.getProtocol());
System.out.println("ip地址 :" + url.getHost());
System.out.println("端口 :" + url.getPort());
System.out.println("文件路径 :" + url.getPath());
System.out.println("文件名 :" + url.getFile());
// 拷贝文件到指定目录
InputStream inputStream = url.openStream();
IOUtils.copy(inputStream, new FileOutputStream("/Users/xuchang/Documents/test.txt"));
}
输出结果:
协议 :http
ip地址 :localhost
端口 :8080
文件路径 :/examples/myTest.txt
文件名 :/examples/myTest.txt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。