套接字python2和python3不同

编写web应用服务器报,TypeError: a bytes-like object is required, not ‘str’错误。
因为python2和python3的版本有些差异,而python3最重要的新特性也是对文本和二进制数据做了更清晰的区分。

文本用unicode编码,为str类型,二进制数据则为bytes类型

python2的例子

import socket,sys 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.madapapa.com',80))
#code=str.encode('GET /api.json HTTP/1.0\r\n\r\n')
#s.send(code)
s.send('GET /api.json HTTP/1.0\r\n\r\n')

while 1:
    buf = s.recv(1000)
    if not buf:
        break
    sys.stdout.write(buf)

s.close()

在python2的环境下运行,执行结果如下
Screen Shot 2021-11-14 at 2.45.47 PM

python3的例子

import socket,sys 

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.madapapa.com',80))
#s.send(str.encode('GET /api.json HTTP/1.0\r\n\r\n'))
s.send('GET /api.json HTTP/1.0\r\n\r\n'.encode())


while 1:
    buf = s.recv(1000).decode()
    #s1 = buf.decode()
    if not buf:
        break
    sys.stdout.write(buf)

s.close()

在默认环境下运行(python3),执行结果如下

附录

套接字

套接字是一套用C语言写成的应用程序开发库,它首先是一个库。主要作用就是实现进程间通信和网络编程,因此在网络应用开发中被广泛使用。

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

在Python中可以基于套接字来使用传输层提供的传输服务,并以此进行开发网络应用。实际开发中使用的套接字可以分为三类:流套接字(TCP套接字)、数据报套接字和原始套接字。

流式套接字

流式套接字(SOCK-STREAM)。它提供了一种可靠的、可以进行双向连接的数据传输服务。其实现了数据无差错、无重复的发送。流式套接字自身便内设了流量控制功能。在TCP/IP协议簇中,使用TCP协议来实现字节流的传输,当用户想要发送大批量的数据或者对数据传输有较高的要求时,可以使用流式套接字。

数据报套接字

数据报套接字(SOCK-DGRAM)。它提供了一种不可靠的双向数据传输服务。数据包以独立的形式被发送,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端按发送顺序接收数据。在TCP/IP协议簇中,使用UDP协议来实现数据报套接字。在出现差错的可能性较小或允许部分传输出错的应用场合,可以使用数据报套接字进行数据传输,这样通信的效率较高。

原始套接字

原始套接字(SOCK-RAW)。该套接字允许对较低层协议(如IP或ICMP)进行直接访问,常用于网络协议分析,检验新的网络协议实现,也可用于测试新配置或安装的网络设备。

上述就是套接字的大体知识,对套接字有了一定的了解,我们就可以步入正题了。

TCP套接字

TCP套接字就是上面所说的流式套接字,可以使用TCP协议提供的传输服务来实现网络通信的编程接口。

在Python中可以通过创建socket对象并指定type属性为SOCK_STREAM来使用TCP套接字。

由于一台主机可能拥有多个IP地址,所以作为服务器端的程序,需要在创建套接字对象后将其绑定到指定的IP地址和端口上。

这个端口是指对IP地址的扩展,用于区分不同的服务。

不同的服务通常与相对的端口所绑定。

当服务器收到用户请求时就可以根据端口号来确定到底用户请求的是何种服务。

关于服务于端口的绑定类型,我们会在之后的开发的当中具体描述。

如何用Python设置一个客户端的功能,简易代码如下:

fromsocketimportsocket

def main():

1.创建套接字对象默认使用IPv4和TCP协议

client= socket()

2.连接到服务器 ,指定IP地址和端口

client.connect((‘192.168.1.8’, 1080))

3.从服务器接收数据

print(client.recv(1024).decode(‘utf-8’))

client.close()

if__name__ == ‘main‘:

main()

上述代码就实现了客户端的功能,它可以与服务器进行通信。当然,上述代码只能作为一个最简单的客户端构建方式。更复杂的构建方式,学记将在之后的学习中为大家继续介绍。

一个小小的API测试

在根目录下,编辑一个测试用的api小文件,然后通过浏览器(safari和chrome,地址为本地电脑地址)、终端curl(分别从vps和本地进行)的方式获取该文件。

vi /var/log/nginx/access.log

来查看刚才的api文档的获取记录

139.XXXXX - - [13/Nov/2021:14:34:22 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "curl/7.68.0"(VPS方式)
223.XXXXX - - [13/Nov/2021:14:35:19 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "curl/7.77.0"(本机方式)
223.XXXXX - - [13/Nov/2021:14:36:28 +0800] "GET /api.json HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"(本机方式)
223.XXXXX - - [13/Nov/2021:14:36:28 +0800] "GET /favicon.ico HTTP/1.1" 404 188 "http://madapapa.com/api.json" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"(本机方式)

下面是刚刚发布了这篇blog后的日志变化情况,可以看到从本机进行了post操作

223.XXXXX - - [13/Nov/2021:14:59:24 +0800] "POST /wordpress/xmlrpc.php HTTP/1.1" 200 3493 "-" "MWeb%20Pro/917 CFNetwork/1325.0.1 Darwin/21.1.0"

CentOS7 与 Ubantu20 默认首页的不同

CentOS7-banwagong

首先,nginx -t发现正确配置文件地址

 [11:10]/nginx -t    
nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后vi nginx.conf,发现根目录为 /usr/share/nginx/html,编辑index.html即可

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
server {
 listen       80;
 root   /usr/share/nginx/html;
 server_name  localhost;
 #charset koi8-r;
 #access_log  /var/log/nginx/log/host.access.log  main;
 #
 location / {
      index index.php index.html index.htm;

Ubuntu20-aliyun

前序操作和centos相仿,在nginx.conf下没有index.html内容,需要对sites-available下default进行编辑

/etc/nginx/sites-available
 # vi default
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

ubuntu nginx配置参考

跳绳

周三重新开始跳绳,基本解决了绳子绊脚的问题,诀窍是低头,弯腰,放松,这些方法也是一位少时老友,我称他为“跳绳届的仁波切”,传授与我。

公司在中午很仁慈,11:30-13:00,一个半小时包含进食和午睡,我不喜欢在这里午睡,这里没有行军床,也不会集体关灯。在老东家,有专人负责关灯、拔电话线,中午时分,南山区那座几万人的研发总部大楼,准时进入老僧入定状态,每次去深圳出差,都有种进入新生儿产房的错觉,静谧,甜美,轻微的鼾声此起彼伏。

不午睡的时候,我在三楼健身房,主要是力量训练,半年下来,体重反而增加了,教练说你缺少有氧运动,无法有效减脂。

时间紧迫,我选择有氧效率最高的跳绳运动,一方面有仁波切的远程指导,还有个原因是我从来没有好好跳过绳。从小我没有连续跳够100个,即使曾经百米12秒99时,也无法突破100个;能用脚踢落头顶的树叶时,也无法突破100个,我想,现在是时候突破了。

我用马达妈妈的小红书,关注几个跳绳美女,看她们打卡,一般都是每次跳2000个、3000个,看了一个月后,信心倍增,发现自己跳不好的问题根源,是绳子不好。

换了一根能自锁、含一体化精钢滚珠轴承、带铝合金高强度手柄的钢丝跳绳后,我觉得进入了新天地。技术也突飞猛进,在公司用普通跳绳也能突破100个。

周三就是这样,会议间隙,人困马乏,是跳绳的好时机,非常顺利,很快500个的目标也达成了。

周三晚上做了一个噩梦。

周四起床,发现右脚不能落地,钻心的痛。犹豫要不要开车,很快就放弃了,加油刹车都靠它。在地铁站,在匆匆忙忙的日常打工人群中,缓慢移动,心安理得。

周四晚上做了一个噩梦。

周五一早去武汉,在出发机场,在匆匆忙忙的高端打工人群中,依然缓慢移动,感觉自己像一条鲸鱼,与众不同。客户见面问我怎么了,我说跳绳扭了脚,大家哈哈大笑。

周五晚上,疼痛开始变得有脉动感,即使没有按压也会痛,干扰睡眠,没有睡好。急匆匆预约了医院的骨科,准备周六下午去检查。

周六去天河机场,滴滴司机很健谈,去年疫情期间,她是第一个承担救助任务的女司机,当时国家补贴600元一天,滴滴追加200,40天赚了3万2。加入志愿者时,她们并不知道有补贴,三天后才看到账户有到账,当司机群里说志愿者为了钱,她们很生气,按照她的原话,这些大老爷们xxx。我问她最近的电视、电影,有抗疫的内容,她看了吗。她回答不敢去看,怕自己受不了,因为封禁快结束时,她送一位老人紧急去医院,当时武汉已经开始堵车,她打了双闪,按喇叭,前面的车纷纷向两边避让,这辆挂了抗疫红牌通行证的滴滴快车,在武汉拥挤的街道上,开出了高速路的感觉。她说当时自己穿着防护服,眼泪都流了出来。

不过,她马上又补充,现在堵车,别说按喇叭,喊破喉咙也莫得人让你撒。

很快,天河机场到了,我在滴滴app上默默为这位巾帼英雄,把所有的点赞评价都赞了一次,可惜只能赞一次。

下午的骨科大夫很酷,我自诉:跳绳后,第二天脚痛,大脚趾无法落地,晚上会有持续、规律的悸痛,他说你别跳绳了,你腰椎不好,你这里不是做过CT吗,4和5突出。现在发炎了,你要么打针,要么吃药。打针要两周,吃药更久一点。我说吃药吧,不耽误事,但是不要中药。中成药也不要吗,也不要,我强调。我看到医生开始按删除键,很使劲的按,他精心为我准备的中药被删除了。医生依然面无表情,看着屏幕。那么,大夫,我还做噩梦,和这个椎间盘有关系吗,医生看着屏幕,不说话,万物静默如迷,好像置身新生儿产房。

回家,翻看《全科医学》,发现脚痛是个symbol,年龄越大,这种symbol会变多,对我来说,就是不能跳绳了,年少的梦破碎了。

所以,我打算找些新的事情,哪怕从来没有被梦到过,比如,弹钢琴。

PS:脚痛的原因,虽然医生没有耐心告知,但是这么低的诊疗费,他也给出了令人信服的判断,我还是感谢他。目前我推断的root cause是这样,腰椎间盘,实际是类似果冻一样的组织。它可以帮助腰椎骨这样的刚体互相灵活动作,但是随着年龄增长,加之不良生活习惯,比如久坐、长时间玩手机等,造成果冻老化,机能退化。典型的就是果冻突出,压迫了椎管里部分的神经,这部分神经向下发散,也就是马尾神经,分布到大腿、小腿和足部,造成各种不适。

好消息是,伤筋动骨一百天,那是针对真的扭伤,而腰椎间盘突出造成的不适,几周就能恢复;坏消息是,椎间盘突出不可逆,永远不会根治。

还有,既然是果冻,在强烈的压迫下,会破裂释放液体,造成椎管内神经发炎,向下造成脚痛,向上影响脑神经,晚上的噩梦就很自然了。

奥运精神

几年前,我安排小李加入一个社团,社团名称很有古意,叫做“青林馆” 。

青林馆的主要活动是剑道,社员不分老幼,不论种族,偶有国际友人造访,时不时还举办迎新活动。小李第一杯免费奶茶,就是迎新时享受到的。

不过平时社团活动,是非常严肃,社员更衣后,不分老幼、不论种族、男女平等,一言不发就拔剑互殴 。

互殴之后,社团团长会组织大家团团坐,面向东方先行大礼,之后便是团长solo聊天,此刻社员也不得放松,尿意盎然也必须憋着,喝水则更是不被允许。

除了互殴,稽古也是非常重要的部分,有时候还会有静止动作练习,毕竟“学会忍耐,就能控制自己的心-某剑道名人名言”

小李学业负担较重,暑假期间也是日理万机,奔波在B站和Xbox之间,在剑道社团的表现一直比较佛系。这几天东京奥运盛会,我们全家也深受鼓舞,热烈的气氛感染了小李,击剑金牌得主孙一文的一剑封喉,更让小李跃跃欲试,大有王侯将相吾大丈夫可取而代之的豪情霸气。

也许奥运精神真的激励小李,周日剑道活动结束后,社团团长发来贺电,要求为小李加鸡腿。

从青林馆离开,我采访小李有啥感想,小李淡淡的说,我动作标准吧,好像夸了夸我。。。

适逢东京奥运,以兹留念。

对事与对人

我们常说,“这次是对事不对人啊” 。但最终结果往往演变为对人采取行动,或者由具体的人来承担后果。

我看这个问题,类似炒股票。短期看每一支股票的涨跌,似乎都是有不确定的因素影响着,例如昨天互联网股票大跌,很大程度是滴滴安全事件造成的。这就是典型黑天鹅本身。

而长期来看一支股票,它的内在价值,又是相对确定的。例如腾讯、阿里。

所以,发生一件具体的事情,从各方反馈、搜集的信息,会有意无意忽略各种细节,加上时空因素,人的因素,不确定性就很高了。

而具体到一个人,则脾气秉性,自我定位相对稳定。如果又是一个执拗不肯听劝的人,有时候只能远离了。

树挪死,人挪活,核心就是说自我定位。自我定位过高,就会时不时陡生怨气;定位过于狭窄,则被他人看作畏难退缩,站位不高。

我是老员工,我是老专家,我是甲方,都是自己给自己扣帽子,上枷锁的行为。

自我定位不准,是负面情绪产生的根源。

不过,企业组织内为了利益,发生对抗是可以理解的,不过被情绪驱动,就不是一个leader要做的事情。

四季印象

傍晚送马达去康桥。

在电梯里聊到四季的不同,我问他喜欢哪一个季节?马达排序是夏天、秋天、冬天、春天。春天在最后因为没有什么景色。

马达补充到,夏天傍晚最好,秋天是早晚,冬天是中午。

产品团队如何降低经营风险

面对纷杂的市场需求,当我们无法快速做决定时,如何规避风险(因为我们的时间、资源都是有限的,机会成本!!!):

定制化项目开发:

缺乏充分市场调研,团队无法确定市场潜力、市场增长率,不了解竞争环境(至少2家竞争对手),通过获得中标、课题或签订合同(采购、委托开发)等方式来降低经营风险;

产品开发:

充分的市场调研(规模、增长、客户是否可达、是否符合公司战略)
充分的需求($APPEALS)
进入三要素(市场是否有吸引力、我是否能赢、财务ROI是否满足要求)
通过以上评估过程,降低产品经营的风险。

技术开发:

通过技术标准制定、专利保护、技术方向引导等方式,规避大规模长期技术开发投入的风险

器件和部件:

通过委外开发或外部采购方式,规避自研风险