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();
创建了一个新的TcpClient。using关键字在变量超出范围时释放资源。
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-Type和Content-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#教程。
