首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TcpClient已建立,但TcpClient.getStream()失败

TcpClient已建立,但TcpClient.getStream()失败
EN

Stack Overflow用户
提问于 2013-07-24 12:56:24
回答 2查看 3.5K关注 0票数 1

用于同步消息交换的客户端类:

代码语言:javascript
复制
public class AsClient
{
    private TcpClient connection;

    public AsClient(int serverPort, String ip)
    {
        connection = new TcpClient(ip, port);
    }

    public AsMessage sendMessage(AsMessage message)
    {
        System.Diagnostics.Debug.WriteLine("Connected: " + connection.Connected);
        NetworkStream ns = connection.GetStream();

        StreamReader reader = new StreamReader(ns);
        StreamWriter writer = new StreamWriter(ns);

        // Send Message:
        String msgToSendEncoded = message.encode();
        writer.WriteLine(msgToSendEncoded);
        writer.WriteLine("\n"); // each message is terminated by a paragraph
        writer.Flush();

        // Receive Message:
        String msgReceivedRaw = reader.ReadLine();
        AsMessage response = AsMessage.decode(msgReceivedRaw);

        reader.Dispose();
        writer.Dispose();

        ns.Close();

        return response;
    }
}

如果我调试这个应用程序,发送的第一条消息和接收到的响应都能很好地工作,但是只要我想发送第二条消息,TcpClient.getStream()就会在InvalidOperationException上失败,这说明连接不再建立了。

问题是我没有主动关闭任何地方的连接。如果我将connection.Connect(主机,端口)放在调用getStream()之前,它会失败,除非套接字仍然连接,即使connection.Connected是false。

有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 13:20:31

由于我有经验,处置,关闭底层流。

所以你关闭了处理程序上的连接。

票数 1
EN

Stack Overflow用户

发布于 2019-06-07 05:08:53

我在这段代码中遇到了同样的问题,它按照GetStream():https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.getstream?view=netframework-4.8的MS文档中的步骤进行复制。

代码语言:javascript
复制
    public void Send(String message)
    {
        try
        {
            // Translate the passed message into ASCII and store it as a Byte array.
            Byte[] data = Encoding.ASCII.GetBytes(message);

            // Get a client stream for reading and writing.
            NetworkStream stream = Client.GetStream();

            stream.Write(data, 0, data.Length);

             stream.Close(); // this also closses the connection the server!
        }
        catch (Exception e)
        {
            LogException(e);
        }

    }

我们在服务器端看到的是: 1)建立了连接。( 2)信息永远不会到达。3)当stream.Close()语句执行时,服务器报告客户端关闭了连接。检查流的属性,我可以看到流拥有套接字。所以,它必须关闭它也必须关闭它的插座。为什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17834693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档