关于网络编程的学习笔记
(注意:只是简单介绍网络编程,真正深入学习要去学JavaWeb)
一、网络编程概述
1.1 定义
- 网络编程目的:
- 直接或间接地接通网络协议与其他计算机实现数据交换,进行通讯
- 网络编程中的两个主要问题:
- ·如何转且定位网络上一台或多台主机:定位主机上特定的应用
- 找到主机后如何可靠高效地进行数据传输
1.2 网络通信要素
- (1)通信双方地址
- ip
- 端口号
- (2)一定的规则(即:网络通信协议)
- TCP/IP参考模型:国际标准
- 应用层 — HTTP、FTP、Telnet、DNS…
- 传输层 — TCP、UDP…
- 网络层 — IP、ICMP、ARP…
- 物理+数据链路层 — Link
- TCP/IP参考模型:国际标准
1.3 IP地址和端口号
IP地址:InetAddress类
- 定义:唯一标识Internet上的计算机
- 分类:IPV4 、IPV6
- 分类2:公网地址(万维网地址)、私网地址(局域网地址)
域名:类似 www.baidu.com www.mi.com
- 域名使用方法:域名 —> DNS(解析域名) —> IP地址 —> 访问
- 本地地址:loaclhost — 127.0.0.1
端口号:标识正在计算机上运行的进程
- 分类:
- 公认端口
- 注册端口
- 动态/私有端口
- 分类:
端口号 和 IP地址 的组合得出一个网络套接字:Socket
1.4 网络通信协议
分类:TCP 、 UDP
TCP:
- (1)要先建立TCP传输数据通道
- (2)采用“三次握手”方式,点对点通信,可靠的
- (3)连接中课传输大量数据
- (4)传输完毕需要关闭连接,效率低
- (5)四次挥手关闭连接
UDP:
- (1)将数据、目的、源封装为包
- (2)每个数据大小限制在64k内
- (3)发送不管对方是否准备好,接受发收到也不确认,故不可靠
- (4)可以广播发送
- (5)发送数据结束时无需释放资源,开销小,速度快
1.5 InetAddress类
InetAddress对象表示一个主机的位置,类似于IO流中的File类
实例化:
- (1)
getByName(String host)
:设置IP地址主机 - (2)
getLocalHost()
:本地主机
- (1)
常用方法:
- (1)
getHostName()
:获取主机域名 - (2)
getHostAddress()
:获取主机IP地址
- (1)
二、TCP网络编程
- 实现TCP网络编程,需要用到Socket类、和ServerSocket类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71//客户端:放送照片
public void client() throws IOException {
//1.访问服务器地址
Socket socket = new Socket("127.0.0.1", 8899);
//2.创建输入输出流
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream("佩可莉姆.png");
//3.读取本地图片数据,并向服务器发送
byte[] bbuf = new byte[1024];
int len;
while((len = fis.read(bbuf)) != -1){
os.write(bbuf, 0, len);
}
socket.shutdownOutput();//关闭数据的输出
//read方法会使线程阻塞,不知道什么时候结束,需要手动关闭
//------------------------------------------
//4.接受服务器端返回的数据,显示到控制台上
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
char[] cbuf = new char[5];
while((len = isr.read(cbuf)) != -1){
System.out.print(new String(cbuf, 0, len));
}
//5.资源关闭
isr.close();
os.close();
socket.close();
fis.close();
//6.省略了try-catch-finally处理
}
//服务器:接受照片并保存到本地
public void server() throws IOException {
//1.创建服务器
ServerSocket serverSocket = new ServerSocket(8899);
//2.等待接受客户端的数据
Socket accept = serverSocket.accept();
//3.收到客户端的数据后,创建相应的输入输出流
InputStream is = accept.getInputStream();
FileOutputStream fos = new FileOutputStream("佩可莉姆-server.png");
//4.读取接受的数据,并写入本地文件
byte[] bbuf = new byte[1024];
int len;
while ((len = is.read(bbuf)) != -1) {
fos.write(bbuf, 0, len);
}
//-------------------------------------------
//5.向客户端进行反馈
OutputStream os = accept.getOutputStream();
os.write("照片收到啦!-- by:服务器".getBytes());
//6.资源关闭
os.close();
fos.close();
is.close();
accept.close();
serverSocket.close();
//7.省略了try-catch-finally处理
}
三、UDP网络编程
- 需要DatagramSocket类,来表示发送端/接收端
- 需要DatagramPacket对数据进行封装,发送,接受
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35//发送端
public void send() throws IOException {
DatagramSocket socket = new DatagramSocket();
//将发送数据的信息都封装在一个包上
byte[] data = "我是UDP方式发送的数据!".getBytes();
InetAddress localHost = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(data, 0, data.length, localHost, 9090);
//发送数据
socket.send(packet);
//关闭资源
socket.close();
}
//接收端
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
//创建一个包,来接受数据
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//等待接受
socket.receive(packet);
//将接受的资源打印
System.out.println(new String(packet.getData(), 0, packet.getLength()));
//关闭资源
socket.close();
}
四、URL网络编程
- URL(Uniform Resoursce Locator):统一资源定位符
- URL结构:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
- URL实例化:
URL url = new URL(String url);
- URL常用方法:
pulic String getProtocol()
:获取该URL的协议名public String getHost()
:获取该URL的主机名public String getPort()
:获取该URL的端口号public String getPath()
:获取给URL的文件路径public String getFIle()
:获取该URL的文件名public String getQuery()
:获取该URL的查询名
1 |
|