Sockets API untuk layanan paket lama


Traffic dari soket ditagih sebagai bandwidth keluar. IO asinkron (seperti Twisted dalam Python) tidak didukung. App Engine mendukung API modul soket Python standar hanya untuk soket keluar. Anda cukup mengimpor library soket standar menggunakan pernyataan berikut:

import socket

Library yang mengimpor socket, seperti poplib atau nntplib, dan yang tidak melanggar batasan dan pembatasan yang tercantum di bawah, akan bekerja tanpa modifikasi.

Meskipun runtime Python 2 mendukung soket, ada batasan dan perilaku tertentu yang perlu Anda ketahui saat menggunakan soket.

Anda dapat memilih deskriptor soket dan meneruskannya di antara instance App Engine, seperti bagian dari payload Task. Dalam skenario ini, Anda dapat membuka soket pada frontend instance, lalu meneruskannya ke backend instance dan menggunakannya di sana.

Pada versi SDK sebelum 1.8.1, Anda tidak dapat memanggil opsi get/set pada soket. (Melakukan hal tersebut akan memunculkan pengecualian "Tidak Diterapkan".) Namun, Sockets API kini mengizinkan hal ini.

Untuk opsi yang didukung, panggilan ke getsockopt akan menampilkan nilai tiruan dan panggilan ke setsockopt akan diabaikan secara diam-diam. Error akan terus meningkat untuk opsi yang tidak didukung. Opsi yang didukung adalah:

  • SO_KEEPALIVE
  • SO_DEBUG
  • TCP_NODELAY
  • SO_LINGER
  • SO_OOBINLINE
  • SO_SNDBUF
  • SO_RCVBUF
  • SO_REUSEADDR

Pembatasan dan batasan

Dukungan socket di App Engine memiliki batasan berikut:

  • Anda tidak dapat membuat soket pemrosesan; Anda hanya dapat membuat soket keluar.
  • FTP tidak didukung.
  • Secara default, httplib dikonfigurasi untuk menggunakan urlfetch api; jika Anda perlu menggunakansocket untuk mengatasi batas urlfetch, Anda dapat melakukannya dengan mengubah default ini sehingga httplib menggunakan soket. Untuk mengetahui informasi selengkapnya, lihat Memanfaatkan httplib soket.
  • Anda hanya dapat menggunakan TCP atau UDP; protokol arbitrer tidak diperbolehkan.
  • Anda tidak dapat terikat pada alamat IP atau port tertentu.
  • Port 25 (SMTP) diblokir; Anda masih dapat menggunakan SMTP yang diautentikasi pada port pengiriman 587.
  • Rentang IP pribadi, siaran, multicast, dan Google diblokir, kecuali yang tercantum di bawah:

    • Google Public DNS: 8.8.8.8, 8.8.4.4, 2001:4860:4860::8888, 2001:4860:4860::8844 port 53
    • SMTP Gmail: smtp.gmail.com port 465 dan 587
    • POP3S Gmail: pop.gmail.com port 995
    • IMAPS Gmail: imap.gmail.com port 993
  • Deskripsi soket dikaitkan dengan aplikasi App Engine yang membuatnya dan tidak dapat ditransfer (tidak dapat digunakan oleh aplikasi lain).

  • Soket dapat digunakan kembali setelah 10 menit dalam kondisi tidak aktif; operasi soket apa pun akan menjaga soket tersebut tetap aktif selama 10 menit lagi.

  • Saat ini, socket.gethostbyaddr() tidak diimplementasikan di Python. Anda masih dapat menggunakan library standar SMTP Python (smtplib) untuk membuka koneksi:

    # Open a connection to my mail server
    s = smtplib.SMTP('smtp.mailhostingcompany.net', 587)
    

Menggunakan soket dengan server pengembangan

Anda dapat menjalankan dan menguji kode menggunakan soket di server pengembangan, tanpa menggunakan parameter command line khusus.

Menggunakan soket dengan OpenSSL

App Engine mendukung Python OpenSSL native untuk runtime Python 2.7. Anda harus mengonfigurasi file app.yaml untuk memuat library ssl, seperti yang dijelaskan dalam Dukungan OpenSSL.

Menonaktifkan URL Fetch agar tidak menangani semua permintaan keluar

Jika Anda mengimpor httplib, secara default tindakan ini akan menggunakan urlfetch api. Untuk mengubahnya agar httplib menggunakan soket, tambahkan variabel lingkungan berikut ke file app.yaml Anda:

 env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

Anda dapat mengganti anyvalue dengan nilai apa pun termasuk string kosong.

Contoh App Engine menggunakan soket

Untuk mengetahui contoh penggunaan soket, lihat aplikasi demo soket di GitHub Google Cloud Platform.