【问题标题】:TcpClient can't properly send data via streamTcpClient 无法通过流正确发送数据
【发布时间】:2015-02-05 01:15:31
【问题描述】:

我想使用 TcpClient 发送 HTTP 请求。考虑以下代码:

        byte[] buf = new byte[1024];
        string header = "GET http://w3.org HTTP/1.1\r\n" +
                        "Host: localhost:2006\r\n" +
                        "Connection: keep-alive\r\n" +
                        "User-Agent: Mozilla/5.0\r\n" +
                        "\r\n";

        var client = new TcpClient();
        client.Connect("w3.org", 80);

        // send request
        var stream = client.GetStream();
        var streamReader = new StreamReader(stream);
        var streamWriter = new StreamWriter(stream);

        client.Client.Send(System.Text.Encoding.ASCII.GetBytes(header));
        //streamWriter.Write(header); - DOES NOT WORK
        stream.Flush();
        // get response

        var response1 = streamReader.ReadLine();

问题是,当我尝试使用客户端的 Send 方法发送数据时 - 一切正常。当我尝试通过网络流提供数据时 - 应用程序挂起并且没有引发异常。你能告诉我可能的问题吗?

【问题讨论】:

  • msdn 文档说你必须调用 connect 才能使 getstream 工作msdn.microsoft.com/en-us/library/…
  • 我已经编辑了源代码 - 尝试使用 connect 但仍然是相同的效果

标签: c# .net tcplistener


【解决方案1】:

StreamWriter 也有一个内部缓冲区,需要刷新:

byte[] buf = new byte[1024];
string header = "GET http://w3.org HTTP/1.1\r\n" +
                "Host: localhost:2006\r\n" +
                "Connection: keep-alive\r\n" +
                "User-Agent: Mozilla/5.0\r\n" +
                "\r\n";

var client = new TcpClient();
client.Connect("w3.org", 80);

// send request
var stream = client.GetStream();
var streamReader = new StreamReader(stream);
var streamWriter = new StreamWriter(stream);

streamWriter.Write(header);
streamWriter.Flush();
stream.Flush();

// get response
var response1 = streamReader.ReadLine();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2018-01-07
    • 1970-01-01
    相关资源
    最近更新 更多