From d811b20d8f157910e61ce66623c17215e0b4f730 Mon Sep 17 00:00:00 2001 From: stud204002 Date: Thu, 16 Apr 2026 23:11:14 +0300 Subject: [PATCH] Laboratory work #3: TCP/UDP, HTTP requests, Gitea API --- .gitignore | 6 ++++++ README.md | 32 ++++++++++++++++++++++++++++++++ gitea_api.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ http_requests.py | 4 ++++ http_socket.py | 9 +++++++++ tcp_client.py | 8 ++++++++ tcp_server.py | 17 +++++++++++++++++ udp_client.py | 7 +++++++ udp_server.py | 10 ++++++++++ 9 files changed, 137 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 gitea_api.py create mode 100644 http_requests.py create mode 100644 http_socket.py create mode 100644 tcp_client.py create mode 100644 tcp_server.py create mode 100644 udp_client.py create mode 100644 udp_server.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2083e7f --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.venv/ +.env +__pycache__/ +*.pyc +.vs/ +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce7dddc --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Laboratory work #3: Network connections in Python + +## Completed tasks + +1. **TCP client-server** (port 10000) +2. **UDP client-server** (port 10001) +3. **HTTP requests** (vyatsu.ru) +4. **Gitea API** (repository creation) + +## How to run + +```bash +# Activate virtual environment +.venv\Scripts\activate + +# Run TCP +py tcp_server.py +py tcp_client.py + +# Run UDP +py udp_server.py +py udp_client.py + +# HTTP requests +py http_socket.py +py http_requests.py + +# Gitea API (add token to .env first) +py gitea_api.py + +## Author +Ончурова Полина Алексеевна, ИНБб-2301-02-00 \ No newline at end of file diff --git a/gitea_api.py b/gitea_api.py new file mode 100644 index 0000000..4e3a998 --- /dev/null +++ b/gitea_api.py @@ -0,0 +1,44 @@ +import os +import requests +from dotenv import load_dotenv + +load_dotenv() + +TOKEN = os.getenv('GITEA_TOKEN') +BASE_URL = os.getenv('GITEA_URL', 'https://git.vyatsu.ru') + +def get_user_info(): + headers = {"Authorization": f"token {TOKEN}"} + response = requests.get(f"{BASE_URL}/api/v1/user", headers=headers) + if response.status_code == 200: + user = response.json() + print(f"User: {user.get('login')}") + print(f"Email: {user.get('email')}") + return user + else: + print(f"Error: {response.status_code}") + return None + +def create_repository(repo_name): + headers = { + "Authorization": f"token {TOKEN}", + "Content-Type": "application/json" + } + data = { + "name": repo_name, + "description": "Laboratory work #3: Network programming", + "private": False + } + response = requests.post(f"{BASE_URL}/api/v1/user/repos", headers=headers, json=data) + if response.status_code == 201: + repo = response.json() + print(f"Repository created: {repo.get('html_url')}") + return repo + else: + print(f"Error: {response.status_code}") + return None + +if __name__ == "__main__": + user = get_user_info() + if user: + create_repository(f"lab3-{user.get('login')}") \ No newline at end of file diff --git a/http_requests.py b/http_requests.py new file mode 100644 index 0000000..83588ae --- /dev/null +++ b/http_requests.py @@ -0,0 +1,4 @@ +import requests + +response = requests.get("http://vyatsu.ru") +print(response.text[:500]) \ No newline at end of file diff --git a/http_socket.py b/http_socket.py new file mode 100644 index 0000000..4c1fa7e --- /dev/null +++ b/http_socket.py @@ -0,0 +1,9 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client.connect(('vyatsu.ru', 80)) +request = "GET / HTTP/1.1\r\nHost: vyatsu.ru\r\n\r\n" +client.sendall(request.encode()) +response = client.recv(4096) +print(response.decode()) +client.close() \ No newline at end of file diff --git a/tcp_client.py b/tcp_client.py new file mode 100644 index 0000000..6ab5f0a --- /dev/null +++ b/tcp_client.py @@ -0,0 +1,8 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +client.connect(('127.0.0.1', 10000)) +client.sendall(b'hello server') +data = client.recv(1024) +print(f"Server response: {data.decode()}") +client.close() \ No newline at end of file diff --git a/tcp_server.py b/tcp_server.py new file mode 100644 index 0000000..4cf6c16 --- /dev/null +++ b/tcp_server.py @@ -0,0 +1,17 @@ +import socket + +server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server.bind(("0.0.0.0", 10000)) +server.listen(1) +print("TCP server started on port 10000") + +while True: + conn, addr = server.accept() + print(f"Connection from {addr}") + data = conn.recv(1024) + if not data: + break + conn.sendall(data.upper()) + conn.close() + if data.upper() == b'EXIT': + break \ No newline at end of file diff --git a/udp_client.py b/udp_client.py new file mode 100644 index 0000000..0f440f4 --- /dev/null +++ b/udp_client.py @@ -0,0 +1,7 @@ +import socket + +client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +client.sendto(b'hello server', ('127.0.0.1', 10001)) +data, _ = client.recvfrom(1024) +print(f"Server response: {data.decode()}") +client.close() \ No newline at end of file diff --git a/udp_server.py b/udp_server.py new file mode 100644 index 0000000..d39999c --- /dev/null +++ b/udp_server.py @@ -0,0 +1,10 @@ +import socket + +server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +server.bind(('0.0.0.0', 10001)) +print("UDP server started on port 10001") + +while True: + data, addr = server.recvfrom(1024) + print(f"Message from {addr}: {data.decode()}") + server.sendto(data.upper(), addr) \ No newline at end of file