Java教程

网络编程

本文主要是介绍网络编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

网络编程

概述

  • 计算机网络

    将多台计算机通过网络通信协议连接 实现资源共享和信息传递的计算机系统

  • 网络编程的目的

    用来实现网络互连的不同计算机上 运行的程序间可以进行数据交换

网络模型

计算机网络之间以何种规则进行通信

  • OSI参考模型
  • TCP/IP协议参考模型

image-20210814180731413

  • 应用层:主要是一些终端的应用,(我们在电脑屏幕上可以看到的东西)
  • 表示层:主要是进行对接收的数据进行解释,加密与解密,压缩与解压缩,(计算机能够识别的东西转换成人能够识别的东西)
  • 会话层:通过传输层(传输端口与接收端口)建立数据传输的通路,主要在你的系统发起会话和接收会话,(设备之间需要互相认识,可以是IP,MAC或主机名)
  • 传输层:定义了一些数据的协议和端口号,如TCP和UDP
  • 网络层:主要讲从下层接收到的数据进行IP地址的封装,(发送的数据)与解封装(发送过来的数据需要查看),在这一层工作的设备是路由器,这一层的数据称之为数据包
  • 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡地址)的封装与解封装在这一层工作的设置是交换机,这一层的数据称之帧
  • 物理层:主要定义物理设备标准,如网线的接口类型,光纤的接口类 型,各种传输介质的传输速率主要作用是传输比特流,即将1和0转换为电流, 强弱来进行传输,到达目的地后再转换为1和0,即常说的 数模转换和模数转换,这一层的数据称之为比特

网络编程三要素

IP地址

IP地址用于在网络中找到计算机,网络中计算机的唯一标识

表示方法:为了方便表示IP地址,把IP地址的每一个字节上的数据换算成十进制 用.分开,称之为“点分十进制”

组成:网络号段+主机号段

分类

A类 1.0.0.1-127.255.255.254 B类 128.0.0.1-191.255.255.254 C类 192.0.0.1-223.255.255.254 D类 224.0.0.1-239.255.255.254 E类 240.0.0.1-247.255.255.254

D类和E类为保留地址,未被使用

A类:第一号段为网络号段+后三段的主机号段 一个网络号:256256256=16777216台计算机

B类:前二号段为网络号段+后二段的主机号段 一个网络号:256*256=65536台计算机

C类:前三号段为网络号段+后一段的主机号段 一个网络号:256

私有地址:10.0.0.0/8

172.16.0.0/12

192.168.0.0/16

私有地址就是在互联网上不使用,而被用在局域网上

扩展
  • DOS命令 ipconfig 查看本机IP地址 ping 后面加IP地址,测试本机与指定的IP地址间的通信是否有问题
  • 特殊的IP地址 127.0.0.1 回环地址(表示本机) X.X.X.255 广播地址 X.X.X.0 网络地址
端口

通过IP找计算机,通过端口找程序

  • 分类

    1. 物理端口:网卡口
    2. 逻辑端口:这里指逻辑端口
  • 逻辑端口

    每个网络程序都会至少有一个逻辑端口 用于表示进程的逻辑地址,不同的进程的标识不一样 即端口是一个正在运行的程序标识

  • 有效端口

    0到65535 其中0到1024系统使用或者保留端口

  • DOS窗口查询命令

    netstat -ano 查看所有的端口

    netstat -ano | findstr "端口号" 查询指定端口

    tasklist | findstr "端口号" 查询指定端口的进程

协议

即通信的规则

  • TCP(Transmission Control Protocol)传输控制协议

    建立连接,形成传输数据的通道 在连接中进行进行大量数据传输,通过三次握手完成连接 是可靠协议, 必须建立连接,效率会稍低 理解:我发给你,如果你没收到,我会重新发送 场景:打电话

  • UDP(User Datagram Protocol)用户数据报协议

    将数据源和目的地封装成数据包,不需要建立连接 每个数据包大小限制在64k 因无连接,是不可靠协议,但是速度快 理解:我发我的,不管你有没有接收到 场景:发短信,不管你有没有收到

小结:一般软件都有UDP协议和TCP协议,UDP保证速度,TCP保证可靠

Socket通信原理

Socket,即网络套接字,网络上具有唯一标识的IP地址和端口号,组合在一起才能构成唯一能识别的标识符套接字。

  • 原理机制

    通信的两段都有Socket 网络通信其实就是Socket间的通信 数据在两个Socket将通过IO流传输

TCP示例

TCP服务器端

     
xxxxxxxxxx
64         1
public class TestServerSocket {
2
public static void main(String[] args) {
3




4

ServerSocket serverSocket = null;
5
Socket socket = null;
6
InputStream inputStream = null;
7
ByteArrayOutputStream baos = null;
8




9

try {
10
//1.创建一个服务端,并声明地址
11
serverSocket = new ServerSocket(12345);
12




13

while(true){
14
//2.等待客户端连接过来
15
socket = serverSocket.accept(); //阻塞式监听,会一直等待连接
16
//3.读取客户端消息
17
inputStream = socket.getInputStream();
18




19

baos = new ByteArrayOutputStream();
20
byte[] buffer = new byte[1024];
21
int len;
22
while((len=inputStream.read(buffer)) != -1){
23
baos.write(buffer,0,len);
24
}
25
System.err.println(baos.toString());
26
}
27




28





29

} catch (IOException e) {
30




31

e.printStackTrace();
32
} finally {
33
//4.关闭连接
34
if(baos != null){
35
try {
36
baos.close();
37
} catch (IOException e) {
38
e.printStackTrace();
39
}
40
}
41
if(inputStream != null){
42
try {
43
inputStream.close();
44
} catch (IOException e) {
45
e.printStackTrace();
46
}
47
}
48
if(socket != null){
49
try {
50
socket.close();
51
} catch (IOException e) {
52
e.printStackTrace();
53
}
54
}
55
if(serverSocket != null){
56
try {
57
serverSocket.close();
58
} catch (IOException e) {
59
e.printStackTrace();
60
}
61
}
62
}
63
}
64
}
   

TCP客户端

      ​x         1
public class TestClientSocket {
2
public static void main(String[] args) {
3
Socket socket = null;
4
OutputStream outputStream = null;
5
try {
6
//创建服务器地址对象及端口号
7
socket = new Socket(InetAddress.getByName("127.0.0.1"),12345);
8
outputStream = socket.getOutputStream();
9
//发送消息
10
outputStream.write("HelloWorld".getBytes());
11
} catch (Exception e) {
12




13

e.printStackTrace();
14
} finally{
15
if(outputStream != null){
16
try {
17
outputStream.close();
18
} catch (IOException e) {
19




20

e.printStackTrace();
21
}
22
}
23
if(socket != null){
24
try {
25
socket.close();
26
} catch (IOException e) {
27
e.printStackTrace();
28
}
29
}
30
}
31
}
32
}
33







 
 


UDP示例

发送端

     
xxxxxxxxxx
15         1
public class UdpClient {
2




3

public static void main(String[] args) throws Exception {
4
//1.建立一个Socket连接
5
DatagramSocket socket = new DatagramSocket();
6
//2.准备数据
7
String msg = "HelloWorld";
8
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0 ,msg.length(),InetAddress.getByName("localhost"),12345);
9
//3.发送数据
10
socket.send(packet);
11




12

socket.close();
13
}
14
}
15







 
 


接收端

                1
public class UdpServer {
2
public static void main(String[] args) throws Exception{
3
//1.开放一个连接
4
DatagramSocket socket = new DatagramSocket(12345);
5
//2.接收数据
6
byte[] buffer = new byte[1024];
7
DatagramPacket packet = new DatagramPacket(buffer, 0 ,buffer.length);
8




9

socket.receive(packet);  //阻塞接收
10




11

System.out.println(packet.getAddress());
12
System.out.println(new String(packet.getData(),0,packet.getLength()));
13




14

socket.close();
15




16

}
17
}
   

 

这篇关于网络编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!