Реализация DI в PHP
Jason-Webb 13.05.2025
Когда я начинал писать свой первый крупный PHP-проект, моя архитектура напоминала запутаный клубок спагетти. Классы создавали другие классы внутри себя, зависимости жостко прописывались в коде, а о. . .
Обработка изображений в реальном времени на C# с OpenCV
stackOverflow 13.05.2025
Объединение библиотеки компьютерного зрения OpenCV с современным языком программирования C# создаёт симбиоз, который открывает доступ к впечатляющему набору возможностей. Ключевое преимущество этого. . .
POCO, ACE, Loki и другие продвинутые C++ библиотеки
NullReferenced 13.05.2025
В C++ разработки существует такое обилие библиотек, что порой кажется, будто ты заблудился в дремучем лесу. И среди этого многообразия POCO (Portable Components) – как маяк для тех, кто ищет. . .
Паттерны проектирования GoF на C#
UnmanagedCoder 13.05.2025
Вы наверняка сталкивались с ситуациями, когда код разрастается до неприличных размеров, а его поддержка становится настоящим испытанием. Именно в такие моменты на помощь приходят паттерны Gang of. . .
Создаем CLI приложение на Python с Prompt Toolkit
py-thonny 13.05.2025
Современные командные интерфейсы давно перестали быть черно-белыми текстовыми программами, которые многие помнят по старым операционным системам. CLI сегодня – это мощные, интуитивные и даже. . .
Конвейеры ETL с Apache Airflow и Python
AI_Generated 13.05.2025
ETL-конвейеры – это набор процессов, отвечающих за извлечение данных из различных источников (Extract), их преобразование в нужный формат (Transform) и загрузку в целевое хранилище (Load). . . .
Выполнение асинхронных задач в Python с asyncio
py-thonny 12.05.2025
Современный мир программирования похож на оживлённый мегаполис – тысячи процессов одновременно требуют внимания, ресурсов и времени. В этих джунглях операций возникают ситуации, когда программа. . .
Работа с gRPC сервисами на C#
UnmanagedCoder 12.05.2025
gRPC (Google Remote Procedure Call) — открытый высокопроизводительный RPC-фреймворк, изначально разработанный компанией Google. Он отличается от традиционых REST-сервисов как минимум тем, что. . .
CQRS (Command Query Responsibility Segregation) на Java
Javaican 12.05.2025
CQRS — Command Query Responsibility Segregation, или разделение ответственности команд и запросов. Суть этого архитектурного паттерна проста: операции чтения данных (запросы) отделяются от операций. . .
Шаблоны и приёмы реализации DDD на C#
stackOverflow 12.05.2025
Когда я впервые погрузился в мир Domain-Driven Design, мне показалось, что это очередная модная методология, которая скоро канет в лету. Однако годы практики убедили меня в обратном. DDD — не просто. . .
При «ручном» прогоне плагина выходит ошибка —
>>> RESTART: C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py
registering command: blk
registering command: hi
Traceback (most recent call last):
File "C:\Users\andrew\Documents\Minecraft Python\py\plugins\JuicyRaspberryPie\mcpi\pycmdsvr.py", line 84, in <module>
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 453, in __init__
self.server_bind()
File "C:\Users\andrew\AppData\Local\Programs\Python\Python36-32\lib\socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [WinError 10048] Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Spigot выдаёт при этом ошибку —
[08:44:55 WARN]: java.net.ConnectException: Connection refused: connect
[08:44:55 WARN]: at java.net.DualStackPlainSocketImpl.connect0(Native Method)
[08:44:55 WARN]: at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
[08:44:55 WARN]: at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.PlainSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.SocksSocketImpl.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.connect(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]: at java.net.Socket.<init>(Unknown Source)
[08:44:55 WARN]: at org.wensheng.plugins.JuicyRaspberryPie.onCommand(JuicyRaspberryPie.java:153)
[08:44:55 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[08:44:55 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[08:44:55 WARN]: at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:649)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[08:44:55 WARN]: at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[08:44:55 WARN]: at java.util.concurrent.FutureTask.run(Unknown Source)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[08:44:55 WARN]: at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[08:44:55 WARN]: at java.lang.Thread.run(Unknown Source)
Файл на который ругается —
# wenshengwang at gmail dot com
# BSD License
"""This is a TCP server. It is started by the JuicyRaspberryPie plugin and
listen on localhost port 32123.
When it start, it scan the "pplugins" directory for any python files and try
to load them as modules, in these modules, it search for any functions whose
docstring starts with "_mcp" and register them as commands.
When the server receive a command, if it matches one in the registry, it will
be executed. If not, it will execute a dummy command.
"""
import os
import sys
import glob
import socketserver
import threading
import types
import importlib
plugin_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, plugin_dir)
from mcpi.minecraft import Minecraft
HOST = 'localhost'
# TODO: read port from config.yml
PORT = 4444
KEEP_RUNNING = True
def keep_running():
return KEEP_RUNNING
# command registry
mc_functions = {}
pp_files = glob.glob(os.path.join(plugin_dir, "pplugins", "*.py"))
# import all files and put minecraft function into the mc_functions dict
for pp_file in pp_files:
basename = os.path.basename(pp_file)
if basename != "__init__.py":
try:
module = importlib.import_module("pplugins." + basename[:-3])
for item in dir(module):
if isinstance(module.__dict__[item], types.FunctionType):
docs = module.__dict__[item].__doc__
if docs and docs.startswith("_mcp"):
print("registering command:", module.__dict__[item].__name__)
mc_functions[item] = module.__dict__[item]
except (NameError, ImportError) as e:
print(e)
def chat(msg="Whaaat?!"):
mc = Minecraft.create()
mc.postToChat(msg)
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
global KEEP_RUNNING
self.data = self.request.recv(1024)
# firt 2 bytes are length info, from Java's writeUTF
args = self.data[2:].decode('utf-8').split()
cmd = args[0]
if cmd == "list":
s = "Available commands: %s" % ( " ".join(list(mc_functions.keys())))
self.request.sendall(s.encode('utf-8'))
threading.Thread(target=chat, args=(s,), kwargs={}).start()
return
if cmd == "help":
s = 'JuicyRaspberryPie: put your Python files in pplugins, then "/p cmd" to call your function, "/p list" to see list of commands'
self.request.sendall(s.encode('utf-8'))
threading.Thread(target=chat, args=(s,), kwargs={}).start()
return
if cmd == "BYE":
print("got shutdown request, signing off")
KEEP_RUNNING = False
return
threading.Thread(target=mc_functions.get(cmd, chat), args=tuple(args[1:]), kwargs={}).start()
self.request.sendall("ok".encode('utf-8'))
if __name__ == "__main__":
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
def server_serve():
while keep_running():
server.handle_request()
threading.Thread(target=server_serve).start()
������� Process Explorer, ����� ��� �������� 1� (� ��� ����� ���������) � ����� ��.
������� �� ��������� �������:
1. ����������� ��������� �������� ������. �� ��������� �� 5000, ����� ���������� �� 65536.
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
2. ����� ��������� ����� ���������� ���������� � ��������� �������� � 4 ����� �� 30 ������.
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\TCPTimedWaitDelay 3. ������� ���� (���������, �������� � ��.) ���������� ����� 1� �������, ������������ ������� ��������, � ��� ������� ��� ������ ��� ��������. ���� � ���������� - ����� ����������! :)
What does «»Only one usage of each socket address (protocol/network address/port) is normally permitted» mean?
This error means all available ports on the machine are being exhausted.
By default the OS only has around 4000 ports available that are not reserved by the system. When any network connection is closed, it goes into a TIME_WAIT state for 240 seconds and cannot be reused until this wait state is over.
For example, if there are 16 connections per second for 4 minutes (16*4*60=3840), you will exhaust all the ports shortly thereafter. If HAS and the MTA are on the same machine, this exhaustion will occur sooner. This is because in addition to them communicating with one another and taking up two ports, the MTA uses a significant number of ports to send mail.
How do I resolve this error?
You can fix this by modifying the below values.
-
Increase the dynamic port range. The max by default is 5000. You can set this up to 65534. HKLMSystemCurrentControlSetServicesTcpipParametersMaxUserPort is the
key to use. -
Reduce the TIME_WAIT state. The default setting is 4 minutes, but you can set this to 30 seconds. HKLMSystemCurrentControlSetServicesTcpipParametersTCPTimedWaitDelay is the key to use.
After these changes are made, the system must be restarted.
For more information, please refer to this Microsoft article.
Сообщ.
#1
,
Member
Рейтинг (т): 7
Привет. Пытаюсь сделать простого клиента, который подсоединяется к серверу. Клиент должен быть запущен на определенном порту, т.е. вызываю bind.
Сервер привязывается к 127.0.0.1:7777 а клиент к 127.0.0.1:7778. Система WinXP SP3.
И вот какая странная штука получается: клиент работает без ошибок через раз! Т.е. бывает нормально идут соединения а бывает следующая ошибка: когда я подсоединяюсь к серверу, то первый раз все работает отлично (и bind, и connect), клиент и сервер обмениваются сообщениями. После этого клиент завершается и обязательно вызывается WSACleanup и даже не нужный для Windows Sockets 2 WSACancelBlockingCall(на всякий случай)! И когда я снова пытаюсь подсоединится к серверу вылетает следующая ошибка WSAEADDRINUSE(10048)(Обычно разрешается одно использование адреса сокета).
Причем странно, что это ошибка вылезает после вызова connect, хотя перед этим вызов bind происходит без ошибки!? Даже когда полностью закрываешь приложение клиента все равно вылезает ошибка.
Я решил посмотреть какие коннекты есть в системе и выяснилось, что после того как сервер и клиент обменяются информацией и оба закроют сокеты в системе остается соединение с именем процесса [System Process] и остальными данными точно такими же как и у акцептованного сервером сокета (входящее с 127.0.0.01:7778 на 127.0.0.01:7777).
Это соединение через пару минут пропадает и странно, что OutpostFirewall его не видит вообще. Я поначалу думал, что это из-за фаерволла, но отключив его да и антивирус вдобавок, убедился, что ошибка все равно возникает.
Дальше я пробую установить в 1 для клиента с помощью setsockopt параметр SO_REUSEADDR, который разрешает — «Allow the socket to be bound to an address which is already in use». Все равно та же ошибка вылетает!
Далее я пробую разные версии библиотеки Windows Sockets DLL от 1 до 2.2. Все равно та же ошибка!
Странно также, что сервер запускается и останавливается без проблем без оставления каких-либо соединений с именем [System Process]. Это соединение остается в системе на некоторое время только когда происходит операция accept сервера для клиента, т.е. когда сервер создает параллельное соединение(входящее с 127.0.0.1:7778 на 127.0.0.0.1:7777). Т.е. получается как бы именно этот сокет «превращается» в [System Process] после того как и клиент, и сервер закрывают свои сокеты. Причем даже при закрытии приложения сервера все равно остается в системе на некоторое время(3-4 мин.).
Может кто сталкивался с проблемой? Понимаю, что если клиент и сервер будут на разных компьютерах, то проблеиы в принципе не будет. Также если не использовать bind для клиента, то все вроде бы работает, но эти [System Process] остаются для каждого коннекта клиента акцептованного сервером, просто порты назначаются каждый раз новые и ошибки WSAEADDRINUSE не происходит.
PS: Т.е. получается система как бы блокирует порт, который использовался для соединений на какое-то время! Но Брандмауэр Windows отключен…
Сообщение отредактировано: Grad —