使用 TCP/IP 通信将随机生成的字节数组从客户端发送到服务器

Sending randomly generated byte array from client to the server using TCP/IP communication

我有一个数组,其中元素的数量是在 1-11 之间随机生成的,值也是从 0 到 254 之间随机生成的。 我想将这些值从客户端发送到服务器,并用 Console.WriteLine() 写出原始数组值。我已经尝试了好几天了,我尝试了很多选择,但我无法解决这个问题。我分享了我认为最接近的代码,但服务器发送了这样的错误: “输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非白色 space 字符” 之后我尝试将 ("-","+") 替换为 ("_","/") 但它没有用。 客户端程序为:

static void Main(string[] args)
{
    Random rnd = new Random();
    byte[] array = new byte[rnd.Next(1, 11)];
    for (int i = 0; i < array.Length; ++i)
    {
        array[i] = (byte)rnd.Next(255);
        Console.WriteLine(array[i]);
    }
    System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
    clientSocket.Connect("111.11.11.111", 8888);
    while (true)
    {
        NetworkStream serverStream = clientSocket.GetStream();
        string str = Convert.ToBase64String(array);
        byte[] outStream = System.Text.Encoding.UTF8.GetBytes(str);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();               
    }
}

服务器程序为:

IPAddress ipAd = IPAddress.Parse("111.11.11.111");
TcpListener serverSocket = new TcpListener(ipAd, 8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine("*****Server started*****");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Accepted connection from client");

while(true)
{
    try
    {
        NetworkStream networkStream = clientSocket.GetStream();
        byte[] bytesFrom = new byte[10025];
        if(networkStream.DataAvailable)
        {
            networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
            string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);      
            byte[] decByte = Convert.FromBase64String(dataFromClient);
            foreach (var item in decByte)
            {
                Console.WriteLine(item.ToString());
            }
            networkStream.Flush();                     
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

此代码在同一控制台应用程序中完美运行,但可能无法在客户端和服务器之间运行:

string str = Convert.ToBase64String(array);
Console.WriteLine(str);
byte[] decByte = Convert.FromBase64String(str);
Console.WriteLine(decByte[0]);

我可能把整个事情复杂化了,但最后我很困惑。如果我已经有了一个字节数组,还需要编码吗?有人可以告诉我最简单的方法或方法如何完成吗?提前感谢您的时间和帮助。

我注意到的第一个问题是,在您的服务器代码中,您使用整个缓冲区调用了 UTF8.GetString,而不是指定您实际收到的字节数。改变这个:

networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);

进入这个:

var receivedCount = networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom, 0, receivedCount);

您最终会 运行 遇到另一个问题,但是,因为消息有时会变得支离破碎,并且您的设计不包含任何用于指示是否已收到整个消息的方法。您需要在每条消息的末尾放置一个换行符,或者在消息前加上预期的总大小,或者 something 以便服务器知道所有数据何时被发送已收到。你不能指望所有东西都一件一件地到达。