Chapter 1 — Python Network Programming Cookbook Second Edition (Translate Indonesia) | Menangani Error Socket Handling

Chalid Ade Rahman
4 min readMar 28, 2019

--

Chapter 1

Sockets, IPv4, and Simple Client/Server Programming

1. Tujuan :

Adapun materi dalam praktikum ini diantaranya :

  1. Mencetak hostname dan alamat IPv4 Komputer
  2. Mendapatkan alamat IP dari remote mechine
  3. Mengonversi alamat IPv4 ke dalam format lainya
  4. Menemukan nama layanan, diberi port dan protokol
  5. Mengubah integer ke dan dari host ke urutan byte jaringan
  6. Mengatur socket timeout dari settingan default
  7. Menangani Error Socket Handling
  8. Memodifikasi ukuran buffer
  9. Mengubah soket ke mode pemblokiran / non-pemblokiran
  10. Menggunakan kembali alamat soket
  11. Mencetak waktu terkini dari time server internet
  12. Membuat Program SNTP Client
  13. Membuat aplikasi client/ server TCP sederhana
  14. 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.

--

--

Chalid Ade Rahman
Chalid Ade Rahman

Written by Chalid Ade Rahman

PHP Programmer | PT Electronic Data Interchange Indonesia | Question : chalidade@gmail.com

No responses yet