Java基础 | NetCode

1.网络编程概述

  • 作为网络语言,java提供了对网络应用程序的支持
  • 提供了一系列网络类库java.net库,实现网络的连接
  • 通过网络协议直接或间接的实现计算机的数据交换,通讯
  • 网络编程的主要问题,如何精准定位网络上一或多台主机,或者主机上的特定的应用,确定主机后如何精准的进行数据传输。

2.通讯要素

2.1IP概述

  1. IP作为计算的唯一标识,分为IPV4和IPV6
  2. 地址又分为公网地址和私有地址
  3. 使用inetAddress类表示Ip
  4. 本机回路地址:127.0.0.1 对应名称localhost

2.2Port概述

  1. 端口号对应计算机上运行的进程,每个进程的端口号都不相同
  2. 公认端口 例如FTP为21 Telnet为23
  3. 注册端口 例如Tomcat8080 MySQL3306
  4. 动态私有端口 49152-65535
  5. 端口与IP进行组合得出网络套接字Socket

2.3网络通讯协议

  • OSI参考模型:模型过于理想化,未能在Internet进行广泛推广
  • TCP/IP参考模型:事实上的国际化标准

2.4通讯协议图

通讯协议图

2.5InetAddress类

1
2
3
4
5
6
7
8
9
10
11
//getByName中可以写IP也可以写域名
InetAddress ipadd = InetAddress.getByName("www.kinozspace.top");
System.out.println(ipadd);

//获取本机的IP地址
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);

//获取Host IP或者域名
System.out.println(ipadd.getHostAddress());
System.out.println(ipadd.getHostName());

3.传输层

  • TCP/IP协议簇
  • 传输层两个重要协议TCP和UDP
  • TCP为传输控制协议
  • IP则为网络互连协议

3.1TCP协议

  1. 使用前,需建立TCP连接,形成数据传输通道
  2. 传输前进行”三次握手”方式,点对点通讯,是可靠的
  3. 进行通讯的两个应用进程 客户端 服务端
  4. 连接中可进行大量数据传输,类似于打电话
  5. 传输完毕,需释放已建立的连接,效率低

TCP us at java

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
//一、客户端
//1.创建Socket对象 指明ip和端口号
InetAddress ids = InetAddress.getByName("192.168.10.31");
Socket socket = new Socket(ids, 8899);

//2.通过输出流发送数据
OutputStream opsm = socket.getOutputStream();
opsm.write("我是云南的,云南怒江的!".getBytes());
//3.释放流资源


//二、服务器端
//1.创建服务器端serverSocket,指明客户端端口号
ServerSocket sst = new ServerSocket(8899);
//2.接收客户端的数据
Socket sk = sst.accept();
//3.获取流输入
InputStream ism = sk.getInputStream();

//4.相当于把获取到的所有字符存放在一个数组中
ByteArrayOutputStream bais = new ByteArrayOutputStream();
byte[] buffer = new byte[20];
int len;
while ((len = ism.read(buffer)) != -1){
bais.write(buffer,0,len);
}

//5.通过toString方法把字节转换为字符串输出
System.out.println(bais.toString());
System.out.println("client ip:"+sk.getInetAddress());
//6.释放流资源

3.2UDP协议

  1. 无需建立连接,把数据源目的封装为数据包
  2. 数据包的大小限制在64kb内
  3. 发送不管对方是否准备好,接收方收到也不确定,是不可靠的
  4. 可广播发送,类似于发短信
  5. 发送数据结束时,无需释放资源,开销小,速度快
  6. UDP是无需握手的,不管对面服务器是否存在直接发送一条数据过去

UDP us at java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//一、发送端
//1.创建DSocket对象
DatagramSocket sock = new DatagramSocket();
//2.要发送的数据
String str = "发送端发送了一条信息";
byte[] bs = str.getBytes();
//3.数据封装为数据包
DatagramPacket data = new DatagramPacket(bs,bs.length, InetAddress.getLocalHost(),9090);
//4.把数据发出
sock.send(data);
//5.流的释放
sock.close();

//二、接收端
//1.确定发送端端口号
DatagramSocket socket = new DatagramSocket(9090);
//2.接收到数据
byte[] bt = new byte[100];
DatagramPacket data = new DatagramPacket(bt,0,bt.length);
socket.receive(data);
//3.数据转换为String输出
System.out.println(new String(data.getData(),0,data.getLength()));
//4.流的释放
socket.close();

4.URL类

  • 通过URL类可以实现对网络资源的获取
  • 是单线程的一种体现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1.获取资源URL
URL url = new URL("https://www.runoob.com/wp-content/uploads/2013/06/image-icon.png");
//2.进行网络的连接
HttpURLConnection ucn = (HttpURLConnection) url.openConnection();
ucn.connect();

//3.把网络资源存放在本地
InputStream IN = ucn.getInputStream();
FileOutputStream fos = new FileOutputStream("icon.png");
int len;
byte[] bt = new byte[1024];
while ((len = IN.read(bt)) != -1){
fos.write(bt,0,len);
}
//4.释放流资源
IN.close();
fos.close();

Java基础 | NetCode
http://example.com/2022/06/17/Java初级部分/SEImprove/NetCode/
Author
John Doe
Posted on
June 17, 2022
Licensed under