Python之旅Day8 socket网络编程

socket网络编程

  Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。socket服务一般分为服务端和客户端;与此同时,socket服务有基本tcp和udp的两种版本类型

 

TCP类型

  基础版socket服务

####服务端####
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
'''AF_INET:地址家族; SOCK_STREAM:TCP协议'''phone.bind(('127.0.0.1',8080))#插卡

phone.listen(5) #开机(监听)
'''listen(5):等待客户端连接的最大连接数(可自定义数值)'''conn,addr=phone.accept()#接电话(3次握手建立连接)
print('tcp的连接',conn)
print('客户端的地址',addr)data = conn.recv(1024)  #说话(收消息)
print('from client msg: %s' %data)conn.send(data.upper()) #发消息

conn.close()#挂电话
phone.close()#关手机####客户端####
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
'''AF_INET:地址家族; SOCK_STREAM:TCP协议'''client.connect(('127.0.0.1',8080))  #拨通电话

client.send('hello'.encode('utf-8'))    #客户端发消息

data = client.recv(1024)    #客户端收消息
print(data)
client.close()  #关闭

 

  循环版socket服务

####服务端####
import socket
phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
'''AF_INET:地址家族; SOCK_STREAM:TCP协议'''phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
'''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''phone.bind(('127.0.0.1',8080))#插卡

phone.listen(5) #开机(监听)
'''listen(5):等待客户端连接的最大连接数(可自定义数值)'''while True:     #链接循环conn,addr=phone.accept()#接电话(3次握手建立连接)print('client: ',addr)while True: #通讯循环try:data = conn.recv(1024)  #说话(收消息)if not data:break   #针对Linux,客户端断开链接的异常处理print('from client msg: %s' %data)conn.send(data.upper()) #发消息except Exception:   #异常捕捉breakconn.close()#挂电话

phone.close()#关手机####客户端####
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
'''AF_INET:地址家族; SOCK_STREAM:TCP协议'''client.connect(('127.0.0.1',8080))  #拨通电话while True:msg = input('>>>: ')if not msg:continueclient.send(msg.encode('utf-8'))    #客户端发消息
data = client.recv(1024)    #客户端收消息print(data)client.close()  #关闭

 

  socketserver服务(可并发的socket)

####服务端####
import socketserverclass FtpServer(socketserver.BaseRequestHandler):def handle(self):print(self.request) #connprint(self.client_address)while True:data = self.request.recv(1024)self.request.send(data.upper())if __name__ == '__main__':s = socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)s.serve_forever()   #链接循环就有了####客户端1####
# import socket
from socket import *client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:msg = input('>>: ')client.send(msg.encode('utf-8'))data = client.recv(1024)print(data)####客户端1####
# import socket
from socket import *client = socket(AF_INET,SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:msg = input('>>: ')client.send(msg.encode('utf-8'))data = client.recv(1024)print(data)"""
socketserver可以实现多并发,即一个服务端同时和多个客户端进行通信
"""

 

  远程执行

###远程执行命令-server端###
import socket
import subprocess
import struct
import jsonphone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
'''AF_INET:地址家族; SOCK_STREAM:TCP协议'''phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
'''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''phone.bind(('127.0.0.1',8080))#插卡

phone.listen(5) #开机(监听)
'''listen(5):等待客户端连接的最大连接数(可自定义数值)'''while True:     #链接循环conn,addr=phone.accept()#接电话(3次握手建立连接)print('client: ',addr)while True: #通讯循环try:cmd = conn.recv(1024)  #说话(收消息)if not cmd:break   #针对Linux,客户端断开链接的异常处理print('from client msg: %s' %cmd)res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)err = res.stderr.read()if err:back_msg = errelse:back_msg = res.stdout.read()#解决长度局限#第一阶段:制作报头head_dic = {'data_size':len(back_msg)}head_json = json.dumps(head_dic)head_bytes = head_json.encode('utf-8')'''添加解决粘包代码'''# conn.send(struct.pack('i',len(back_msg)))  #传数据的长度(有局限)#第二阶段:发送报头的长度conn.send(struct.pack('i',len(head_bytes)))# conn.send(back_msg)# 第三阶段:发报头
            conn.send(head_bytes)#第四阶段:发真实数据
            conn.sendall(back_msg)except Exception:   #异常捕捉breakconn.close()#挂电话

phone.close()#关手机###远程执行命令-client端###
import socket
import struct
import jsonclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))while True:cmd= input('>>>: ').strip()if not cmd:continueclient.send(cmd.encode('utf-8'))#解决粘包注释的改动部分(注释掉)# res=client.recv(1024)# print(res.decode('gbk'))'''通过定义传输数据文件大小来解决粘包'''# data = client.recv(4)# data_size=struct.unpack('i',data)[0]###优化:接收头的长度head = client.recv(4)head_size = struct.unpack('i',head)[0]###收报头(根据报头长度)head_bytes = client.recv(head_size)head_json = head_bytes.decode('utf-8')head_dic= json.loads(head_json)data_size = head_dic['data_size']   #取真实数据"""大数据量传输(收真实数据)"""recv_size = 0recv_bytes = b''while recv_size < data_size:res=client.recv(1024)recv_bytes+=resrecv_size+=len(res)print(recv_bytes.decode('gbk'))# res=client.recv(data_size)# print(res.decode('gbk'))

 

转载于:https://www.cnblogs.com/wuchunwei/p/7239815.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年五大虚拟现实和增强现实趋势

来源&#xff1a;AR工业应用2019年是VR/AR增长的一年&#xff0c;用户戴上VR头显就可以沉浸在计算机生成的环境中&#xff0c;VR在设计、营销、教育、培训和零售领域都有大量的需求。AR则通过屏幕或头显将计算机图像叠加到用户的真实世界视图上&#xff0c;预计2020年全球在XR技…

【实战练习】通过docker部署jenkins

jenkins官网 &#xff1a;https://jenkins.io/拉取jenkins Official Jenkins Docker image[rootip-172-31-16-58 ec2-user]# docker pull jenkins/jenkinsUsing default tag: latestlatest: Pulling from jenkins/jenkins06b22ddb1913: Pull complete336c28b408ed: Pull comp…

linux hive mysql_Linux下的Hive与Mysql安装

一&#xff0c;安装MySQLsudo apt-get install mysql-server mysql-client1). 建立数据库hive&#xff0c;create database hive;2). 创建用户hivecreate user ‘hive’’%’ identified by ‘hive’;3).创建hive用户,并授权grant all on hive.* to hive’%’ identified by ‘…

当AI实现多任务学习,它究竟能做什么?

来源&#xff1a;脑极体提到AI领域的多任务学习&#xff0c;很多人可能一下子就想到通用人工智能那里了。通俗意义上的理解&#xff0c;就像《超能陆战队》里的大白这样一种护理机器人&#xff0c;既能进行医疗诊断&#xff0c;又能读懂人的情绪&#xff0c;还能像陪伴机器人一…

mysql sql先后执行_MySQL中SQL语句执行顺序

(7) SELECT(8) DISTINCT (1) FROM (3) JOIN(2) ON (4) WHERE (5) GROUP BY (6) HAVING (9) ORDER BY (10) LIMIT 前期准备工作1、新建一个测试数据库create database testData;2、创建测试表,并插入数据如下&#xff1a;用户表订单表准备SQL逻辑查询测试语句SELECT a.user_id,C…

《自然》:欧洲根据已知基因序列合成新冠病毒,助力疫苗开发

来源&#xff1a;澎湃新闻当地时间5月4日&#xff0c;国际顶级学术期刊《自然》&#xff08;Nature&#xff09;以“加快评审文章”(Accelerated Article Preview)形式在线发表了来自瑞士、德国、俄罗斯多家科研机构的一项研究“Rapid reconstruction of SARS-CoV-2 using a sy…

转:日志组件logback的介绍及配置使用方法

转自&#xff1a;http://blog.csdn.net/zgmzyr/article/details/8267072 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块&#xff1a;logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。lo…

谷歌论文:使用深度强化学习的芯片布局

来源&#xff1a;半导体行业观察摘 要在本项目中&#xff0c;我们提出了一种基于学习的芯片布局方法&#xff0c;这是芯片设计过程中最复杂&#xff0c;最耗时的阶段之一。与以前的方法不同&#xff0c;我们的方法具有从过去的经验中学习并随着时间的推移而不断改进的能力。特别…

联动菜单实现思路

1: 选择select时,如何触发? 哪种事件? onchange2: 如何获取被选中的option的值 ? selectobj.value3: 动态生成option innerHTML <select name"add" οnchange"change()"><option value"">请选择</option><option value…

mysql中主从复制包括什么意思_Mysql主从复制作用和工作原理

一、什么是主从复制主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff0c;主数据库一般是准实时的业务数据库。在最常用的mysql数据库中&#xff0c;支持单项、异步赋值。在赋值过程中&#xff0c;一个服务器充当主服务器&am…

吴建平院士:互联网视频技术在疫情防控中的重要作用

来源&#xff1a;互联网天地杂志疫情期间&#xff0c;要关注新一代信息技术助力疫情防控这个主题。最近新的技术非常多&#xff0c;但有一项技术可能被遗忘了&#xff0c;它属于新一代信息技术系列&#xff0c;在防控疾病或生活中发挥着很重要的作用&#xff0c;那就是互联网视…

java比较炫的小程序_推荐三款私藏多年的微信小程序

【小程序】(文后有福利)酷友们&#xff0c;大家好&#xff01;今天一次性给大家介绍三款实用的微信小程序吧。这三款微信小程序基本上可以卸掉对应的 APP 了。同等功能下的 APP 和 微信小程序&#xff0c;当然会选择后者嘛&#xff0c;不仅消耗内存小&#xff0c;而且方便。1. …

2019年全球数字化转型现状研究报告

来源&#xff1a;Prophet数字化是整个企业范围内的优先战略事项我们的年度《数字化转型现状》研究迎来第五个年头&#xff0c;继续记录企业的不断发展。随着颠覆性技术及其对各大企业和市场的影响力不断加大&#xff0c;我们的研究旨在捕捉促成现代数字化转型的变化和趋势。201…

java settcpnodelay_Python Twisted TCP socket如何设置TCP的NODELAY(禁用Nagle算法)?

我有一个正在继续开发的实时多人游戏(它目前在app store:https://itunes.apple.com/us/app/blewp!-eat-or-be-eaten-mmo/id996122625?mt8)上直播&#xff0c;我使用TCP和UDP发送实时消息(TCP用于需要可靠性的消息&#xff0c;比如玩家死亡)&#xff0c;服务器端是用python编写…

magent + memcached部署过程

magent memcached架构图 安装步骤如下&#xff1a; ------------------10.1.64.196 10.1.64.197 10.1.65.104 10.1.65.107 memcached (存储节点)---------------------------------------- yum install gcc mkdir /usr/local/src/memcached cd /usr/local/src/memcached ta…

BBC神作:半导体如何改变世界

来源&#xff1a;电子工程师笔记在纪录片领域BBC一直是打遍天下无敌手的存在作为纪录片王牌制作方近期&#xff0c;BBC与FedEx联合推出了神作Made on Earth系列《The humble mineral that transformed the world》作为零差评的重要一集用叹为观止的精良画面为观众讲述了半导体常…

jmeter练习(5)关联升级版—ForEach控制器(提取多个响应结果并依次传参)

前言&#xff1a;大多数情况下&#xff0c;我们会从上一个请求的响应结果中提取某一个值&#xff0c;作为第二个请求的参数进行传参&#xff0c;但是有时候为了提高测试效率&#xff0c;尽可能制造少的测试数据&#xff0c;我们需要从上一个请求的响应结果中获取某一组相同类型…

“天才少年”曹原再次连发2篇Nature!在魔角石墨烯取得系列新进展

来源&#xff1a;青塔、中国科学技术大学新创校友基金会、纳米人5月7日&#xff0c;被誉为“天才少年”的95后博士曹原分别以第一作者兼共同通讯作者、以及共同第一作者的身份&#xff0c;在《Nature》上连发2篇论文。第一篇Nature论文中&#xff0c;研究人员致力于通过对扭转角…

linux交叉编译aix_mips-linux-gcc交叉编译工具链搭建小结【转】

这几天开始做毕业设计了&#xff0c;MPEG2解码的MIPS实现&#xff0c;代码啥的网上一大堆&#xff0c;最大的困难也许不是理解代码&#xff0c;而是搭建环境&#xff0c;也就是搭建mips-linux-gcc交叉编译的环境。网上铺天盖地的都是arm-linux-gcc工具链的教程&#xff0c;唯独…

单链表的头插法和尾插法c语言实现

/*单链表的头插法和尾插法c语言实现*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义一个链表节点的数据单元*/typedef struct student_t{ int num; char name[SIZE]; struct student_t* pNext;}studentList, *pSt…