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

时间:2018-10-08 14:53:47

标签: c# arrays tcpclient tcp-ip tcpserver

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

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]);

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

1 个答案:

答案 0 :(得分:1)

我注意到的第一个问题是,在服务器代码中,您使用整个缓冲区而不是指定实际收到的字节数来调用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 之前加上前缀,以便服务器知道何时接收到所有数据。您不能指望一切都可以合而为一。