网络编程 01:传输模型和套接字

一.网络编程概述

1.计算机网络

将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件级网络通信协议的管理和协调,实现资源共享和信息传递的计算机系统。

2.网络编程

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

二.网络模型

1.概述:计算机网络之间以何种规则进行通信

2.OSI (open Syste lnterconnection)开发系统互连参考模型

(1)应用层

电脑屏幕上看到的东西——产生数据

(2)表示层

数据处理,加密与解密,压缩与解压缩,编码

(3)会话层

通过传输层建立数据传输的通路,发起会话和接收会话,在传输的过程中维持会话

(4)传输层

数据连接与传输,用一个寻址机制标识一个特定的应用程序(端口)

(5)网络层

基于网络地址(IP 地址)进行不同网络系统间的路径选择

(6)数据连接层
数据进行 MAC 地址(网卡地址)封装与解封装,使用接收系统的硬件地址或物理地址来寻址,承上启下

(7)物理层

物理设备:光纤,同轴电缆,双绞线,网卡,中断器,集线器等

3.TCP/IP 参考模型

(1)应用层(是 OSI 的应用层,表示层,会话层合并)

终端设备:Telnet,FTP,SMTP,DNS,HTTP

http : 超文本传输协议,web 服务器之间传输数据的协议

ftp : 文件传输协议

smtp : 简单邮件传输协议

pop : 邮件协议

Telnet : 远程登录协议

DNS : 域名系统,域名与 IP 地址之间的转换—— ip地址的名字

(2)传输层

终端设备 :

TCP:

通过三次握手协议建立稳定连接(类似于打电话)

应用数据分割成最合适的数据块发送

链接可靠,不易出现乱序、丢失等现象

连接和检验等都需要花不少时间,效率因此会降低

UDP:

一次性发送所有数据,无需建立连接(类似于发短信)

服务器可以同时发送给多个客户机

没有检验,容易会出现信息丢失

消耗资源小,处理速度快

(3)网络层

终端设备:

IP :网络中计算机的唯一标识,计算机只能识别二进制的数据,所有我们的 IP 地址应该是一个二进制的数据( ipv4:长度为32位,分为四段,每段八位,以点隔开,十进制标识。 ipv6:长度是 ipv4的四倍,以16进制标识,分为八段,每段以冒号隔开)

1.IP 地址的组成由网络号段和主机号段构成

2.特殊地址:

127.0.0.1 回环地址,标识本机
0.0.0.0 任意地址

3.DOS 命令:

ipconfig 查看 ip 地址
ping IP 地址——测试本机与指定 ip 地址之间的通信是否有问题

(4)数据连接层(是 OSI 的数据连接层,物理层合并)

三.网络协议

双方都要遵守相同的协议,才能正确的交流信息

四.端口

软件的身份证,标识符。用于区别一台不同的软件,网络服务器。

五.创建套接字

1.首先导入 socket 模块

import socket

2.为这一属性命名

server = socket.socket

3.查看属性
在这里插入图片描述
(1) 表示属性
在这里插入图片描述
(2)表示套接字ID
在这里插入图片描述
(3)表示 ipv4(AF_INET6,则表示 ipv6)

在这里插入图片描述
(4)表示 TCP( DGRAM 表示 UDP)
在这里插入图片描述
(5)表示 protocol 协议,通常是 0 tcp/ip 协议簇
在这里插入图片描述
(6)表示绑定服务器的 IP 地址(但这个没有绑定)
在这里插入图片描述

六.网络编程

1.服务端

(1)导包

import socket

(2)创建socket套接字

server = socket.socket()

(3)绑定 IP 地址和端口

server.bind(('127.0.0.1',8989))

(4)设置最大监听数量

server.listen(10)

(5)创建连接通道,获取对等连接套接字

conn,addr = server.accept()

在这里插入图片描述
在这里插入图片描述
2.客户端

(1)导包

import socket

(2)创建 socket 套接字

client = socket.socket()

(3)连接服务端

client.connect(('127.0.0.1',8989))

(4)发送数据( 需要是二进制数据(字节数据))

client.send(b'hello')

(5)接收数据(1024表示字节,可随意设置但不要小于一个字母的字节)

client.recv(1024)
>>> import socket
>>> client = socket.socket()
>>> client.connect(('127.0.0.1',8989))
>>> client.send(b'hello')
5
>>> client.recv(1024)
b'ok'

3.阻塞

当客户端没有连接,或者发送数据的时候,服务端执行 accept 和 recv 都会产生阻塞

附(今日学习):
在这里插入图片描述
服务端:

import socket

server = socket.socket() # 得到服务端套接字
server.bind(('127.0.0.1',8989)) # 绑定IP和端口
server.listen(10) # 最大监听数

conn,addr = server.accept() # conn,对等连接套接字,addr 客户端信息
print(str(conn.recv(1024),encoding='utf8')) # 1024指的是最大接收字节数
conn.send(b'ok')

conn.close()  # 断开对等连接套接字
server.close()  #断开服务器

客户端:

import socket

client = socket.socket()
client.connect(('127.0.0.1',8989))

info = input('请输入你要发送的数据:')
client.send(bytes(info,encoding='utf8')) #bytes(info,encoding='utf8' 将字符串转为字节
print(client.recv(1024))

client.close() #端口客户端
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南风和云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值