Chapter 1 — Python Network Programming Cookbook Second Edition (Translate Indonesia) | Menangani Error Socket Handling
Chapter 1
Sockets, IPv4, and Simple Client/Server Programming
1. Tujuan :
Adapun materi dalam praktikum ini diantaranya :
- Mencetak hostname dan alamat IPv4 Komputer
- Mendapatkan alamat IP dari remote mechine
- Mengonversi alamat IPv4 ke dalam format lainya
- Menemukan nama layanan, diberi port dan protokol
- Mengubah integer ke dan dari host ke urutan byte jaringan
- Mengatur socket timeout dari settingan default
- Menangani Error Socket Handling
- Memodifikasi ukuran buffer
- Mengubah soket ke mode pemblokiran / non-pemblokiran
- Menggunakan kembali alamat soket
- Mencetak waktu terkini dari time server internet
- Membuat Program SNTP Client
- Membuat aplikasi client/ server TCP sederhana
- Membuat aplikasi client / server UDP sederhana
2. Percobaan
G. Menangani Kesalahan Socket (Error Socket Handling)
Dalam aplikasi jaringan apa pun, sangat umum bahwa salah satu ujung mencoba terhubung, tetapi pihak lain tidak merespons karena kegagalan media jaringan atau alasan lain. Pustaka soket Python memiliki metode yang elegan untuk menangani kesalahan ini melalui pengecualian socket.error. Dalam resep ini, beberapa contoh disajikan.
Cara Melakukannya :
Mari kita buat beberapa blok kode coba-kecuali dan letakkan satu jenis kesalahan potensial di setiap blok. Untuk mendapatkan input pengguna, modul argparse dapat digunakan. Modul ini lebih kuat dari sekadar mengurai argumen baris perintah menggunakan sys.argv. Di blok coba-kecuali, letakkan operasi soket yang khas, misalnya, buat objek soket, sambungkan ke server, kirim data, dan tunggu balasan. Resep berikut menggambarkan konsep dalam beberapa baris kode.
Listing 1.7 memperlihatkan socket_errors sebagai berikut:
#!/usr/bin/env python
# Python Network Programming Cookbook, Second Edition — Chapter — 1
# This program is optimized for Python 2.7.12 and Python 3.5.2.
# It may run on any other version with/without modifications.
import sys
import socket
import argparse
def main():
# setup argument parsing
parser = argparse.ArgumentParser(description=’Socket Error Examples’)
parser.add_argument(‘ — host’, action=”store”, dest=”host”,
required=False)
parser.add_argument(‘ — port’, action=”store”, dest=”port”, type=int,
required=False)
parser.add_argument(‘ — file’, action=”store”, dest=”file”,
required=False)
given_args = parser.parse_args()
host = given_args.host
port = given_args.port
filename = given_args.file
# First try-except block — create socket
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as e:
print (“Error creating socket: %s” % e)
sys.exit(1)
# Second try-except block — connect to given host/port
try:
s.connect((host, port))
except socket.gaierror as e:
print (“Address-related error connecting to
server: %s” % e)
sys.exit(1)
except socket.error as e:
print (“Connection error: %s” % e)
sys.exit(1)
# Third try-except block — sending data
try:
msg = “GET %s HTTP/1.0\r\n\r\n” % filename
s.sendall(msg.encode(‘utf-8’))
except socket.error as e:
print (“Error sending data: %s” % e)
sys.exit(1)
while 1:
# Fourth tr-except block — waiting
to receive
data from remote host
try:
buf = s.recv(2048)
except socket.error as e:
print (“Error receiving data: %s” % e)
sys.exit(1)
if not len(buf):
break
# write the received data
sys.stdout.write(buf.decode(‘utf-8’))
if __name__ == ‘__main__’:
main()
Cara Kerjanya :
Dengan Python, meneruskan argumen baris perintah ke skrip dan menguraikannya dalam skrip dapat dilakukan menggunakan modul argparse. Ini tersedia dalam Python 2.7. Untuk versi Python sebelumnya, modul ini tersedia secara terpisah dalam Python Package Index (PyPI). Anda dapat menginstal ini melalui easy_install atau pip.
Dalam percobaan ini, tiga argumen disiapkan — nama host, nomor port, dan nama file. Penggunaan skrip ini adalah sebagai berikut:
$ python 1_7_socket_errors.py — host=<HOST>
— port=<PORT> — file=<FILE>
In the preceding recipe, msg.encode(‘utf-8’) encodes the message into UTF-8, and buf.decode(‘utf-8’) decodes the received UTF-8 format.
Jika Anda mencoba percobaan dengan non-existent host, scipt ini akan menampilkan address error seperti berikut :
Jika tidak ada service pada spesific port dan jika Anda mencoba mengkoneksikan port tersebut, lalu anda akan mendapatkan connection timeout error seperti berikut :
$ python 1_7_socket_errors.py
— host=www.python.org — port=8080
— file=1_7_socket_errors.py
Perintah diatas akan memberikan pesan kesalahan dikarenakan www.python.org, tidak terlist dalam port 8080:
Connection error: [Errno 110] Connection timed out
Namun, jika Anda mengirim permintaan sewenang-wenang sebagai permintaan yang benar ke port yang benar, kesalahan tersebut mungkin tidak ditangkap pada level aplikasi. Misalnya, menjalankan skrip berikut tidak menghasilkan kesalahan, tetapi output HTML memberi tahu kami apa yang salah dengan skrip ini:
$ python 1_7_socket_errors.py
— host=www.python.org — port=80
— file=1_7_socket_errors.py
HTTP/1.1 500 Domain Not Found
Server: Varnish
Retry-After: 0
content-type: text/html
Cache-Control: private, no-cache
connection: keep-alive
Content-Length: 179
Accept-Ranges: bytes
Date: Thu, 01 Jun 2017 22:02:24 GMT
Via: 1.1 varnish
Connection: close
<html>
<head>
<title>Fastly error: unknown domain </title>
</head>
<body>
Fastly error: unknown domain: . Please check that this domain has been
added to a service.</body></html>
Dalam contoh sebelumnya, empat blok coba-kecuali telah digunakan. Semua blok menggunakan socket.error kecuali untu lok kedua, yang menggunakan socket.gaierror. Ini digunakan untuk kesalahan terkait alamat. Ada dua jenis pengecualian lain — socket.herror digunakan untuk legacy C API, dan jika Anda menggunakan metode settimeout () di soket, socket.timeout akan dinaikkan ketika timeout terjadi pada soket itu.