本教程将介绍Python中的套接字以及如何使用套接字模块在Python中构建HTTP服务器和客户端。 它还将涵盖Tornado,这是一个Python网络库,非常适合长时间轮询,WebSocket和需要与每个用户建立长期连接的其他应用程序。
什么是插座?
套接字是两个可以相互通信的应用程序之间的链接(可以在一台计算机上本地通信,也可以在不同位置的两台计算机之间远程通信)。
基本上,套接字充当两个实体(即服务器和客户端)之间的通信链接。 服务器将发出客户端请求的信息。 例如,当您访问此页面时,浏览器创建了一个套接字并连接到服务器。
插座模块
为了创建一个套接字,您可以使用socket.socket()
函数,其语法非常简单:
import socket
s= socket.socket (socket_family, socket_type, protocol=0)
这是参数的描述:
- socket_family :代表地址(和协议)家族。 它可以是AF_UNIX或AF_INET。
- socket_type :表示套接字类型,可以是SOCK_STREAM或SOCK_DGRAM。
- protocol :这是一个可选参数,通常默认为0。
获取套接字对象之后,可以使用套接字模块中可用的方法根据需要创建服务器或客户端。
创建一个简单的客户端
在开始之前,让我们看一下Python中可用的客户端套接字方法。
-
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
s.connect()
:启动TCP服务器连接。
要创建一个新的套接字,首先要导入套接字类的套接字方法。
import socket
接下来,我们将创建一个流(TCP)套接字,如下所示:
stream_socket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
AF_INET
参数指示您正在请求Internet协议(IP)套接字,特别是IPv4。 第二个参数是TCP套接字的传输协议类型SOCK_STREAM
。 此外,您还可以通过指定套接字AF_INET6
参数来创建IPv6套接字。
指定服务器。
server = "localhost"
指定我们要与之通信的端口。
port =80
将套接字连接到服务器正在侦听的端口。
server_address = ((host, port))
stream_socket.connect(server_address)
重要的是要注意主机和端口必须是一个元组。
向服务器发送数据请求:
message = 'message'
stream_socket.sendall(message)
从服务器获取响应:
data = sock.recv(10)
print data
要关闭连接的套接字,请使用close方法:
stream_socket.close()
以下是客户端/服务器的完整代码。
import socket
import sys
# Create a TCP/IP socket
stream_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define host
host = 'localhost'
# define the communication port
port = 8080
# Connect the socket to the port where the server is listening
server_address = ((host, port))
print "connecting"
stream_socket.connect(server_address)
# Send data
message = 'message'
stream_socket.sendall(message)
# response
data = stream_socket.recv(10)
print data
print 'socket closed'
stream_socket.close()
建立一个简单的服务器
现在,让我们看一个简单的Python服务器。 以下是Python中可用的套接字服务器方法。
-
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
s.bind()
:将地址(主机名,端口号)绑定到套接字。 -
s.listen()
:设置并启动TCP侦听器。 -
s.accept()
:接受TCP客户端连接。
我们将按照以下步骤操作:
- 创建一个套接字。
- 将套接字绑定到端口。
- 开始接受套接字上的连接。
这是服务器程序。
import socket
import sys
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Define host
host = 'localhost'
# define the communication port
port = 8080
# Bind the socket to the port
sock.bind((host, port))
# Listen for incoming connections
sock.listen(1)
# Wait for a connection
print 'waiting for a connection'
connection, client = sock.accept()
print client, 'connected'
# Receive the data in small chunks and retransmit it
data = connection.recv(16)
print 'received "%s"' % data
if data:
connection.sendall(data)
else:
print 'no data from', client
# Close the connection
connection.close()
现在,服务器已准备好进行传入连接。
现在,在单独的终端窗口中运行客户端和服务器程序,以便它们可以相互通信。
服务器输出
$ python server.py
waiting for a connection
('127.0.0.1', 47050) connected
received "message"
客户输出
$ python client.py
connecting
message
socket closed
龙卷风框架
Tornado框架是可用于Python网络编程的库之一。 在本节中,我们将讨论该库并显示如何使用它来构建WebSocket。
Tornado是一个Python Web框架和异步网络库。 龙卷风使用非阻塞网络I / O,因此能够扩展到成千上万的开放连接。 此特性使其非常适合长时间轮询,WebSocket和其他需要与每个用户建立长期连接的应用程序。
让我们创建一个简单的Tornado WebSocket:
import tornado.ioloop
import tornado.web
class ApplicationHandler(tornado.web.RequestHandler):
def get(self):
self.message = message = """<html>
<head>
<title>Tornado Framework</title>
</head>
<body
<h2>Welcome to the Tornado framework</h2>
</body>
</html>"""
self.write(message)
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", ApplicationHandler),
])
application.listen(5001)
tornado.ioloop.IOLoop.instance().start()
在上面的代码中:
- 我们定义了类
ApplicationHandler
,该类充当请求的处理程序,并使用write()
方法返回响应。 -
main
方法是程序的入口。 -
tornado.web.Application
为Web应用程序创建一个基础,并接受处理程序的集合,即ApplicationHandler。 - 该应用程序侦听端口5000,并且客户端可以使用相同的端口与此应用程序进行通信。
-
tornado.ioloop.IOLoop.instance().start()
为应用程序创建一个非阻塞线程。
如果运行该应用程序,我们将获得如下屏幕截图所示的结果。
结论
到目前为止,您必须已经掌握了Python套接字编程的基础知识,以及如何构建简单的服务器和客户端。 可以通过构建自己的聊天客户端进行实验。 有关更多信息,请访问官方Python文档。
此外,不要犹豫,看看我们在Envato市场上有哪些可供出售和研究的物品 ,也不要犹豫,使用下面的提要来问任何问题并提供宝贵的反馈意见。
翻译自: https://code.tutsplus.com/tutorials/introduction-to-network-programming-in-python--cms-30459