Skip to content
This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions lab3c(var11)/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import socket
import sys
import threading
import time
import datetime

if len(sys.argv) != 3:
print("Select IP and server port!")
sys.exit()

server = (sys.argv[1], int(sys.argv[2]))

# connect to server
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(server)


def receive_prod(client):
while True:
try:
p_id = client.recv(4)
cnt = client.recv(2)
price = client.recv(4)
name_len = client.recv(2)
length = int.from_bytes(name_len, byteorder='big')
name = client.recv(length)
except ConnectionResetError:
print("Connection reset")
return dict()

return {'id': p_id, 'cnt': cnt, 'price': price, 'name_len': name_len, 'name': name}


def receiving():
while True:
try:
flag = int.from_bytes(client.recv(1), byteorder='big')
if flag == 0x81:
print("Successful")
elif flag == 0x82:
print("Информация о товарах")
prod_cnt = int.from_bytes(client.recv(2), byteorder='big')
print("Кол-во товаров: {}".format(prod_cnt))
for i in range(prod_cnt):
prod = receive_prod(client)
print("ID товара: {}\n\tНазвание: {}\n\tКол-во: {}\n\tЦена: {}".format(
int.from_bytes(prod['id'], byteorder='big'),
prod['name'].decode('ascii'),
int.from_bytes(prod['cnt'], byteorder='big'),
int.from_bytes(prod['price'], byteorder='big')
))
elif flag == 0xC2:
print("Ошибка добавления")
elif flag == 0xC3:
print("Ошибка покупки")
except Exception as e:
# Any other exception - something bad happened, exit
print('Reading error: ' + str(e))
client.close()
sys.exit()


# send to server
def write():
while True:
print("1 - Получить информацию\n2 - Добваить товар\n3 - Купить товар")
try:
message = int(input("Действие: "))
if message == 1:
client.send(0x01.to_bytes(1, byteorder='big'))
elif message == 2:
print("Добавление товара")
name = input("Имя товара: ")
cnt = int(input("Кол-во товара: "))
price = int(input("Цена товара: "))
name_len = len(name).to_bytes(2, byteorder='big')
client.send(0x02.to_bytes(1, byteorder='big') +
cnt.to_bytes(2, byteorder='big') +
price.to_bytes(4, byteorder='big') +
name_len + name.encode('ascii'))
elif message == 3:
print("Покупка товара")
p_id = int(input("ID товара: "))
cnt = int(input("Кол-во товара: "))
client.send(0x03.to_bytes(1, byteorder='big') +
cnt.to_bytes(2, byteorder='big') +
p_id.to_bytes(4, byteorder='big'))
except ValueError:
print("Неверный ввод")
time.sleep(1)


# start thread for listening and sending
receive_thread = threading.Thread(target=receiving)
receive_thread.start()
# write()

write_thread = threading.Thread(target=write)
write_thread.start()
95 changes: 95 additions & 0 deletions lab3c(var11)/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import socket
import threading
import time
import datetime

# connection
host = '127.0.0.1'
port = 9090

# start
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host, port))
server.listen(10)

clients = []
nicknames = {}
prod = {}
nextId = 1
print(f"Server Started!")


# receive messages from clients
def receive_prod(client):
while True:
try:
cnt = client.recv(2)
price = client.recv(4)
name_len = client.recv(2)
length = int.from_bytes(name_len, byteorder='big')
name = client.recv(length)
except ConnectionResetError:
print("Connection reset")
return dict()

return {'cnt': cnt, 'price': price, 'name_len': name_len, 'name': name}


def handle(client):
global nextId
while True:
try:
flag = int.from_bytes(client.recv(1), byteorder='big')
if flag == 1:
print("Запрос на получение информации о товарах")
client.send(0x82.to_bytes(1, byteorder='big') + len(prod).to_bytes(2, byteorder='big'))
for p in prod.keys():
client.send(p.to_bytes(4, byteorder='big') + prod[p]['cnt'] +
prod[p]['price'] + prod[p]['name_len'] + prod[p]['name'])
elif flag == 2:
print("Запрос на добавление товара")
p = receive_prod(client)
f_id = 0
for p_id in prod.keys():
if prod[p_id]['name'] == p['name']:
if prod[p_id]['price'] != p['price']:
f_id = -1
else:
f_id = p_id
break
if f_id == 0:
prod[nextId] = p
nextId += 1
client.send(0x81.to_bytes(1, byteorder='big'))
elif f_id == -1:
client.send(0xC2.to_bytes(1, byteorder='big'))
else:
cnt = int.from_bytes(prod[f_id]['cnt'], byteorder='big')
p_cnt = int.from_bytes(p['cnt'], byteorder='big')
cnt += p_cnt
prod[f_id]['cnt'] = cnt.to_bytes(2, byteorder='big')
client.send(0x81.to_bytes(1, byteorder='big'))
elif flag == 3:
print("Запрос на покупку товара")
cnt = client.recv(2)
prod_id = int.from_bytes(client.recv(4), byteorder='big')
try:
if int.from_bytes(prod[prod_id]['cnt'], byteorder='big') < int.from_bytes(cnt, byteorder='big'):
client.send(0xC3.to_bytes(1, byteorder='big'))
else:
p_cnt = int.from_bytes(prod[prod_id]['cnt'], byteorder='big')
p_cnt -= int.from_bytes(cnt, byteorder='big')
prod[prod_id]['cnt'] = p_cnt.to_bytes(2, byteorder='big')
client.send(0x81.to_bytes(1, byteorder='big'))
except KeyError:
client.send(0xC3.to_bytes(1, byteorder='big'))
except ConnectionResetError:
print('Connection from {} was closed'.format(client.getpeername()))
break


while True:
# thread for clients
client_socket, address_socket = server.accept()
thread = threading.Thread(target=handle, args=[client_socket]).start()
110 changes: 110 additions & 0 deletions lab3s(var2)/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import socket
import sys
import threading
import time
import datetime

if len(sys.argv) != 3:
print("Select IP and server port!")
sys.exit()

server = (sys.argv[1], int(sys.argv[2]))

# connect to server
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(server)


def type_dec(type):
if type == 1:
return "Директория"
else:
return "Файл"


def receiving():
while True:
try:
flag = int.from_bytes(client.recv(1), byteorder='big')
if flag == 0x81:
print("Successful")
elif flag == 0x82:
print("Получение файла")
name_len = int.from_bytes(client.recv(2), byteorder='big')
name_enc = client.recv(name_len)
name = name_enc.decode('utf-8')
file_len = int.from_bytes(client.recv(4), byteorder='big')
file = client.recv(file_len)
print("Получен файл: {}".format(name))
f = open(name, 'wb')
f.write(file)
f.close()
elif flag == 0x83:
print("Вывод каталога")
cnt = int.from_bytes(client.recv(2), byteorder='big')
for i in range(cnt):
type = int.from_bytes(client.recv(1), byteorder='big')
name_len = int.from_bytes(client.recv(2), byteorder='big')
name_enc = client.recv(name_len)
name = name_enc.decode('utf-8')
print("{}: {}".format(type_dec(type), name))
elif flag == 0xC1:
print("Ошибка получения")
elif flag == 0xC2:
print("Ошибка просмотра")
elif flag == 0xC3:
print("Ошибка отправления")
elif flag == 0xC4:
print("Ошибка перехода")
except Exception as e:
# Any other exception - something bad happened, exit
print('Reading error: ' + str(e))
client.close()
sys.exit()


# send to server
def write():
while True:
print("1 - Отправка файла\n2 - Просмотр каталога\n3 - Получение файла\n4 - Переход к директории")
try:
message = int(input("Действие: "))
if message == 1:
print("Отправка файла")
name = input("Имя файла: ")
f = open(name, 'rb')
file = f.read()
client.send(0x01.to_bytes(1, byteorder='big'))
client.send(len(name.encode('utf-8')).to_bytes(2, byteorder='big') +
name.encode('utf-8') +
len(file).to_bytes(4, byteorder='big') +
file)
elif message == 2:
print("Просмотр директории")
client.send(0x02.to_bytes(1, byteorder='big'))
elif message == 3:
print("Получение файла")
name = input("Имя файла: ")
name_enc = name.encode('utf-8')
client.send(0x03.to_bytes(1, byteorder='big') +
len(name_enc).to_bytes(2, byteorder='big') + name_enc)
elif message == 4:
print("Переход к директории")
directory = input("Директория: ")
dir_enc = directory.encode('utf-8')
client.send(0x04.to_bytes(1, byteorder='big') +
len(dir_enc).to_bytes(2, byteorder='big') + dir_enc)
except ValueError:
print("Неверный ввод")
except FileNotFoundError:
print("Файл не найден")
time.sleep(1)


# start thread for listening and sending
receive_thread = threading.Thread(target=receiving)
receive_thread.start()
# write()

write_thread = threading.Thread(target=write)
write_thread.start()
88 changes: 88 additions & 0 deletions lab3s(var2)/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import socket
import threading
import os
import time
import datetime
from os import path

# connection
host = '127.0.0.1'
port = 9090

# start
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host, port))
server.listen(10)

clients = []
nicknames = {}
prod = {}
nextId = 1
print(f"Server Started!")


def handle(client):
cur = path.abspath(os.getcwd())
global nextId
while True:
try:
flag = int.from_bytes(client.recv(1), byteorder='big')
if flag == 1:
print("Получение файла")
name_len = int.from_bytes(client.recv(2), byteorder='big')
name = client.recv(name_len)
file_len = int.from_bytes(client.recv(4), byteorder='big')
file = client.recv(file_len)
try:
f = open(path.join(cur, name.decode('utf-8')), 'wb')
f.write(file)
f.close()
client.send(0x81.to_bytes(1, byteorder='big'))
except:
client.send(0xC1.to_bytes(1, byteorder='big'))
elif flag == 2:
print("Просмотр каталога")
client.send(0x83.to_bytes(1, byteorder='big'))
cnt = len(os.listdir(cur))
client.send(cnt.to_bytes(2, byteorder='big'))
for f in os.listdir(cur):
if path.isfile(path.join(cur, f)):
client.send(0x02.to_bytes(1, byteorder='big'))
else:
client.send(0x01.to_bytes(1, byteorder='big'))
name_enc = f.encode('utf-8')
client.send(len(name_enc).to_bytes(2, byteorder='big') + name_enc)
elif flag == 3:
print("Отправление файла")
name_len = int.from_bytes(client.recv(2), byteorder='big')
name = client.recv(name_len).decode('utf-8')
try:
f = open(path.join(cur, name), 'rb')
file = f.read()
f.close()
client.send(0x82.to_bytes(1, byteorder='big') +
name_len.to_bytes(2, byteorder='big') +
name.encode('utf-8') +
len(file).to_bytes(4, byteorder='big') +
file)
except:
client.send(0xC3.to_bytes(1, byteorder='big'))
elif flag == 4:
print("Переход к директории")
name_len = int.from_bytes(client.recv(2), byteorder='big')
name = client.recv(name_len).decode('utf-8')
if path.exists(path.join(cur, name)) and path.isdir(path.join(cur, name)):
cur = path.join(cur, name)
client.send(0x81.to_bytes(1, byteorder='big'))
else:
client.send(0xC4.to_bytes(1, byteorder='big'))
except ConnectionResetError:
print('Connection from {} was closed'.format(client.getpeername()))
break


while True:
# thread for clients
client_socket, address_socket = server.accept()
thread = threading.Thread(target=handle, args=[client_socket]).start()