StreamWriter não irá liberar a NetworkStream
-
06-07-2019 - |
Pergunta
Usando um StreamWriter
para gravar em um NetworkStream
, e uma StreamReader
para ler a resposta. O aplicativo está enviando comandos e respostas de leitura para um servidor de notícias.
código simplificado (manipulação de erro sans, etc.):
tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);
networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
AutoFlush = true
};
// reads the server's response to the connect: "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
serverReader.ReadLine();
}
serverWriter.WriteLine("authinfo user username");
// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();
Os blocos de código em que a última linha, presumivelmente esperando que o fluxo de rede para enviar uma resposta.
posso evitar pendurar o aplicativo, definindo um loop de tempo limite usando serverReader.Peek()
, mas vou sempre tempo limite; Eu nunca obter uma resposta.
Se eu telnet para o servidor ea porta direta e digite os comandos, recebo uma resposta imediata.
Se eu chamar serverWriter.Flush()
explicitamente, em vez de usar a propriedade AutoFlush
, eu ainda bloquear e nunca obter uma resposta.
Todas as ideias por que eu não estou recebendo uma resposta para o servidor usando esta abordagem?
Obrigado!
Resolvido:
O código acima faz trabalho para mim, então eu fui para trás e construída sobre esse código para o código que não iria funcionar.
No código que trava, eu ainda estava usando o loop de tempo limite com serverReader.Peek (). Peek () sempre retorna-1, embora não haja dados na memória intermédia para ler !! Substituindo o loop Peek () com uma chamada de bloqueio para ReadLine () resolve o meu problema.
Eu coloquei o circuito de tempo limite em originalmente porque o aplicativo é multi-threaded, e eu não deseja bloquear. Vou ter que voltar a esta questão e ver como eu posso resolver o timing fio sem usar Peek ().
Obrigado a todos, boas respostas!
Solução 3
O código acima faz trabalho para mim, então eu fui para trás e construída sobre esse código para o código que não iria funcionar.
No código que trava, eu ainda estava usando o loop de tempo limite com serverReader.Peek (). Peek () sempre retorna-1, embora não haja dados na memória intermédia para ler !! Substituindo o loop Peek () com uma chamada de bloqueio para ReadLine () resolve o meu problema.
Eu coloquei o circuito de tempo limite em originalmente porque o aplicativo é multi-threaded, e eu não deseja bloquear. Vou ter que voltar a esta questão e ver como eu posso resolver o timing fio sem usar Peek ().
Obrigado a todos, boas respostas!
Outras dicas
Eu duvido que ele é o StreamWriter
esse é o problema ... mas há uma maneira simples de descobrir. Baixar WireShark e ver o que é realmente indo e vindo na rede. Essa é de longe a maneira mais simples de descobrir o que está acontecendo.
Tente "AUTHINFO usuário username \ r \ n". O RFC diz linhas de comando NNTP deve ser terminado por um CR-LF.