Gniazda sieciowe w języku python

Wstęp

Note

Python jest łatwym do nauki, prostym językiem programowania ogólnego przeznaczenja (tj. nie jest on dedykowany do jednego rodzaju aplikacji).

Gniazda sieciowe w Pythonie oprogramowuje się tak samo jak w C (większość wywołań funkcji ma odwzorowanie jeden do jeden na funkcje z C.

Nawiązanie połączenia

# -*- coding: utf-8 -*-

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("google.pl", 80))
s.send("GET / HTTP/1.0\n\n")
data = s.recv(1000)

print(data)
print("Reclieved {} bytes".format(len(data)))

Opisy działania funkcji socket, connect, send w zasadzie pokrywają się z opisami tych funkcji w części o C.

Odebranie połączenia

# -*- coding: utf-8 -*-

import socket

HOST = 'localhost'
PORT = 5555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT)) #Uwaga -- te nawiasy są ważne, określaja pythonową krotkę (touple)
s.listen(1)
conn, addr = s.accept()
print('Connected by', addr)
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()

Opisy działania funkcji socket, listen, bind w zasadzie pokrywają się z opisami tych funkcji w części o C.

Serwer wielowątkowy

# -*- coding: utf-8 -*-
import multiprocessing

import socket
import threading

HOST = 'localhost'
PORT = 5555
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)

def handle(conn, add):
    while 1:
        data = conn.recv(1024)
        if not data: break
        conn.sendall(data)
    conn.close()

while True:
    conn, addr = s.accept()
    print('Connected by', addr)
    t = multiprocessing.Process(target=handle, args=(conn,addr))
    t.start()

ten przykład jest w zasadzie taki sam jak dla Javy i C.

Funkcja handle będzie obsługiwać połączenie w oddzielnym procesie.

Linijka multiprocessing.Process(target=handle, args=(conn,addr)) tworzy nowy proces, który będzie wykonywał funkcję handle wywołaną z parametrami conn,addr.

Linijka t.start uruchamia proces.