Java教程

网络编程

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

目录
  • 一、互联网通信协议
    • 数据放在服务端和客户端的利与弊
  • 二、OSI七层协议
    • 1、物理层
    • 2、数据链路层
      • 2.1、以太网协议
      • 2.2、Mac地址
      • 2.3、广播地址
    • 3、网络层
      • 3.1、IP地址
      • 3.2、子网掩码
      • 3.3、ARP
    • 4、传输层
      • 2.1、端口
      • 2.2、TCP协议:可靠传输(可靠传输如何保证?三次握手,四次挥手)
      • 2.3、UDP协议:不可靠传输
    • 5、应用层
  • 三、Socket层
  • 四、基于Tcp的socket套接字(重点)
    • 服务端
    • 客户端

一、互联网通信协议

我们学习网络编程的目的是为了开发C/S架构或者B/S架构的软件

Client-------Server
# C/S架构,由客户端和服务端组成
数据放在服务端和客户端的利与弊
  • 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
  • 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!
Browser-------WEB Server-------Database Server
# B/S架构,
  • 统一客户端即默认安装用户电脑中的浏览器,访问同种类的网站,具体业务的处理根据相应协议和标准提供通用的服务器程序,在不同的服务器处理。

二、OSI七层协议

我们知道,一个完整的计算机系统是由硬件、操作系统、软件三者组成,一台计算机系统就可以自己跟自己玩了,如果你想和别人一起玩,那就需要用到互联网了。

什么是互联网,互联网的核心技术由一堆协议组成,这个协议叫做OSI协议,按照功能不同,分为七层,但实际上七层只是一个概念,实际上并不存在,所以有人将它划成七层,还有人将它划成五层、四层

1、物理层

物理传输,用物理设备(网线,光纤)连接,传输的是电信号,发送高低电压,高电压对应数字1,低电压对应数字0

2、数据链路层

单纯的电信号0和1没有任何意义,而数据链路层的功能介绍定义了电信号的分组方式,规定了电信号多少位一组,每组是什么意思

2.1、以太网协议

以太网协议ethernet

ethernet规定:一组电信号构成一个数据报,叫做'帧',每一数据帧分成:报头(head)和数据(data)两部分

  • head包含:(固定18个字节)

  • 发送者/源地址,6个字节

  • 接收者/目标地址,6个字节

  • 数据类型,6个字节

  • data包含:(最短46字节,最长1500字节)

  • 数据报的具体内容:head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

这就像写信,发送者的地址(源地址)就是你家的地址,接收者地址(目标地址)就是对方的收信地址,你家的路由器就相当于邮局。其实在计算机通信中的源地址和目标地址指的是Mac地址。

2.2、Mac地址

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

2.3、广播地址

有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址)

ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼,具体请百度

3、网络层

有了物理和数据链路层,其实就可以实现互联网通信啦,但是通信范围很小,大概就是一个教室,那如何扩大范围,进行跨局域网通信,这就要经过网络层,网络层实体代表:路由器。

3.1、IP地址

规定网络地址的协议,广泛采用的v4版本即ipv4,范围:0.0.0.0-255.255.255.255

ip地址分为 网络部分:标识子网,主机部分:标识主机

3.2、子网掩码

就是表示子网络特征的一个参数,用于判断任意两个IP地址是否处在同一个子网络

3.3、ARP

ip和mac的对照表

4、传输层

2.1、端口

0--65535,一个应用程序可以监听多个端口,但是一个端口只能属于一个应用程序

应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP

DNS:把网址转换成ip地址

从浏览器发送出去的数据,都是http协议,默认是80端口

2.2、TCP协议:可靠传输(可靠传输如何保证?三次握手,四次挥手)

1 tcp可靠传输:三次握手,四次挥手保证数据可靠

2 三次握手
-客户端向服务端发送链接请求 # 第一次
-服务端回复可以建立,并且带着跟客户端建立链接的数据报 # 第二次
-客户端收到后,链接建好了 # 第三次

3 这个过程后就可以可靠传输数据

4 断开链接(4四挥手)

​ -客户端告诉服务端,要断开 # 第一次

​ -服务端收到,回复ok # 第二次

​ -服务端可能还有数据在传递,暂时还没断开,需要等数据传完

​ -服务端告诉客户端,我要断了 # 第三次

​ -客户端收到,回复ok # 第四次

2.3、UDP协议:不可靠传输

现在基本用不上了,略

5、应用层

htpp协议,ftp协议,websocket协议

三、Socket层

1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关,任何语言都会有socket的封装
2 专门给开发人员用的

四、基于Tcp的socket套接字(重点)

服务端
# 导入socket模块
import socket
import time
# 第一个socket是模块名,第二个socket是类名
#类实例化得到对象,得到一个socket对象
# server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
#不写默认就是他
server=socket.socket()

# 绑定地址跟端口  ,传一个元组,监听的地址,监听的端口
server.bind(('192.168.11.28',8008))
#监听
# 半连接池是5,可以缓冲5个
server.listen(5)

#等待用户连接(看源码,有两个返回结果)
# sock是连接对象,以后这个服务端和客户端交互,使用这个对象交互
# addr是客户端地址(ip和端口)
sock,addr=server.accept()

# 接收客户端发给我的消息
data=sock.recv(1024)
# 打印
print(data)

#服务端给客户端发送消息(必须是byte格式)
sock.send(b'helloworld')
time.sleep(1)
# 关闭连接对象
sock.close()

#关闭服务
server.close()
客户端
import socket

# 创建socket对象
client=socket.socket()
# 连接服务端
client.connect(('127.0.0.1',8008))
#给服务端发了一个sb
client.send(b'sb')
# 收到了服务端给我的
data=client.recv(1024)

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