我有一个数组,其中元素的数目是在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]);
我可能会使整个事情复杂化,但是最后我很困惑。如果我已经有一个字节数组,我是否还需要编码?有人可以告诉我最简单的方法或方法吗?预先感谢您的时间和帮助。
答案 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 之前加上前缀,以便服务器知道何时接收到所有数据。您不能指望一切都可以合而为一。