Разница между socket.shutdownOutput () и outputStream.close () [duplicate]

Официальные документы python:

@classmethod

Метод класса получает класс как неявный первый аргумент, как и метод экземпляра экземпляр. Чтобы объявить метод класса, используйте эту идиому:

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ... 

Форма @classmethod является функцией decorator - см. Описание определений функций в Определения функций для деталей.

Он может быть вызван либо в классе (например, C.f()), либо в экземпляре (например, C().f()). Экземпляр игнорируется, за исключением его класса. Если метод класса вызывается для производного класса, объект производного класса передается как предполагаемый первый аргумент.

Методы класса отличаются от статических методов C ++ или Java. Если вы хотите их, см. staticmethod() в этом разделе.

blockquote>

@staticmethod

Статический метод не получает неявный первый аргумент. Чтобы объявить статический метод, используйте эту идиому:

class C:
    @staticmethod
    def f(arg1, arg2, ...): ... 

Форма @staticmethod является функцией decorator - см. Описание определений функций в Определения функций для деталей.

Его можно вызвать либо в классе (например, C.f()), либо в экземпляре (например, C().f()). Экземпляр игнорируется, за исключением его класса.

Статические методы в Python аналогичны тем, которые были найдены в Java или C ++. Для более продвинутой концепции см. classmethod() в этом разделе.

blockquote>

20
задан om-nom-nom 7 March 2013 в 15:42
поделиться

3 ответа

Вы должны закрыть самый внешний выходной поток, который вы создали из сокета. Это закроет его. Закрытие сокета или входного потока не делает этого, поэтому оно недостаточно. Закрыв этот выходной поток, вам не нужно ничего делать.

10
ответ дан user207421 25 August 2018 в 07:39
поделиться

Это скорее комментарий, чем хороший ответ: (я бы предпочел добавить комментарий к одному из ответов выше, но у меня нет ответа)

Вопрос, как я его читал, «Я могу закрыть поток в сокете, а затем открыть поток в том же сокете?» ... но люди, кажется, отвечают на это: «Как я должен чисто закрыть мой сокет?» ... это не вопрос

Ответ на заданный вопрос - «нет». Когда вы закрываете поток, вы закрываете сокет.

(я понимаю, почему, по крайней мере в одном случае, кто-то может задать этот вопрос. Когда вы передаете Java-свойства через сокет, принимающая сторона должна см. EOF для распознавания конца свойств - чтобы получатель увидел EOF, отправитель должен закрыть поток / сокет. НО, если у вас есть протокол команд / ответов, работающий над этим сокетом, вы НЕ хотите его закрывать или вы потеряете канал, на который хотите отправить ответ. См. Свойства потоковой передачи Java поверх Socket для одного способа обработки этого сообщения)

1
ответ дан Community 25 August 2018 в 07:39
поделиться

Из документации java api для Socket :

public void close () throws IOException Закрывает этот сокет. Любой поток, который в настоящий момент заблокирован в операции ввода-вывода в этом сокете, будет генерировать исключение SocketException.

Как только сокет был закрыт, он недоступен для дальнейшего использования в сети (т. Е. Не может быть повторно подключен или отскок) , Необходимо создать новый сокет.

Закрытие этого сокета также закроет InputStream и OutputStream сокета.

Если этот сокет имеет связанный канал, тогда канал также закрыт.

Закрытие InputStream сокета приведет к закрытию Socket. То же самое касается закрытия OutputStream сокета.

Из документации java api для Socket # getInputStream ()

Закрытие возвращаемого InputStream закроет связанный сокет.

Проверьте документацию по API, это по какой-то причине.

17
ответ дан Jes 25 August 2018 в 07:39
поделиться
Другие вопросы по тегам:

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