【问题标题】:How to convert list items to ASCII Encodings in C#如何在 C# 中将列表项转换为 ASCII 编码
【发布时间】:2017-09-09 15:04:12
【问题描述】:

我是使用 Socket 编程开发的客户端和服务器聊天应用程序...

我的问题是,如何将字符串项目列表转换为 ASCII 编码。 有什么方法可以使用吗?

我的服务器端列表是这样的:

  public static List<string> NickNameList = new List<string>();

在这里,我将客户的昵称添加到列表中。

                Socket socket = socketClient as Socket;
                byte[] bs = new byte[1024];
                int ks = socket.Receive(bs);

                string RecievedSocket = Encoding.ASCII.GetString(bs, 0, ks);

                NickNameList.Add(RecievedSocket);

最后,我尝试将列表发回给我保存在服务器的 NickNameList 中的客户端。

   ASCIIEncoding asen = new ASCIIEncoding();
   socket.Send(asen.GetBytes(listBox1.Items.ToString()));

但我不知道如何获取未转换为字符串的客户端列表。有没有办法直接用 ASCII 编码发送列表?

如果您对此有所了解,请告诉我...

【问题讨论】:

  • 为什么十年前没有人从字典中删除“ASCII”这个词?为什么?你甚至没有欧洲/美国的名字和姓氏......你应该讨厌 ASCII 字......

标签: c# sockets server network-programming client


【解决方案1】:

好吧...如果你讨厌 ASCII,那么我会帮助你 :-)

一般情况下,尽量使用BinaryReaderBinaryWriter。他们有一个构造函数,它要求一个Stream(你从 Tcp 类得到的NetworkStream)和一个Encoding(你将使用Encoding.ASCII)。

  • BinaryWriter一边你用Write(int)List&lt;&gt;的长度,然后你用Write(string)写列表的元素(在for/foreach循环中) .

  • BinaryReader 在你身边 ReadInt32 你需要阅读多少元素,然后在 for 循环中你 ReadString() 他们。

Write(string)/ReadString() 有一个“窍门”:它们将正在写入的字符串的长度预先添加/预期要添加的长度。这是因为在“纯”TCP 连接中没有“消息”。你只有一个字节流,所以你不知道一个字符串有多长,除非你说它(或者除非你使用一个特定的值,比如字节 0,来指定字符串的结尾)。我们使用相同的“技巧”来指定 List&lt;&gt; 的长度:我们将其长度添加到前面。

发送字符串列表的服务器的有趣示例,以及反转所有字符串并将它们发送回来的客户端。

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 工作的有用问题(以及如何发送/接收消息)

【讨论】:

  • 所以你是说,我应该将洞列表转换为字节,然后从 foreach /for cycle(loop) 获取。是吗?
  • @SunguRuvin 不,BinaryReader/Writer 将为您进行转换。他们直接接受string
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多