Socketprogrammering i Python

Detta exekverbara exempel illustrerar med en enkel klient-server-tjänst hur en socket skapas i programspråket python. Vi tittar först på det förbindelselösa transportprotokollet UDP och sedan på det förbidelseorienterade transportprotokollet TCP.

Båda exemplen innehåller två protokollentiteter, en klient och en server. Om man vill köra båda entiteterna på samma maskin, kan man sätta serverName = 'localhost' på båda. Glöm inte att göra filerna exekverbara med kommandot "chmod +x udp*"

UDP

UDP Server

sa0bxi@learn:~ $ cat udpserver.py 
#!/usr/bin/env python3
from socket import *                       #importerar python-modulen socket som hanterar all kommunikation
serverName = 'localhost'                   #kan vara ipv4-adress eller giltigt FQDN som finns i dns
serverPort=12000                           #ledigt portnummer < 65536 
serverSocket = socket(AF_INET, SOCK_DGRAM) #AF_INET betyder IPv4, SOCK_DGRAM betyder UDP
serverSocket.bind(('', serverPort))        #binder porten till 12000
print("The server is ready to receive")
while True:                                #En loop som omvandlar inkommande textsträngar till versaler
  message, clientAddress = serverSocket.recvfrom(2048)
  modifiedMessage = message.decode().upper()
  serverSocket.sendto(modifiedMessage.encode(), clientAddress)
sa0bxi@learn:~ $ 

UDP Client

sa0bxi@bxigw:~ $ cat udpclient.py
#!/usr/bin/env python3
from socket import *                       #importerar python-modulen socket som hanterar all kommunikation
serverName = 'learn.sk0bu.amprnet.se'      #kan bytas mot 'localhost' vid test med server och klient på samma dator
serverPort=12000                           #Serverporten ovan 
clientSocket = socket(AF_INET, SOCK_DGRAM) #AF_INET betyder IPv4, SOCK_DGRAM betyder UDP
while True:                                #En loop som skickar en teststräng till servern
  message = input('Input lowercase sentence:')
  clientSocket.sendto(message.encode(), (serverName, serverPort))
  modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
  print(modifiedMessage.decode())
clientSocket.close()
sa0bxi@bxigw:~ $

TCP

TCP server

sa0bxi@learn:~ $ cat tcpserver.py
#!/usr/bin/env python3
from socket import *                        #importerar python-modulen socket som hanterar all kommunikation
#serverName = 'localhost'                   #kan vara ipv4-adress eller giltigt FQDN som finns i dns
serverPort=12001
serverSocket = socket(AF_INET, SOCK_STREAM) #AF_INET betyder IPv4, SOCK_STREAM betyder TCP
serverSocket.bind(('', serverPort))         #binder porten till numret 12001
serverSocket.listen(1)                      #anger maxantal köade anrop
print("The server is ready to receive")
while True:
  connectionSocket, ClientAddress = serverSocket.accept()
  message = connectionSocket.recv(2048).decode()
  modifiedMessage = message.upper()
  connectionSocket.send(modifiedMessage.encode())
  connectionSocket.close()

TCP Client

#sa0bxi@learn:~ $ cat tcpclient.py
#!/usr/bin/env python3
from socket import *                        #importerar python-modulen socket som hanterar all kommunikation
serverName = 'localhost'                    #kan bytas mot 'localhost' vid test med server och klient på samma dator
serverPort=12001
while True:
  clientSocket = socket(AF_INET, SOCK_STREAM) #AF_INET betyder IPv4, SOCK_STREAM betyder TCP
  clientSocket.connect((serverName, serverPort))
  message = input('Input lowercase sentence:')
  clientSocket.send(message.encode())
  modifiedMessage = clientSocket.recv(2048)
  print(modifiedMessage.decode())
  clientSocket.close()
#
sa0bxi@learn:~ $