{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Software Entwicklung \n",
    "\n",
    "## Kapitel 9: IO\n",
    "\n",
    "### 9.5 Sockets\n",
    "\n",
    "#### 9.5.4 Client-Socket\n",
    "\n",
    "Da das *Client-Socket* den Server kontaktiert, benötigt es die Adresse und den\n",
    "Port des *Server-Sockets*. Mit <code>connect</code>\n",
    "wird die Verbindung aufgebaut, sofern an der Gegenstelle ein Server\n",
    "im Primitiv <code>accept</code> wartet.\n",
    "\n",
    "Danach folgen Primitive zum Senden\n",
    "<code>send</code> und Empfangen <code>receive</code> von Nachrichten\n",
    "in einer mit dem Server abgestimmten Reihenfolge.\n",
    "\n",
    "Abschließend ist die Verbindung mit <code>close</code> zu schließen. Bei Verwendung eines\n",
    "Kontextmanagers erfolgt dies automatisch."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### 9.5.5 Beispiel für einen Client"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import socket\n",
    "\n",
    "with socket.socket() as client:         # Generieren des Sockets\n",
    "    host = socket.gethostname()         # Server-IP\n",
    "    port = 12345                        # Server-Port\n",
    "\n",
    "    client.connect((host, port))        # Connect\n",
    "    bytes = client.recv(1024)           # Receive\n",
    "    print (bytes.decode('utf-8'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Möchte man ein Socket wie eine Datei behandeln, also statt <code>send</code> und\n",
    "<code>recv</code> lieber <code>write</code> und <code>read</code> verwenden, so kann\n",
    "mit <code>makefile</code> eine \"Hülle\" um das Socket gelegt werden, die die\n",
    "(meisten) Funktionen für Dateien anbietet und übersetzt."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import socket\n",
    "\n",
    "with socket.socket() as client:         # Generieren des Sockets\n",
    "    host = socket.gethostname()         # Server-IP\n",
    "    port = 12345                        # Server-Port\n",
    "\n",
    "    client.connect((host, port))        # Connect\n",
    "    with client.makefile(encoding=\"utf-8\") as file:\n",
    "        text = file.readline()\n",
    "    print (text)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Textnachrichten, die über ein Socket empfangen werden, müssen aus den übertragenen Bytes\n",
    "abgeleitet werden. Nutzt man die Dateischnittstelle, findet die Konvertierung dort statt.\n",
    "\n",
    "    "
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}