计算机网络
将多台计算机通过网络通信协议连接 实现资源共享和信息传递的计算机系统
网络编程的目的
用来实现网络互连的不同计算机上 运行的程序间可以进行
数据交换
计算机网络之间以何种规则进行通信
- OSI参考模型
- TCP/IP协议参考模型
应用层
:主要是一些终端的应用,(我们在电脑屏幕上可以看到的东西)表示层
:主要是进行对接收的数据进行解释,加密与解密,压缩与解压缩,(计算机能够识别的东西转换成人能够识别的东西)会话层
:通过传输层(传输端口与接收端口)建立数据传输的通路,主要在你的系统发起会话和接收会话,(设备之间需要互相认识,可以是IP,MAC或主机名)传输层
:定义了一些数据的协议和端口号,如TCP和UDP网络层
:主要讲从下层接收到的数据进行IP地址的封装,(发送的数据)与解封装(发送过来的数据需要查看),在这一层工作的设备是路由器,这一层的数据称之为数据包数据链路层
:主要将从物理层接收的数据进行MAC地址(网卡地址)的封装与解封装在这一层工作的设置是交换机,这一层的数据称之帧物理层
:主要定义物理设备标准,如网线的接口类型,光纤的接口类 型,各种传输介质的传输速率主要作用是传输比特流,即将1和0转换为电流, 强弱来进行传输,到达目的地后再转换为1和0,即常说的 数模转换和模数转换,这一层的数据称之为比特
IP地址用于在网络中
找到计算机
,网络中计算机的唯一标识
表示方法
:为了方便表示IP地址,把IP地址的每一个字节上的数据换算成十进制 用.分开,称之为“点分十进制”
组成
:网络号段+主机号段
A类
1.0.0.1-127.255.255.254B类
128.0.0.1-191.255.255.254C类
192.0.0.1-223.255.255.254D类
224.0.0.1-239.255.255.254E类
240.0.0.1-247.255.255.254D类和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找计算机,通过端口找程序
分类
- 物理端口:网卡口
- 逻辑端口:这里指逻辑端口
逻辑端口
每个网络程序都会至少有一个逻辑端口 用于表示进程的逻辑地址,不同的进程的标识不一样 即端口是一个正在运行的程序标识
有效端口
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,即网络套接字,网络上具有唯一标识的IP地址和端口号,组合在一起才能构成唯一能识别的标识符套接字。
原理机制
通信的两段都有Socket 网络通信其实就是Socket间的通信 数据在两个Socket将通过IO流传输
TCP服务器端
xxxxxxxxxx64 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
}
x 1TCP客户端
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
发送端
xxxxxxxxxx15 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
}