开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 客户端

C#TcpClient教程展示了如何在C#中使用TcpClient创建网络程序。C#教程是C#语言的综合教程。

C#客户端

TcpClient类提供了通过网络连接、发送和接收流数据的简单方法。

C#TcpClientHEAD请求

如果使用HTTPGET方法请求指定的资源,HTTPHEAD方法请求返回的标头。

using System.Text;
using System.Net.Sockets;

using var client = new TcpClient();

var hostname = "webcode.me";
client.Connect(hostname, 80);

using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;

var message = "HEAD / HTTP/1.1\r\nHost: webcode.me\r\nUser-Agent: C# program\r\n"
    + "Connection: close\r\nAccept: text/html\r\n\r\n";

Console.WriteLine(message);

using var reader = new StreamReader(networkStream, Encoding.UTF8);

byte[] bytes = Encoding.UTF8.GetBytes(message);
networkStream.Write(bytes, 0, bytes.Length);

Console.WriteLine(reader.ReadToEnd());

在示例中,我们向webcode.me发送了一个HEAD请求。请求是同步的。

using var client = new TcpClient();

创建了一个新的TcpClientusing关键字在变量超出范围时释放资源。

var hostname = "webcode.me";
client.Connect(hostname, 80);

使用Connect方法,我们使用指定的端口连接到站点。

using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;

我们得到一个NetworkStream并设置一个读取超时。

using var writer = new StreamWriter(networkStream);

StreamWriter被创建。用于向创建的网络流写入数据。

var message = "HEAD / HTTP/1.1\r\nHost: webcode.me\r\nUser-Agent: C# program\r\n" +
    "Connection: close\r\nAccept: text/html\r\n\r\n";

我们定义了一个HEAD请求。HEAD请求是通过HEAD命令发出的,后跟资源URL和HTTP协议版本。请注意,\r\n字符是语法的一部分。RFC7231文档中描述了详细信息。

using var reader = new StreamReader(networkStream, Encoding.UTF8);

我们创建一个StreamReader来读取响应。

byte[] bytes = Encoding.UTF8.GetBytes(message);
networkStream.Write(bytes, 0, bytes.Length);

使用GetBytes方法将文本命令转换为字节。使用Write方法将字节写入网络流。

Console.WriteLine(reader.ReadToEnd());

我们读取响应并将其写入控制台。

$ dotnet run
HEAD / HTTP/1.1
Host: webcode.me
User-Agent: C# program
Connection: close
Accept: text/html


HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 12 Jul 2022 18:49:44 GMT
Content-Type: text/html
Content-Length: 394
Last-Modified: Sun, 23 Jan 2022 10:39:25 GMT
Connection: close
ETag: "61ed305d-18a"
Accept-Ranges: bytes

C#TcpClientGET请求

HTTPGET方法请求指定资源的表示。

using System.Text;
using System.Net.Sockets;

using var client = new TcpClient();

var hostname = "webcode.me";
client.Connect(hostname, 80);

using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;

var message = @"GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: C# program
Connection: close
Host: webcode.me" + "\r\n\r\n";

Console.WriteLine(message);

using var reader = new StreamReader(networkStream, Encoding.UTF8);
byte[] bytes = Encoding.UTF8.GetBytes(message);

networkStream.Write(bytes, 0, bytes.Length);
Console.WriteLine(reader.ReadToEnd());

该示例检索指定网站的主页。

var message = @"GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: C# program
Connection: close
Host: webcode.me" + "\r\n\r\n";

我们定义一个GET请求。

$ dotnet run
GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: C# program
Connection: close
Host: webcode.me


HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 12 Jul 2022 19:29:46 GMT
Content-Type: text/html
Content-Length: 394
Last-Modified: Sun, 23 Jan 2022 10:39:25 GMT
Connection: close
ETag: "61ed305d-18a"
Access-Control-Allow-Origin: *
Accept-Ranges: bytes

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>

    <p>
         Hello there. How are you?
    </p>

</body>
</html>

TcpClientPOST请求

POST请求向服务器发送数据。使用Content-Typeheaderfield,我们告诉服务器发送了什么样的数据。使用application/x-www-form-urlencoded选项,数据在请求的主体中发送;键和值以“&”分隔的键值元组编码,键和值之间有一个“=”。这种类型不适合传输二进制数据,因为键和值中的非字母数字字符都是百分比编码的。

using System.Text;
using System.Net.Sockets;

using var client = new TcpClient();

var hostname = "httpbin.org";
client.Connect(hostname, 80);

using NetworkStream networkStream = client.GetStream();
networkStream.ReadTimeout = 2000;

var data = "name=John+Doe&occupation=gardener";
var n = data.Length;

var message = @$"POST /anything HTTP/1.1
Accept: */*
Accept-Language: en-US
User-Agent: C# program
Host: httpbin.org
Content-Type: application/x-www-form-urlencoded
Content-Length: {n}
Connection: close"
+ "\r\n\r\n" + data;

Console.WriteLine(message);

using var reader = new StreamReader(networkStream, Encoding.UTF8);
byte[] bytes = Encoding.UTF8.GetBytes(message);

networkStream.Write(bytes, 0, bytes.Length);

Console.WriteLine("---------------------");

Console.WriteLine(reader.ReadToEnd());

该示例发送一个POST请求。它在其正文中包含URL编码数据。

var data = "name=John+Doe&occupation=gardener";
var n = data.Length;

这是要发送的数据。我们还需要它的长度。

var message = @$"POST /anything HTTP/1.1
Accept: */*
Accept-Language: en-US
User-Agent: C# program
Host: httpbin.org
Content-Type: application/x-www-form-urlencoded
Content-Length: {n}
Connection: close"
+ "\r\n\r\n" + data;

我们构造一个POST请求。我们必须设置Content-TypeContent-Length标头字段。标头和数据必须用\r\n\r\n字符分隔。

$ dotnet run
POST /anything HTTP/1.1
Accept: */*
Accept-Language: en-US
User-Agent: C# program
Host: httpbin.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 33
Connection: close

name=John+Doe&occupation=gardener
---------------------
HTTP/1.1 200 OK
Date: Wed, 13 Jul 2022 09:54:51 GMT
Content-Type: application/json
Content-Length: 521
Connection: close
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "John Doe", 
    "occupation": "gardener"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Language": "en-US", 
    "Content-Length": "33", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "C# program", 
    "X-Amzn-Trace-Id": "Root=1-62ce966b-112441ca5298988e4cb6ebee"
  }, 
  "json": null, 
  "method": "POST", 
  "origin": "188.167.250.179", 
  "url": "http://httpbin.org/anything"
}

C#TcpClient异步请求

在下面的例子中,我们创建了一个异步请求。

using System.Net.Sockets;


string host = "webcode.me";
int port = 80;
int timeout = 5000;

using var client = new TcpClient();

await client.ConnectAsync(host, port);

using var netstream = client.GetStream();
using var writer = new StreamWriter(netstream);
using var reader = new StreamReader(netstream);

writer.AutoFlush = true;
netstream.ReadTimeout = timeout;

var message = @"GET / HTTP/1.1
Accept: text/html, charset=utf-8
Accept-Language: en-US
User-Agent: Console app
Connection: close
Host: webcode.me" + "\r\n\r\n";

await writer.WriteLineAsync(message);

string response = await reader.ReadToEndAsync();
Console.WriteLine($"Server: {response}");

该示例创建一个异步GET请求到webcode.me

await client.ConnectAsync(host, port);

我们异步连接到服务器。

await writer.WriteLineAsync(message);

我们使用WriteLineAsync异步写入网络流。

string response = await reader.ReadToEndAsync();

我们使用ReadToEndAsync异步读取网络流。

在本文中,我们使用了C#TcpClient。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# 客户端

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏