如何在C#中将列表项转换为ASCII编码

时间:2017-04-13 13:04:39

标签: c# sockets server network-programming client

我使用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编码发送列表?

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

1 个答案:

答案 0 :(得分:0)

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

一般情况下,请尝试使用BinaryReaderBinaryWriter。他们有一个构造函数,要求Stream(从Tcp类中获取NetworkStream)和Encoding(您将使用Encoding.ASCII)。

  • BinaryWriter您使用Write(int)来写List<>的长度,然后使用Write(string)编写列表元素(在for中{1}} / foreach周期)。

  • BinaryReader支持你ReadInt32需要阅读的元素数量,然后在for周期中ReadString()

    < / LI>

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(以及如何发送/接收消息)