python клиент-серверное приложение
Есть у кого клиент серверное-приложение для просмотра файлов. т.е. клиент отправляет путь , сервер получает этот путь, и отправляет все то, что написано в файле. Было бы идеально, если пользователь отправлял, например 1 => нужно получить данные из ФАЙЛА Что есть client
import socket
IP = '127.0.0.1'
PORT = 1005
buffersize = 65535
s = socket.socket()
s.connect((IP, PORT))
print("Соединение с сервером " + IP + ":" + str(PORT) + " установлено.\n")
while True:
print("Команды:")
print("1 Log file посмотреть")
if pckType == 1:
data = input("Введите путь: ")
pckSend = chr(pckType) + data
s.send(bytearray(pckSend, 'utf-8'))
pckRecv = s.recv(buffersize).decode("utf-8")
s.close()
print("Соединение закрыто.")
server
import time
import socket
import threading
from test_for_log import openning
IP = ''
PORT = 1005
backlog = 50
buffersize = 65535
s = socket.socket()
s.bind((IP, PORT))
s.listen(backlog)
print("Порт " + str(PORT) + " прослушивается...")
def new_connect(sock, addr):
def send(pckData):
sock.send(bytearray(pckData, 'utf-8'))
last_message = chr(0)
try:
while True:
data = sock.recv(buffersize).decode("utf-8") # получаем данные
if data == '': break
pckType = ord(data[0]) # первый байт - тип сетевого пакета
if pckType == 1: # 01 - высветить ему лог файл
a = data[1:]
openning(a)
print(addr[0] + " Log file высветить")
sock.close()
print("Соединение " + addr[0] + " закрыто")
while True:
sock, addr = s.accept()
print("Новое соединение от " + addr[0])
threading.Thread(target=new_connect, args=(sock, addr,)).start() # создаем новый поток
test_for_log
import re
# В этом списке собираются подстроки для проверки через in
from typing import List, Any
bad_line_parts = [
'Standby redo logfile selected for thread'
]
bad_reg_exprs = [
re.compile('[A-Z][a-z]{2} [A-Z][a-z]{2} \d{1,2} \d\d:\d\d:\d\d \d{4}'),
# здесь дополнить другими регулярными выражениями, если потребуется
]
def is_fine_line(line):
return (not any(bad_line_part in line
for bad_line_part in bad_line_parts) and
not any(bad_reg_expr.match(line)
for bad_reg_expr in bad_reg_exprs))
def openning(message):
with open(message, 'r') as log_file:
for line in log_file.readlines():
if is_fine_line(line):
print(line)
На сервере получаю, как отправить это клиенту не знаю

Ответы (1 шт):
Автор решения: vadim vaduxa
→ Ссылка
server
import multiprocessing.connection, threading, socket, logging
def server_start(port: int, ip_list: tuple, authkey: bytes) -> dict:
servers = {}
for ip in ip_list:
ip_port = (ip, port)
t = lambda ipp=ip_port: worker(ipp, authkey, work=job, servers=servers)
servers[ip_port] = threading.Thread(target=t, daemon=False)
servers[ip_port].start()
return servers
def worker(ip_port: (str, int), authkey: bytes, work: 'callable', servers: dict, error='') -> None:
while servers.get(ip_port):
with multiprocessing.connection.Listener(ip_port, authkey=authkey) as listener:
with listener.accept() as conn:
try:
conn.send_bytes(work(conn.recv()))
except:
conn.send(error)
logging.error(conn, exc_info=True)
def job(file_name: str) -> bytes:
with open(file_name, 'rb') as f:
return f.read()
if __name__ == '__main__':
h = socket.gethostbyname_ex(socket.gethostname()) # ('DESKTOP-GMS1C57', [], ['192.168.1.44', '17...'])
servers = server_start(port=8080, ip_list=tuple(h[2]), authkey=b'secret')
print(servers) # {('192.168.1.44', 8080): <Thread(Thread-1, started 11420)>, ('17...', 8080): <Thread(Thread-2, started 4364)>}
client
import multiprocessing.connection
def remote_file_text(file_name: str, ip_port: (str, int), authkey: bytes) -> bytes:
with multiprocessing.connection.Client(ip_port, authkey=authkey) as conn:
conn.send(file_name)
try:
return conn.recv_bytes()
except:
raise FileNotFoundError(f'{ip_port} {file_name}')
if __name__ == '__main__':
file_name = 'c:\\Recovery.txt'
ipp = ('192.168.1.44', 8080)
b = remote_file_text(file_name=file_name, ip_port=ipp, authkey=b'secret') # b'my text'
text = b.decode('utf-8', errors='ignore') # "my text"
print(text)