C# 使用TCP创建HTTP客户程序

04cd7c2576c2ef8257c35efc8a5d6cae.png

首先,创建一个控制台应用程序(包),向 Web 服务器发送一个 HTTP 请求。以前用 HttpClient 类实现了这个功能,但使用 TcpClient 类需要深入 HTTP 协议。

HttpClientUsingTcp 示例代码使用了以下名称空间:

System 
System.IO
System.Net.Sockets 
System.Text
System.Threading.Tasks

b466748e130fbd09ff41b603de0b7069.png

应用程序接受一个命令行参数,传递服务器的名称。这样,就调用RequestHtmlAsync 方法,向服务器发出 HTTP 请求。它用 Task 的 Result 属性返回一个字符串:

static void Main(string[] args)
{
  if (args.Length != 1)
  {
    ShowUsage();
  }
  Task<string> tl = RequestHtmlAsync(args[0]); 
  Console.WriteLine(t1.Result); 
  Console.ReadLine();
}


private static void ShowUsage()
{
  Console.WriteLine("Usage: HttpClientUsingTcp hostname");
}

221c205e3bb18bb44fcef4d86f9652f3.png

现在看看 RequestHtmlAsync 方法的最重要部分。首先,实例化一个 TcpClient 对象。其次,使用 ConnectAsync 方法,在 HTTP 默认端口 80 上建立到主机的TCP 连接。再次,通过 GetStream 方法检索一个流,使用这个连接进行读写:

private const int ReadBufferSize = 1024;
public static async Task<string> RequestHtmlAsync(string hostname)
{
  try
  {
    using (var client = new TcpClient())
    {
      await client.ConnectAsync(hostname, 80); 
      NetworkStream stream = client.GetStream();
      //...
    }
  }
}

2849937e23a867cb22f4f5cbb7b1238d.png

流现在可以用来把请求写到服务器,读取响应。HTTP 是一种基于文本的协议,所以很容易在字符串中定义请求。为了向服务器发出一个简单的请求,标题定义了 HTTP 方法 GET,其后是 URL/ 的路径和 HTTP 版本 HTTP/1.1。第二行定义了 Host 标题、主机名和端口号,第三行定义了 Connection 标题。通常,通过Connection 标题,客户端请求 keep-alive,要求服务器保持连接打开,因为客户端希望发出更多的请求。这里只向服务器发出一个请求,所以服务器应该关闭连接,从而 close 设置为 Connection 标题。为了结束标题信息,需要使用 \r\n 给请求添加一个空行。标题信息调用 NetworkStream 的方法 WriteAsync,用UTF-8 编码发送。\r\n 为了立即向服务器发送缓存,请调用 FlushAsync 方法。否则数据就可能保存在本地缓存:

//...
string header = "GET/HTTP/1.1\r\n" +
$"Host: {hostname}:80\r\n" +
"Connection: close\r\n" +
"\r\n";
byte[] buffer = Encoding.UTF8.GetBytes(header); 
await stream.WriteAsync(buffer, 0, buffer.Length); 
await stream.FlushAsync();

b32cad8ddbd9a03b214e1deb1c2a04a4.png

现在可以继续这个过程,从服务器中读取回应。不知道回应有多大,所以创建一个动态生长的 MemoryStream。使用 ReadAsync 方法把服务器的回应暂时写入一个字节数组,这个字节数组的内容添加到 MemoryStream 中。从服务器中读取所有数据后,StreamReader 接管控制,把数据从流读入一个字符串,并返回给调用者:

var ms = new MemoryStream();
buffer = new byte[ReadBufferSize]; 
int read = 0; 
do
{
  read = await stream.ReadAsync(buffer, 0, ReadBufferSize); 
  ms.Write(buffer, 0, read);
  Array.Clear(buffer, 0, buffer.Length);
  } while (read > 0);
  ms.Seek(0, SeekOrigin.Begin);
  var reader = new StreamReader(ms); 
  return reader.ReadToEnd();
}
//...

1

95366eff627ecb095e20892196165ecd.png

把一个网站传递给程序,会看到一个成功的请求,其 HTML 内容显示在控制台上。现在该创建一个 TCP 侦听器和自定义协议了。

c9818f4cbf5b62e4ce5bae0ff76353e1.png

6c242a1153b81f86237bc42e7ef20633.png

 微信公众号 

Dotnet

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# Modbus TCPTCP/IP协议上的Modbus通信)是一个用于工业自动化和控制系统之间的通信协议,它允许设备间通过网络进行数据交换,特别是监控和控制设备。在C#中编写Modbus TCP程序,通常会使用专门的库,如NModbus或Honeywell Modbus Master API等,这些库提供了对Modbus规约的封装,使得开发者能够更方便地实现对远程设备的数据请求和设置。 以下是一些基本步骤来创建C#的Modbus TCP程序: 1. **安装库**:首先,确保已安装支持Modbus TCPC#库。例如,如果你选择NModbus,你可以通过NuGet包管理器添加`NModbus3`包。 2. **连接设备**:创建一个TcpClient实例,连接到设备的IP地址和预定义的Modbus端口号(通常是502)。 ```csharp TcpClient client = new TcpClient("device_ip", 502); ``` 3. **创建协议对象**:使用从库中获取的协议实例,如`NModbus3.TcpMaster`或`NModbus3.TcpSlave`,初始化Modbus通信。 4. **发送请求**:对于客户端,可以使用`WriteRequest`方法发送读取(ReadHoldingRegisters, ReadInputRegisters)或写入(WriteSingleRegister, WriteMultipleRegisters)等请求。对于服务器,你需要监听并处理来自客户端的请求。 ```csharp using (ModbusMaster master = new ModbusMaster(client)) { // 发送请求 byte[] request = master.WriteSingleRegister(100, 123); // 设备地址和值 // 接收响应 byte[] response = master.ReadHoldingRegisters(100, 1); } ``` 5. **解析和处理数据**:读取的响应需要解析为有意义的数据结构,比如整数、字节等。 6. **错误处理**:确保检查Modbus的错误代码,处理可能发生的通信或协议错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值