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-Type
headerfield,我们告诉服务器发送了什么样的数据。使用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#教程。