Python: минимальный каркас websocket сервера

Из «коробки» в этом каркасе работа в потоках для обработки каждого сообщения. Собрано на основе пакета websockets.

Все клиенты хранятся в массиве clients. При отключении клиента — из массива он удаляется.

#!/usr/bin/env python3
#encoding: utf-8
import asyncio
import sys
import os
import websockets
from threading import Thread

# массив клиентов
clients=[]

# отправляем сообщение
def SendMessage(connect, message):
    asyncio.run(connect["connect"].send(message))

def MessageProcessing(websocket,message):
  # выясняем от кого обрабатываем сообщения
  for connect in clients:
     if connect["connect"] == websocket:
        print(f"IN: {message}")
        SendMessage(connect,"Hello")

# новый клиент
async def OnNewClient(websocket, path):
        requested_protocols = websocket.request_headers['Sec-WebSocket-Protocol']
        patch = path.strip('/')
        print(f"Новый клиент: {requested_protocols},{patch}")
        try:
          pasket = {}
          pasket["connect"] = websocket
          pasket["host"] = websocket.request_headers['Host']
          clients.append(pasket)
          async for message in websocket:
               th = Thread(target=MessageProcessing, args=(websocket,message,))
               th.start()
        except Exception as e:
            exc_type, exc_obj, exc_tb = sys.exc_info()
            fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
            print(f"Прерывание: {e} ({fname},строка: {exc_tb.tb_lineno})")

        finally:
            print(f"соединение закрыто..")
            for connect in clients:
                if connect["connect"]==websocket:
                    clients.remove(connect)

async def main():
  async with websockets.serve(OnNewClient, "0.0.0.0", 35609,subprotocols=["virtual"]):
    print("сервер стартовал и ждёт клиентов")
    await asyncio.Future()

asyncio.run(main())

PHP AMP Websocket: указание произвольных заголовков при рукопожатии

Задача: добавить произвольный заголовок клиенту при рукопожатии с сервером. Например Sec-WebSocket-Protocol

Решение:

use Amp\Delayed;
use Amp\Websocket\Client\Connection;
use Amp\Websocket\Client\Handshake;
use Amp\Websocket\Message;
use function Amp\Websocket\Client\connect;
use Amp\Socket\ClientTlsContext;
use Amp\Socket\ConnectContext;

            Amp\Loop::run(function () use ($wss_url,$ip,$port,$pascket,&$answer,$wait_reseive) {                            
                $tlsc=new ClientTlsContext("");
                $tlw=$tlsc->withoutPeerVerification();
                $connectContext = (new ConnectContext)->withTlsContext($tlw);
                $handshake = (new Handshake("ws://1.18.24.70:$port/virtual_api_1c"))->withHeader('Sec-WebSocket-Protocol', 'virtual');  
                $connection = yield connect($handshake,$connectContext);   
                yield $connection->send($pascket);
                yield $connection->close();
            });  

NetBeans 14 и поддержка Python

Начиная с версии 8.1, python плагины не поддерживаются официально и установить из самой IDE их нельзя, однако неофициальные плагины таки существуют.

Скачать пакет с плагинами можно здесь

Установка: Tools -> Plugins -> Downloaded -> Add Plugins

PostgreSQL: вывод числа в виде значения часы:минуты:секунды

Задача: в одной из колонок хранятся секунды в виде значения int, необходимо при выводе преобразовать их по маске hh:mm:ss

Решение:

TO_CHAR((docs_charge.duration || ' second')::interval, 'HH24:MI:SS') as duration

Selenium: дождаться окончания всех закачек в браузере

К сожалению стандартного API нет для того чтобы получить данные о текущих закачках. Потому как вариант можно отслеживать наличие файлов с расширением crdownload:


save_path="X:\\new\\";

async function sys_sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
};

(async () => {
    const fs = require('fs');
    yet=true;
    while (yet==true) {
        console.log("--ждём пока не закончатся все закачки...");
        fs.readdir(save_path, (err, files) => {
          cnt=0;  
          files.forEach(file => {
            console.log(file);
            if (file.indexOf('down')>0){cnt++;};
          });
          if (cnt==0){
            console.log("Дождались..");  
            yet=false; 
          };
        });
         await sys_sleep(1000);
    };
})();
1 2