无题

IPAddress

示例:

1
IPAddress ip = IPAddress.Parse("118.102.111.11");

说明:

  • 127.0.0.1 表示本机地址(本地回环地址)

IPEndPoint

示例:

1
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("118.102.111.11"), 1900);

说明:

  • 封装 IP 地址和端口号,用于网络通信的目标地址

域名解析 (DNS)

获取主机名:

1
Dns.GetHostName(); // 得到本地主机名

获取域名对应的 IP 列表:

1
IPHostEntry ipEntry = Dns.GetHostEntry("www.360.com");

成员说明:

成员 描述
ipEntry.AddressList IP 地址数组
ipEntry.Aliases 主机的别名列表(CNAME 记录)
ipEntry.HostName DNS 主机名

异步获取 IP 地址

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private async void GetHostEntry()
{
Task<IPHostEntry> task = Dns.GetHostEntryAsync("www.e5note.top");
await task;
IPHostEntry ipEntry = task.Result;

foreach (IPAddress ip in ipEntry.AddressList)
{
print(ip); // 输出 IP 地址
}

foreach (string alias in ipEntry.Aliases)
{
print(alias); // 输出别名
}

print(ipEntry.HostName); // 输出正式主机名
}

字符编码

简要解释:

字符编码是人为定义的一种规则,用来将文字字符与数字(二进制)之间进行映射,以便计算机存储或传输文本。

常见编码方式:

  • ASCII(美国)
  • GB2312(中国)
  • Shift_JIS(日本)
  • Euc-kr(韩国)
  • Unicode(统一所有语言符号)
  • UTF-8、UTF-16、UTF-32(基于 Unicode 的实现方式)

UTF-8 和 Unicode 的关系

  • Unicode:是所有字符与唯一编号(码点)之间的对应集合。
  • UTF-8:是 Unicode 的一种具体实现方式,采用变长编码规则,使用 1~4 个字节表示一个字符。

二进制序列化

将基础类型转为字节数组:

1
2
byte[] bytes = BitConverter.GetBytes(1); // 非字符串类型转换为字节数组
byte[] bytes = Encoding.UTF8.GetBytes("hello world"); // 字符串转为字节数组

将类对象转为字节数组

示例类:

1
2
3
4
5
6
7
public class PlayerInfo
{
public int lev; // 4 字节
public string name; // 字符串长度 + 实际内容
public short atk; // 2 字节
public bool sex; // 1 字节
}

转换方法:

1
2
3
4
5
6
7
8
9
public byte[] ToBytes()
{
byte[] bytes = new byte[11 + name.Length];
BitConverter.GetBytes(lev).CopyTo(bytes, 0);
Encoding.UTF8.GetBytes(name).CopyTo(bytes, 4);
BitConverter.GetBytes(atk).CopyTo(bytes, 8 + name.Length);
BitConverter.GetBytes(sex).CopyTo(bytes, 11 + name.Length);
return bytes;
}

二进制反序列化

示例代码:

1
2
BitConverter.ToInt32(bytes, 0); // 从字节数组中提取整型
Encoding.UTF8.GetString(bytes); // 从字节数组中提取字符串

Socket 编程

创建 Socket 示例:

1
2
3
4
5
Socket socket = new Socket(
AddressFamily.InterNetwork, // IPv4 协议
SocketType.Stream, // 流式套接字
ProtocolType.Tcp // 使用 TCP 协议
);

常用操作:

1
2
3
4
5
6
7
socket.Bind(endPoint);                  // 绑定 IP 和端口
socket.Listen(1024); // 开始监听连接
socket.Shutdown(SocketShutdown.Both); // 禁用发送和接收功能
socket.Close(); // 关闭并释放资源

socket.Send(Encoding.UTF8.GetBytes(info)); // 发送消息
int bytesRead = socket.Receive(message); // 接收消息,返回实际读取的字节数