好吧...如果你讨厌 ASCII,那么我会帮助你 :-)
一般情况下,尽量使用BinaryReader 和BinaryWriter。他们有一个构造函数,它要求一个Stream(你从 Tcp 类得到的NetworkStream)和一个Encoding(你将使用Encoding.ASCII)。
Write(string)/ReadString() 有一个“窍门”:它们将正在写入的字符串的长度预先添加/预期要添加的长度。这是因为在“纯”TCP 连接中没有“消息”。你只有一个字节流,所以你不知道一个字符串有多长,除非你说它(或者除非你使用一个特定的值,比如字节 0,来指定字符串的结尾)。我们使用相同的“技巧”来指定 List<> 的长度:我们将其长度添加到前面。
发送字符串列表的服务器的有趣示例,以及反转所有字符串并将它们发送回来的客户端。
public static void Server()
{
var lst = new List<string> { "Foo", "Bar", "Baz" };
int port = 15001;
var localAddr = IPAddress.Parse("127.0.0.1");
var listener = new TcpListener(localAddr, port);
try
{
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
var thread = new Thread(() =>
{
using (client)
using (var ns = client.GetStream())
using (var br = new BinaryReader(ns, Encoding.ASCII, true))
using (var bw = new BinaryWriter(ns, Encoding.ASCII, true))
{
bw.Write(lst.Count);
for (int i = 0; i < lst.Count; i++)
{
bw.Write(lst[i]);
}
var lst2 = new List<string>();
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
lst2.Add(br.ReadString());
}
foreach (string str in lst2)
{
Console.WriteLine("Server: {0}", str);
}
}
});
thread.Start();
}
}
finally
{
listener.Stop();
}
}
public static void Client()
{
Trace.WriteLine("Client");
int port = 15001;
using (var client = new TcpClient("127.0.0.1", port))
using (var ns = client.GetStream())
using (var br = new BinaryReader(ns, Encoding.ASCII, true))
using (var bw = new BinaryWriter(ns, Encoding.ASCII, true))
{
var lst = new List<string>();
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
lst.Add(br.ReadString());
}
foreach (string str in lst)
{
Console.WriteLine("Client: {0}", str);
}
bw.Write(lst.Count);
for (int i = 0; i < lst.Count; i++)
{
var chars = lst[i].ToCharArray();
Array.Reverse(chars);
bw.Write(new string(chars));
}
}
}
关于NetworkStream:https://stackoverflow.com/a/30499295/613130 工作的有用问题(以及如何发送/接收消息)