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())

Перебор комбинаций 0 и 1 в битах

Задача: вычислить все возможные комбинации 0 и 1 в битовом числе.

Решение: применим комбинаторику. Реализовано аж в двух языках 😉

Pyhon:

n=int(input("n="))
res=[]
for i in range(2**n):
    s=""
    for j in range(n):
        s=str(i%2)+s
        i=i//2
    res.append(s)
print(res)

PHP:

$n=5;
$res=[];
for ($i = 1; $i <= 2**$n; $i++) {
    $s="";    
    $z=$i;
    for ($j = 1; $j <= $n; $j++) {
      $s=(string)($z%2).$s;      
      $z=intdiv($z,2);      
    };  
    $res[]=$s;
}
var_dump($res);

UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position

Довольно распространенная проблема для скриптов на Pyhton которые переносишь на другой сервер. А ларчик обычно открывается просто — в скрипте используются символы UTF-8, а локаль консоли куда выводятся данные — скорее всего просто en_US, не UTF8.

Решение:

Далее выбираем все ru_RU.xx, и консоль по умолчанию в en_US.UTF-8




INSERT / UPDATE в MySQL на Python

Ну в принципе и не на Python, важен принцип. Что мне нужно? Если UPDATE завершился ошибкой (данные не обновлены т.к. их нет), тогда INSERT. Вообще в MYSQL есть специальная команда — REPLACE, у которой синтаксис такой-же как у INSERT, за исключением того, что если такая запись уже есть, то она просто измениться. Одно НО. Таблица обязательно должна содержать колонки с UNIQUE. А если их нет, и добавить нельзя? Тогда к сожалению придется «отлавливать» результат выполнения UPDATE — а именно количество изменившихся записей. Если 0 — считаем что такой записи вообще нет, и вставляем. На Python нечто подобное реализовать можно вот так:




Как удалить последний символ строки на python

Оказывается совсем просто:

Например:




1 4 5 6 7 8 13