c#NetworkStream配置在tcp / ip上

问题描述 投票:1回答:1

我希望有人能告诉我为什么我在tcpListener / tcpClient代码中得到一个对象处理异常。

在acceptConnections和connectToServer方法中,我使用keepalive方法告诉我什么时候断开连接并且工作正常。

但是,如果我取消注释sendMsg方法的for循环,我将在服务器上获得ObjectDisposedException并在客户端上获得IOException。

SendMsg中的tcpClient.getStream()的NetworkStream似乎是个问题,但我不确定它为什么会得到一个被处理的流。我需要2个线程才能使用吗?

static void Main(string[] args)
{
    server.Listen();
    server.AcceptConnections();

    client.ConnectToServer();

    //for (int i = 0; i < 5; i++) {
    //    Thread.Sleep(3000);
    //    server.SendMsg("SENT MSG");
    //}

    Console.ReadLine();
}

public async void SendMsg(String message) {
        try {
            NetworkStream networkStream = tcpClient.GetStream();
            using (var writer = new StreamWriter(networkStream)) {
                await writer.WriteLineAsync(message);
                Console.WriteLine("msg sent");
            };
        } catch (Exception e) {
        }

    }

private async void KeepAlive(TcpClient tcpClient) {
        bool clientConnected = true;
        using (NetworkStream networkStream = tcpClient.GetStream())
        using (var reader = new StreamReader(networkStream))
        using (var writer = new StreamWriter(networkStream)) {
            writer.AutoFlush = true;
            char keepalive = '0';
            while (clientConnected) {
                try {
                    await writer.WriteLineAsync(keepalive);
                    string dataFromClient = await reader.ReadLineAsync();
                    Console.WriteLine("Server: " + dataFromClient);
                    Thread.Sleep(500);
                } catch (IOException e){

                } catch(ObjectDisposedException e) {
                    clientConnected = false;
                    clientsConnected--;
                } catch (Exception e){
                }
            }
        }
    }

编辑:也发布我的AcceptConnections方法

public async void AcceptConnections() {
        while (true) {
            while (clientsConnected <= maxConnections) {
                try {
                    tcpClient = await tcpListener.AcceptTcpClientAsync();
                    KeepAlive(tcpClient);
                } catch (Exception e) {
                    Console.WriteLine("TOP EXCEPTION :: " + e);
                }
                clientsConnected++;
                Console.WriteLine("SERVER Clients connected: " + clientsConnected);
            }
        }
    }
c# tcp tcplistener networkstream objectdisposedexception
1个回答
1
投票

你的SendMsg方法在using上使用StreamWriterStreamWriter的默认值是级联dispose,因此这将关闭NetworkStream。如果这不是你的意图,你需要将leaveOpen: true传递给constructor overload

坦率地说,没有理由在这里使用StreamWriter - 我建议直接处理StreamEncoding API。 StreamWriter的一个优点是内部可能会重新使用byte[]工作的缓冲区,但如果你在处理它之前只将它用于一个Write那么“优势”没有实际意义,并且可以通过缓冲池轻松实现。

© www.soinside.com 2019 - 2024. All rights reserved.