C-подобные структуры в Python

Вы должны тщательно проверить полную трассировку,

У меня есть приложение для подключения к серверу и исправлено случай java.net.SocketException: Connection reset.

В моем случае это происходит при чтении из clientSocket Socket, который по какой-то причине закрыл свое соединение. (Потеря сети, брандмауэр или крах приложения или предполагаемый конец)

На самом деле я восстанавливал соединение, когда получал ошибку при чтении с этого объекта Socket.

Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!

Интересный вещь for my JAVA Socket, если клиент подключается к моему ServerSocket и закрывает его соединение, не отправляя ничего is.read() вызывает себя рекурсивно. Кажется, из-за того, что он находится в бесконечном цикле для чтения из этого сокета, вы пытаетесь читать из закрытого подключение. Если вы используете что-то вроде ниже для операции чтения,

while(true)
{
  Receive();
}

Затем вы получаете stackTrace что-то вроде ниже и на

java.net.SocketException: Socket is closed
    at java.net.ServerSocket.accept(ServerSocket.java:494)

. Я только что закрыл ServerSocket и обновил мое соединение и ожидание дальнейших входящих клиентских подключений

String Receive() throws Exception
{
try {                   
            int readed = is.read();
           ....
}catch(Exception e)
{
        tryReConnect();
        logit(); //etc
}


//...
}

Это восстанавливает мое соединение для неизвестного потерянного сокета клиента

private void tryReConnect()
        {
            try
            {
                ServerSocket.close();
                //empty my old lost connection and let it get by garbage col. immediately 
                clientSocket=null;
                System.gc();
                //Wait a new client Socket connection and address this to my local variable
                clientSocket= ServerSocket.accept(); // Waiting for another Connection
                System.out.println("Connection established...");
            }catch (Exception e) {
                String message="ReConnect not successful "+e.getMessage();
                logit();//etc...
            }
        }

Я не мог найти другого пути, потому что, как вы видите из ниже изображения вы не можете понять, потеряна ли связь или нет без try and catch, потому что все кажется правильным. Я получил этот снимок, пока я непрерывно получал Connection reset.

393
задан Ben McCormick 20 September 2014 в 13:45
поделиться

6 ответов

Используйте названный кортежем , который был добавлен к эти модуль наборов в стандартной библиотеке в Python 2.6. Также возможно использовать Raymond Hettinger названный кортежем рецепт, если необходимо поддерживать Python 2.4.

, Это хорошо для основного примера, но также и покрывает набор пограничных случаев, с которыми Вы могли бы столкнуться позже также. Ваш фрагмент выше был бы записан как:

from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")

недавно созданный тип может использоваться как это:

m = MyStruct("foo", "bar", "baz")

можно также использовать параметры, передаваемые по имени:

m = MyStruct(field1="foo", field2="bar", field3="baz")
322
ответ дан gz. 20 September 2014 в 13:45
поделиться

Можно также передать init параметры переменным экземпляра положением

# Abstract struct class       
class Struct:
    def __init__ (self, *argv, **argd):
        if len(argd):
            # Update by dictionary
            self.__dict__.update (argd)
        else:
            # Update by position
            attrs = filter (lambda x: x[0:2] != "__", dir(self))
            for n in range(len(argv)):
                setattr(self, attrs[n], argv[n])

# Specific class
class Point3dStruct (Struct):
    x = 0
    y = 0
    z = 0

pt1 = Point3dStruct()
pt1.x = 10

print pt1.x
print "-"*10

pt2 = Point3dStruct(5, 6)

print pt2.x, pt2.y
print "-"*10

pt3 = Point3dStruct (x=1, y=2, z=3)
print pt3.x, pt3.y, pt3.z
print "-"*10
17
ответ дан PabloG 20 September 2014 в 13:45
поделиться
  • 1
    Вы - долбаное жизненное средство сохранения! Бог спасибо для этого-lier... – Cody Smith 18 July 2013 в 14:22

dF: это довольно прохладно... Я не знал, что мог получить доступ к полям в классе с помощью dict.

Mark: ситуации, что мне жаль, что у меня не было этого, состоят точно в том, когда я хочу кортеж, но ничто столь же "тяжелое" как словарь.

можно получить доступ к полям класса с помощью словаря, потому что поля класса, его методов и всех его свойств хранятся внутренне с помощью dicts (по крайней мере, в CPython).

... Который приводит нас к Вашему второму комментарию. Полагать, что Python dicts "тяжел", чрезвычайно non-pythonistic понятие. И чтение таких комментариев уничтожает мою Дзэн Python. Это не хорошо.

Вы видите, когда Вы объявляете класс, Вы на самом деле создаете довольно сложную обертку вокруг словаря - так, во всяком случае, Вы добавляете больше служебное, чем при помощи простого словаря. Издержки, которые, между прочим, бессмысленно в любом случае. Если Вы работаете над важными приложениями производительности, используйте C или что-то.

26
ответ дан ArtOfWarfare 20 September 2014 в 13:45
поделиться
  • 1
    +1: Это - единственная версия, которая работала на меня перекрестный браузер. – Volker Rose 23 August 2012 в 12:24

Как насчет словаря?

Что-то вроде этого:

myStruct = {'field1': 'some val', 'field2': 'some val'}

Тогда можно использовать это для управления значениями:

print myStruct['field1']
myStruct['field2'] = 'some other values'

И значения не должны быть строки. Они могут быть в значительной степени любым другим объектом.

64
ответ дан Mark Biek 20 September 2014 в 13:45
поделиться

Можно использовать кортеж для большого количества вещей, где Вы использовали бы структуру в C (что-то как x, y координаты или RGB окрашивает, например).

Для всего остального можно использовать словарь или служебный класс как этот :

>>> class Bunch:
...     def __init__(self, **kwds):
...         self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)

я думаю, что "категорическое" обсуждение здесь в опубликованной версии Поваренной книги Python.

97
ответ дан jfs 20 September 2014 в 13:45
поделиться
  • 1
    @nickie: Вы включали эти list() вызов в Ваших синхронизациях? It' s не нужный для любого кода Вы отправили, ни мой ответ. print() также вызов функции теперь, который имеет больше служебное, чем print оператор, и Python 3 также добавляет шаг кодирования (хотя в коде C) от unicode до байтов. – Martijn Pieters♦ 21 March 2014 в 11:12

Вот быстрая и злая шутка:

>>> ms = Warning()
>>> ms.foo = 123
>>> ms.bar = 'akafrit'

, Как делает это работы? Это просто снова использует встроенный класс Warning (полученный от Exception) и использует его, поскольку это были Вы собственный определенный класс.

положительные стороны - то, что Вы не должны импортировать или определить что-либо сначала, что "Предупреждение" является кратким названием, и что оно также ясно дает понять, что Вы делаете что-то грязное, которое не должно использоваться в другом месте, чем маленький ваш сценарий.

Между прочим, я пытался найти что-то еще более простым как ms = object(), но не мог (это продлиться, exemple не работает). Если Вы имеете один, мне интересно.

-1
ответ дан 22 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: