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

C# 如何在C语言中将列表项转换为ASCII编码#,c#,sockets,server,network-programming,client,C#,Sockets,Server,Network Programming,Client,我开发的客户端和服务器聊天应用程序使用的套接字编程 我的问题是,如何将字符串项列表转换为ASCII编码。 有没有办法使用它 我的服务器端列表如下: public static List<string> NickNameList = new List<string>(); 最后,我尝试将列表发送回我保存在服务器昵称列表中的客户端 ASCIIEncoding asen = new ASCIIEncoding(); socket.Send(asen.GetB

我开发的客户端和服务器聊天应用程序使用的套接字编程

我的问题是,如何将字符串项列表转换为ASCII编码。 有没有办法使用它

我的服务器端列表如下:

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

最后,我尝试将列表发送回我保存在服务器昵称列表中的客户端

   ASCIIEncoding asen = new ASCIIEncoding();
   socket.Send(asen.GetBytes(listBox1.Items.ToString()));
但是我不知道如何得到一个没有转换成字符串的客户端列表。有没有办法用ASCII编码直接发送列表


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

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

通常,尝试使用
BinaryReader
BinaryWriter
。它们有一个构造函数,要求使用
(从Tcp类获得的
网络流
)和
编码(将使用
编码.ASCII

  • BinaryWriter
    侧使用
    Write(int)
    写入
    列表的长度,然后使用
    Write(string)
    写入列表的元素(在每个
    循环的
    中)

  • BinaryReader
    侧边
    ReadInt32
    需要读取多少元素,然后在
    for
    循环中
    ReadString()
    读取它们

Write(string)
/
ReadString()
有一个“诀窍”:他们在写的字符串的长度前加上前缀/预期要加上前缀的长度。这是因为在“纯”TCP连接中没有“消息”。您只有一个字节流,因此您无法知道字符串的长度,除非您说出它(或者除非您使用特定的值,如字节0,来指定字符串的结尾)。我们使用相同的“技巧”来指定
列表的长度:我们预先指定其长度

发送字符串列表的服务器和反转所有字符串并将其发送回的客户端的有趣示例

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));
        }
    }
}
publicstaticvoid服务器()
{
var lst=新列表{“Foo”、“Bar”、“Baz”};
int端口=15001;
var localAddr=IPAddress.Parse(“127.0.0.1”);
var listener=newtcplistener(localAddr,port);
尝试
{
listener.Start();
while(true)
{
var client=listener.AcceptTcpClient();
变量线程=新线程(()=>
{
使用(客户端)
使用(var ns=client.GetStream())
使用(var br=新的二进制读取器(ns,Encoding.ASCII,true))
使用(var bw=newbinarywriter(ns,Encoding.ASCII,true))
{
写入(第一次计数);
对于(int i=0;i

关于
NetworkStream
工作的有用问题:(以及如何发送/接收消息)

为什么十年前没有人从字典中删除“ASCII”一词?为什么?你甚至没有欧洲/美国的名字和姓氏。。。你应该讨厌ASCII字…所以你是说,我应该把孔列表转换成字节,然后从foreach/for循环(loop)中获取。是吗?@SunguRuvin否,
BinaryReader
/
Writer
将为您进行转换。他们直接接受
字符串
非常感谢
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));
        }
    }
}