使用Socket在Python中设置Internet服务器

01

10 8

插座介绍

作为网络客户端教程的补充,本教程介绍了如何使用Python实现简单的web服务器。可以肯定的是,这不能替代Apache或Zope。还有更强大的方法可以使用BaseHTTPServer等模块在Python中实现web服务。该服务器仅使用插座模块。

您将记得socket模块是大多数Python web服务模块的骨干。与简单的网络客户端一样,使用它构建服务器可以透明地说明Python中web服务的基础知识。BaseHTTP服务器本身会导入socket模块以影响服务器。

02

33 of 10 34

运行服务器

通过审查,所有网络事务都发生在客户端和服务器之间。在大多数协议中,客户端询问某个地址并接收数据。

在每个地址内,可以运行多个服务器。限制在硬件中。有了足够的硬件(RAM,处理器速度等),同一台计算机可以同时用作web服务器,ftp服务器和邮件服务器(pop,SMP,imap或以上所有)。每个服务都与一个端口相关联。该端口绑定到插座。服务器监视其关联的端口,并在该端口上收到请求时提供信息。

03

59 of 10 60

通过插座进行通信

因此,要影响网络连接,您需要了解主机,端口以及该端口上允许的操作。大多数web服务器在端口80上运行。但是,为了避免与已安装的Apache服务器发生冲突,我们的web服务器将在端口8080上运行。为了避免与其他服务发生冲突,比较好将HTTP服务保留在端口80或8080上。这是两个最常见的。Obvi当然,如果使用这些,您必须找到一个开放端口并提醒用户进行更改。

与网络客户端一样,您应该注意这些地址是不同服务的通用端口号。只要客户端在正确的地址要求正确的端口上提供正确的服务,通信仍然会发生。例如,Google's邮件服务最初并未使用通用端口号运行,但由于他们知道如何访问帐户,因此用户仍然可以获取邮件。

与网络客户端不同,服务器中的所有变量都是硬连线的。任何预期不断运行的服务都不应在命令行中设置其内部逻辑的变量。**的变化是,出于某种原因,您希望服务偶尔运行并使用各种端口号。但是,如果是这种情况,您仍然可以查看系统时间并相应更改绑定。

所以我们**的进口是插座模块。


导入插座

接下来,我们需要声明一些变量。

04

of 10

主机和端口

如前所述,服务器需要知道要关联的主机以及要聆听的端口。为了我们的目的,我们将该服务完全适用于任何主机名。

教育_1

主机=''
端口=8080

如前所述,该端口将是8080。所以请注意,如果您将此服务器与网络客户端结合使用,则需要更改该程序中使用的端口号。

05

120 of 10 121

创建一个插座

无论是请求信息还是服务信息,为了访问互联网,我们需要创建一个插座。此调用的语法如下知识健康讲座


=插座(

公认的插座系列是:

  • AFÅINET:IP4协议(TCP和UDP)
  • AFÅINET6:IP6协议(TCP和UDP)
  • AFÅUNIX:UNIX域协议

前两个显然是互联网协议。在这些家庭中可以访问通过互联网传播的任何内容。许多网络仍然不在IP6上运行。因此,除非另有说明,否则默认为IP4并使用AFÅINET是最安全的。

插座类型是指通过插座使用的通信类型。五种插座类型如下:

  • SOCKÅSTREAM:a connection-oriented,TCP byte STREAM
  • SOCKÅDGRAM:UDP transferral of datagrams(独立于客户端-服务器确认的IP数据包)
  • SOCKÅRAW:a RAW SOCK
  • SOCKÅRDM:for reable datagrams
  • SOCKÅseqpackade:sequential transfer of records over a connection

到目前为止,最常见的类型是袜子和袜子,因为它们在IP套件的两个协议(TCP和UDP)上运行。后三种情况要少得多,因此可能并不总是得到支持。

所以让's创建一个插座并将其分配给一个变量。


c=插座(socket.AFÅINET, SOCK.SOCKÅu流)

06

178 of 10 179

设置插座选项

创建插座后,我们需要设置插座选项。对于任何插座对象,您可以使用setsockopt()方法设置插座选项。语法如下:

插座_对象(级别,选项名称,值)出于我们的目的,我们使用以下行:

c.setsockopt(socket.SOLÅu插座, socket.SOäREUSEADDR,1)

术语'level'是指选项的类别。对于插座级选项,请使用SOLÅ插座。对于协议编号,人们会使用IPPROTOÅIP。SOLÅu插座是插座的恒定属性。确切地说,作为每个级别的一部分,哪些选项是由您的操作系统以及您是使用IP4还是IP6决定的。
Linux和相关Unix系统的文档可以在系统文档中找到。Microsoft用户的文档可以在MSDN网站上找到。在撰写本文时,我还没有找到有关插座编程的Mac文档。由于Mac大致基于BSD Unix,因此它可能实现完整的选项补充。
为了确保此插座的可重用性,我们使用了sou REUSEADDR选项。可以将服务器限制为仅在开放端口上运行,但这似乎是不必要的。但是请注意,如果在同一个端口上部署了两个或多个服务,则效果是不可预测的。人们无法确定哪个服务将接收哪个信息包。
最后,'1'对于一个值是在程序中已知对插座的请求的值。通过这种方式,程序可以非常细致地听到插座。

07

of 10

将端口绑定到插座

创建插座并设置其选项后,我们需要将端口绑定到插座。


c.bind((主机,端口))

绑定完成后,我们现在告诉计算机等待并倾听该端口。


c.倾听(1)

如果我们想向调用服务器的人提供反馈,我们现在可以输入打印命令以确认服务器正在运行。

08

10 239中的238个

处理服务器请求

设置服务器后,我们现在需要告诉Python在给定端口上发出请求时要做什么。为此,我们按其值引用请求,并将其用作持久性while循环的参数。

发出请求时,服务器应接受该请求并创建一个与之交互的file对象。

而1:
csock,caddr=c.accept()
cfile=csock.makefile('rw',0)

在这种情况下,服务器使用相同的端口进行读写。因此,makefile方法被赋予一个参数'rw'。缓冲区大小的空长度只是留下部分文件动态确定。

09

of 10

将数据发送到客户端

除非我们想创建单个操作服务器,否则下一步是从file对象读取输入。当我们这样做时,我们应该小心去除多余的空白输入。

line=cfile.readline()。剥离()

请求将以操作的形式出现,然后是页面,协议和正在使用的协议的版本。如果想要提供网页,可以分割这个输入来检索请求的页面,然后将该页面读取到一个变量中,然后写入socket file对象。博客中可以找到将文件读入字典的功能。

为了使本教程更详细地说明如何使用socket模块,我们将放弃服务器的这一部分,而是展示如何使数据呈现细微差别。在程序中输入接下来的几行。

cfile.write('HTTP/1.0 200 OK \ n \ n')
cfile.write('欢迎%s! '%(str(caddr)))
cfile.write('

按照链接…

')
cfile.write('所有服务器需要做的是')
cfile.write('将文本传送到插座。')
cfile.write('它提供链接的HTML代码,')
cfile.write('web浏览器对其进行转换。&升t、 br>

')
cfile.write('

点击我!
')
cfile.write('

您的请求措辞为:"%s"'%(行))
cfile.write('<#body><#html>')

10

10 302中的301

最终分析并关闭

如果发送网页,**行是将数据引入web浏览器的好方法。如果省略,大多数web浏览器将默认为渲染HTML。但是,如果包含它,'OK'必须后跟两个新行字符。这些用于区分协议信息和页面内容。

正如您可能推测的那样,**行的语法是协议,协议版本,消息编号和状态。如果您曾经访问过已移动的网页,则可能收到404错误。这里的200条信息只是肯定的信息。

其余的输出只是一个分为几行的网页。您将注意到可以对服务器进行编程以使用输出中的用户数据。最后一行反映了服务器收到的web请求。

最后,作为请求的关闭行为,我们需要关闭file对象和服务器插座。

cfile.close()
csock.close()

现在以可识别的名称保存此程序。用'调用它后;python程序_name.py',如果您编程了确认服务正在运行的消息,则应打印到屏幕上。终端似乎会暂停。一切都是应该的。打开您的web浏览器并转到本地主机:8080。然后你应该看到我们给出的写入命令的输出。请注意,为了空间,我没有暗示此程序中的nt错误处理。但是,任何发布到'wild'的程序都应该。