你在CNKI里面去搜一下这篇文章,原文我没有留,译文留了里面的图表自己补Gas chromatographic-mass spectrometric characterization of some fatty acids from white 和 interior spruce(云杉种子脂肪酸的GC-MS分析)译文出处:D.-J. Carrier et al./J. Chromatogr. A715 (1995)317-324外文译文正文:摘要:本文主要是研究测定云杉种子中脂肪酸的成分。一是通过气相色谱分析种子油中获得的脂肪酸甲酯化衍生物。云杉脂肪酸甲酯化衍生物的洗脱时间不受有效标样类别的影响。二是将提取物二乙氨化,并通过气相色谱-质谱进行分析。由所得图谱分析确定样品中含有cis-ll-18:l,cis-5,cis-9-18:2和 和 cis-5,cis-9,cis-12-18:3等脂肪酸。1 引言内陆云杉(Picea glauca engelmannii Complex)是白云杉(Picea glauca) 和恩格尔曼(Picea engelrnannii) 在它们重叠地带的自然杂交品种。它是一种重要的经济作物,在英国的哥伦比亚每年有8千万株的种植量。本文研究的目的是通过胚离体培养的克隆繁殖系统来改进优化云杉的生产。人工种子的生产是研究目的之一,涉及到人工胚乳(幼苗发芽储存物质)的形成。本文的研究旨在为发展人工胚乳,更好的了解云杉幼苗发育的营养需要提供有用的基础数据。云杉种子中含有约30%的脂类物质[1]。和其它裸子植物一样,高脂质含量表明脂类代谢是幼苗获得自养能力前的重要营养供给 [2]。本文测定内陆云杉种子的脂类及其组成。据调查,目前还没有关于云杉种子脂肪酸研究的报道。在前期研究中,用气相色谱法(GC)分析内陆云杉种子脂肪酸的甲酯化产物,但是其中丰度第二的脂肪酸甲酯化产物很难由现有的标准图谱进行确定。这些洗脱峰存在于cis-9,cis-12-18:2和cis-9,cis-12,cis-15-18:3的脂肪酸甲酯衍生物之间。初始GC-MS测定显示分子离子峰与18:3甲酯衍生物相匹配。前人有关白云杉脂肪酸含量的研究中,丰度第二的成分是5,9-18:2。为明确和完善云杉种子脂肪酸成分研究,本文对内陆白云杉种子大量脂肪酸进行测定。通过GC-MS测定不饱和脂肪族的许多方法是可行的。与丙酮、硼酸反应后,接着与临位二元醇作用是确定不饱和双键的常用方法,硅烷基化及甲酯化也是惯常方法[3]。质谱数据结果能提供丰富的资料,但是锇的四氧化物反应过程中存在着潜在危险。研究发现,氢化作用后进行环氧化也能确定不饱和双键的位置[3],虽然这是一个不错的方法,但两步衍化十分耗时。另一种确定双键位置的方法是在羧基端加入一稳定基团,例如掺入形成酰胺基[4],双键数可能会在形成质谱图谱时减少。吡咯烷一般作为质谱洗脱脂肪酸识别酰胺的物质[3]。然而,对于未知脂肪酸成分是否含有羟基、环氧基及其他保守基团,二乙胺化是有效的方法[4]。该方法优点是较其他方法容易获得衍生物及进行质谱分析,现已成功应用于对欧洲云杉脂肪酸双键位置的确定[5]。本文报道内陆白云杉种子的总脂类中脂肪酸的含量及种类。脂类提取然后一部分甲酯化,再进行GC分析;另一部分则二乙胺化,并进一步进行GC-MS测定。2 实验部分2 1 化学药品化学药品均达到试剂级别。氯化氢甲醇购买于Supelco Canada Oakville, (Ont., Canada),二乙胺及冰醋酸分别购于Aldrich(Milwaukee, WI, USA)和Fisher Scientific(Nepean, Ont., Canada)。白云杉和及青冈云杉种子分别由Prairie Farm Rehabilitation Administration(Indian Head, Sask., Canada)和British Columbia Research (Vancouver,BC,Canada)提供。十七碳脂肪酸及其他脂肪酸甲酯化物标品购于Nu-Chek-Prep (Elysian, MN,USA)。2.2 方法初始甲酯化研究根据成熟的方案[6-8]提取内陆云杉种子并进行甲醇反应。十七碳脂肪酸作为内参标品。如前所述对脂肪酸甲酯进行分析[8]。GC-MSGC-MS分析均用Fison 8000型GC-MS仪(Fisons Instruments,Manchester, UK),具60m×0.32mm ID.DB-23 熔融石英毛细管柱(J&W Scientific, Folsom, CA, USA)和与Fison Tri2000质谱四极杆相接的接口。所有样品以逐一注入的模式注入。最初柱温70℃,然后以20℃/min升至180℃,接着以每秒4℃/min升至240℃。GC接口及物料保持在250℃。每1.1s以70eV的电子能量从50-510的质量范围重复检测。总脂类提取和二乙氨衍生化作用100mg种子提取中加入1.5ml异丙醇,用TP型匀浆器(Janke & Kunkel, Germany)以最大速度均质3min;密封并沸水浴5min;冷却后加入0.75ml CH2Cl2,室温放置30min,间断漩涡振荡;再加入1ml水及2mlCH2Cl2 。涡旋振荡并830g离心。保留有机相,用2mlCH2Cl2再次抽提水相。合并获得的有机相,蒸发溶剂获得总脂。根据Ref.[5]设计的方案获得二乙氨衍生物。总脂转移至1ml穿刺反应瓶中,反应瓶中含0.8ml二乙氨和0.1ml冰醋酸,然后在氮气保护下净化,再密封置于穿刺反应仪(Rockford, IL, USA)中,105℃下反应75min。而后反应混合物转移至带有瓶塞的玻璃试管中。在氮气流中蒸发掉二乙氨,然后加入1ml水及3mlCH2Cl2,涡旋震荡并830g离心。最后蒸发至得到干物质并回收二乙氨衍生物的有机相。3 结果及讨论3.1甲酯化每毫克鲜重的种子直接甲酯化[6]能产生150µg的总脂肪酸。但种方法并不能总是能定量的测定从植物组织中提取出来的脂肪酸。它能够像最初一样很好地测定植物叶片中的脂肪酸,对其他植物组织就未必能起到很好的作用,例如内陆云杉种子。按Hara等人提出的总脂肪酸提取方案,然后再用甲酯化气相色谱分析法,可以测出每毫克鲜重种子300µg范围内的总脂肪酸。上文均用Holbrooketal提出的提取方案和转甲基化方法。内陆云杉种子总脂肪酸的气相色谱-质谱分析结果如图1,通过与标样的保留时间和图谱比较可以得知1、2、3、6的峰值分别代表16:0, 18:0, 9-18:1和9,12-18:2脂肪酸甲酯。根据现有的色谱条件trans-9-18:l和trans-9,trans-12-18:2脂肪酸甲酯的洗脱时间比相应的顺式异构体cis-9-18:1和cis-9,cis-12-18:2脂肪酸甲酯要早0.5min。结合植物油脂多为顺式异构体这一事实,可以推知在这次测定中所得的同样应该是顺式异构体。所以在图1.中的峰值3和6可以确定为cis-9-18:1和cis-9,cis-12-18:2脂肪酸甲酯。在图1.(标注为7)的质谱数据图谱中的丰度第二的组分显示的离子峰为292,这和18:3脂肪酸甲酯相匹配,但是它的保留时间与现有的任一标样都不符。同样地,组分5的离子峰为294,显示为一种不明双键位置的18:2二烯酸甲酯。白杉种子总脂肪酸提取物的GC-MS分析结果如图2.所示。从中可以观察到两个物种的脂肪酸甲酯的结构是相似的。离子峰D和E分别是296和294,表明它们分别为18:1和18:2脂肪酸甲酯。图1.中的峰5、7和图2.中的峰D和E对应的物质的结构阐述将在下文介绍。3.2 二乙氨衍生物二乙氨衍生物提供一分子电荷稳定基团给分析物,使其在断片发生之前重新电荷分布产生峰值[3]。以cis-9,cis-12,cis-15-18:3(a-亚麻酸)作为参考物质对这种方法进行了首次评定,依照Ref.[5]介绍的规律解释质谱结果显示:每隔14u出现一个饱和键,而片段在Cn和Cn+1之间被12u所分隔则表示在Cn+1和Cn+2存在一个不饱和双键。可以用这一结论解释二乙氨衍生物质谱分析中的cb-9,cis-12,cis-15-18:3的双键位置。质谱分析结果基本符合Ref.[5]介绍的规律。电子轰击后的二乙氨衍生物的质谱图谱显示于图3的A和B,对应的峰分别是第6和7。图3A显示离子峰为335u,对应的二乙氨衍生物为18:2。片段m/z 198-210和 m/z 238-250的差别表示在C9-C10和C12- C13各存在一个双键,就如Ref.[5]叙述的,经测定该化合物为cis-9,cis-12-18:2。丰度为第二的脂肪酸的二乙氨衍生物被显示于图3B,其离子峰显示为333u,测定对应的物质为18:3的二乙氨衍生物,在m/z 142-154, 196-208 和236-248间存在12u的差异说明在5、9、12三处各有一个双键。而在云杉属中,9,12-18:2表示cis构象,故可以确定该化合物为cis-5,cis-9,cis-12-18:3。电子轰击后,二乙氨衍生物的质谱图谱(图1中对应峰5)不能有效说明双键的所在位置,但白云杉脂肪酸二乙氨衍生物的图谱(图2对应峰E)能有效地说明,如图4A所示:离子峰为335确定为18:2二乙氨衍生物,双键位置分别在碳5、9位,测定为cis-5,cis-9-18:2。图4B中显示的二乙氨衍生物的图谱,在图2中对应着峰D。离子峰337u对应18:1二乙氨衍生物,尽管不是很清晰,但该图谱仍显示在226-238质量单位间存在12u,说明双键位置在碳11、12间,化合物确定为cis-11-18:1。通过比较两种云杉种子的脂肪酸甲酯的保留时间可以推测图1.中的峰值5和图2中的峰值是相同的(即两者都是cis-5,cis-9-18:2)同样的,图2.中的峰值D和图1.中的峰值4也有相似的保留时间。因此初步鉴定它们为cis-11-18:1。图2.中的峰值A、B、C、D、E、F和G被确定为16:0,18:0,cis-9-18:l,cis-i1-18:1,cis-5,cis-9-18:2,cis-9,cis-12-18:2 和cis-5,cis-9,cis-12-18:3。这些脂肪酸在白杉和内陆云杉种子中的分布如表1.所示。白杉和内陆云杉种子的油脂含量分别是鲜重的49±5%和41±1%。相对于其它族的脂肪链来说cis-5,cis-9-18:2和cis-5,cis-9,cis-12-18:3的三乙氨衍生物的图谱在m/z182处均显示出强烈的离子效应。这种强的离子效应可能是由在形成烯丙基片段时两个亚甲基将双键分隔而引起。这一假设是从图3B.和图4A.中的脂肪酸衍生物图谱分析中提出来的。在图3A.和图4B.中的图谱并没有显示出在m/z182强烈的离子效应。脂肪酸cis-5,cis-9,cis-12-18:3 在对P.abies[5,9,11] 和 P.engelmannii, mariana, obovata, orientalis和sitchensis [10]的研究中都有检测到。我们在P. glauca 和 P. glauca engelmannii Complex的研究中也检测到了这些物质。其他文章[1,12]报道P. glauca中丰度第二的脂肪酸为cis-5,cis-9-18:2,我们实验室所得的P. glauca种子提取物的确含有这些脂肪酸,但却是次要组分,结果见表1.。参考文献[1] S.M. Attree, M.K. Pomeroy 和 L.C. Fowke, Planta, 187 (1992) 395.[2] T.M. Ching, in T.T. Kozlowski (Editor), Seed Biology, Vol. II, Academic Press, New York, 1972, p. 103.[3] L. Hogge 和 J. Millar, in J.C. Giddings et al. (Editors), Advances in Chromatography, Vol. 27, Marcel Dekker, New York, 1987, p. 299.[4] B.A. 和ersson, W.H. Heimermann 和 R.T. Holman, Lipids, 9 (1974) 443.[5] R. Nilsson 和 C. Liljenberg, Phytochem. Anal., 2(1991) 253.[6] J. Browse, P.J. McCourt 和 C.R. Somerville, Anal. Biochem., 152 (1986) 141.[7] A. Hara 和 N.S. Radin, Anal. Biochem., 90 (1978) 420.[8] L.A. Holbrook, J.R. Magus 和 D.C. Taylor, PlantSci., 84 (1992) 99.[9] R. Ekman, Phytochemistry, 19 (1980) 147.[10] G.R. Jamieson 和 E.H Reid, Phytochemistry, 11(1972) 269.[11] M. Olsson, R. Nilsson, P. Norberg, S. von Arnold 和 C. Liljenberg, Plant Physiol. Biochem., 32 (1994) 225.[12] S.M. Attree, M.K. Pomeroy 和 L.C. Fowke, Plant Cell Rep., 13 (1994) 601.
“对图中的那些函数,我这里稍加解释一下。”
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
功能是初始化Windows Socket Dll,在Windows下必须使用它。
参数:
“wVersionRequested”表示版本,可以是1.1、2.2等;
“lpWSAData”指向WSADATA数据结构的指针。
int socket(int family, int type, int protocol);
功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。
参数:
“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;
“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);
“int protocol”参数通常设置为0。
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
功能是把套接字和机器上一定的端口关联起来。
参数:
“sockfd”是调用socket()返回的套接字值;
“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;
“addrlen”设置为sizeof(struct sockaddr)。
int listen(int sockfd, int backlog);
功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。
参数:
“sockfd”是调用socket()返回的套接字值;
“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
功能是客户端连接服务端监听的端口。
参数:
“sockfd”是调用socket()返回的套接字值;
“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;
“addrlen”设置为sizeof(struct sockaddr)。
int accept(int sockfd, void *addr, int *addrlen);
功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。
参数:
“sockfd”是和listen()中一样的套接字值;
“addr”是个指向局部的数据结构sockaddr_in的指针;
“addrlen”设置为sizeof(struct sockaddr_in)。
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。
参数:
“sockfd”是发/收数据的套接字值;
“msg”指向你想发送的数据的指针;
“buf”是指向接收数据存放的地址;
“len”是数据的长度;
“flags”设置为 0。
int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
功能和send、recv类似,不过是用于无连接数据报套接字的传输。
int closesocket(int sockfd)
功能是关闭套接字。
参数“sockfd”为要关闭的套接字值。
程序:
“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是:
socket()→bind()→listen→accept()→recv()/send()→closesocket()
具体代码如下:”
★
#include
#include
#pragma comment(lib,"Ws2_32")
#define MYPORT 830 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
int main()
{
int sockfd, new_fd; /*定义套接字*/
struct sockaddr_in my_addr; /*本地地址信息 */
struct sockaddr_in their_addr; /*连接者地址信息*/
int sin_size;
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll
//建立socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
//如果建立socket失败,退出程序
printf("socket error\n");
exit(1);
}
//bind本机的MYPORT端口
my_addr.sin_family = AF_INET; /* 协议类型是INET */
my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/
my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
{
//bind失败,退出程序
printf("bind error\n");
closesocket(sockfd);
exit(1);
}
//listen,监听端口
if (listen(sockfd, BACKLOG) == -1)
{
//listen失败,退出程序
printf("listen error\n");
closesocket(sockfd);
exit(1);
}
printf("listen...");
//等待客户端连接
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
printf("accept error\n");
closesocket(sockfd);
exit(1);
}
printf("\naccept!\n");
//有连接,发送ww0830字符串过去
if (send(new_fd, "ww0830\n", 14, 0) == -1)
{
printf("send error");
closesocket(sockfd);
closesocket(new_fd);
exit(1);
}
printf("send ok!\n");
//成功,关闭套接字
closesocket(sockfd);
closesocket(new_fd);
return 0;
}
对服务端程序的流程概括:
先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);
然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)
再bind本机的MYPORT端口:
my_addr.sin_family = AF_INET; /* 协议类型是INET */
my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP */
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
接下来监听端口: listen(sockfd, BACKLOG)
如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)
最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0)
收尾工作,关闭socket: closesocket(sockfd); closesocket(new_fd); ”
编译、执行,就会一直监听830端口
客户端程序了。其流程是:
socket()→connect()→send()/recv()→closesocket()
比服务端更简单吧!其实现代码如下:”
★
#include
#include
#include
#pragma comment(lib,"Ws2_32")
#define PORT 830 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct sockaddr_in their_addr; /* 对方的地址端口信息 */
if (argc != 2)
{
//需要有服务端ip参数
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
//如果建立socket失败,退出程序
printf("socket error\n");
exit(1);
}
//连接对方
their_addr.sin_family = AF_INET; /* 协议类型是INET */
their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */
their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
{
//如果连接失败,退出程序
printf("connet error\n");
closesocket(sockfd);
exit(1);
}
//接收数据,并打印出来
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
//接收数据失败,退出程序
printf("recv error\n");
closesocket(sockfd);
exit(1);
}
buf[numbytes] = '\0';
printf("Received: %s",buf);
closesocket(sockfd);
return 0;
}
对客户端程序的流程概括:
首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);
然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)
接着连接服务器方:
their_addr.sin_family = AF_INET; /* 协议类型是INET */
their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */
their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */
connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr))
连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0)
最后把收到的数据打印出来并关闭套接字:
printf("Received: %s",buf); closesocket(sockfd);
编译结束后,运行服务端,然后。客户端 服务端IP 回车
你会看到服务端发来得数据。
那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。
当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。
流程如下:
A客户端发登录消息-----》服务器
服务器验证发送用户消息----》客户端
A客户端想发消息给B客户端----》先发给服务端
服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)
通信结束。
162 浏览 2 回答
169 浏览 2 回答
292 浏览 4 回答
128 浏览 2 回答
293 浏览 2 回答
179 浏览 2 回答
150 浏览 4 回答
202 浏览 2 回答
169 浏览 2 回答
246 浏览 2 回答
360 浏览 2 回答
176 浏览 2 回答
226 浏览 3 回答
356 浏览 2 回答
196 浏览 2 回答