Вы должны тщательно проверить полную трассировку,
У меня есть приложение для подключения к серверу и исправлено случай 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
.
Используйте названный кортежем , который был добавлен к эти модуль наборов в стандартной библиотеке в 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")
Можно также передать 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
dF: это довольно прохладно... Я не знал, что мог получить доступ к полям в классе с помощью dict.
Mark: ситуации, что мне жаль, что у меня не было этого, состоят точно в том, когда я хочу кортеж, но ничто столь же "тяжелое" как словарь.
можно получить доступ к полям класса с помощью словаря, потому что поля класса, его методов и всех его свойств хранятся внутренне с помощью dicts (по крайней мере, в CPython).
... Который приводит нас к Вашему второму комментарию. Полагать, что Python dicts "тяжел", чрезвычайно non-pythonistic понятие. И чтение таких комментариев уничтожает мою Дзэн Python. Это не хорошо.
Вы видите, когда Вы объявляете класс, Вы на самом деле создаете довольно сложную обертку вокруг словаря - так, во всяком случае, Вы добавляете больше служебное, чем при помощи простого словаря. Издержки, которые, между прочим, бессмысленно в любом случае. Если Вы работаете над важными приложениями производительности, используйте C или что-то.
Как насчет словаря?
Что-то вроде этого:
myStruct = {'field1': 'some val', 'field2': 'some val'}
Тогда можно использовать это для управления значениями:
print myStruct['field1']
myStruct['field2'] = 'some other values'
И значения не должны быть строки. Они могут быть в значительной степени любым другим объектом.
Можно использовать кортеж для большого количества вещей, где Вы использовали бы структуру в C (что-то как x, y координаты или RGB окрашивает, например).
Для всего остального можно использовать словарь или служебный класс как этот :
>>> class Bunch:
... def __init__(self, **kwds):
... self.__dict__.update(kwds)
...
>>> mystruct = Bunch(field1=value1, field2=value2)
я думаю, что "категорическое" обсуждение здесь в опубликованной версии Поваренной книги Python.
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 не работает). Если Вы имеете один, мне интересно.